# install.packages("quantreg") # uncomment if needed
library(quantreg)
library(ggplot2)
library(dplyr)
library(dplyr)
udaje_nove <- read.csv2("udaje/company_data.csv",header=TRUE,sep=",",dec=".")
model <- lm(Profit ~ Price + Order.Qty + Unit.Cost, data = udaje_nove)
summary(model)
##
## Call:
## lm(formula = Profit ~ Price + Order.Qty + Unit.Cost, data = udaje_nove)
##
## Residuals:
## Min 1Q Median 3Q Max
## -17243 -365 -100 -23 42237
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -28.49945 20.64798 -1.38 0.168
## Price 11.62553 0.06444 180.40 <2e-16 ***
## Order.Qty 9.48104 0.33894 27.97 <2e-16 ***
## Unit.Cost -11.82672 0.13620 -86.83 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1799 on 14996 degrees of freedom
## Multiple R-squared: 0.7179, Adjusted R-squared: 0.7178
## F-statistic: 1.272e+04 on 3 and 14996 DF, p-value: < 2.2e-16
ggplot(udaje_nove, aes(x = Price , y = Profit)) +
geom_point(alpha = 0.6) +
labs(
title = "Údaje pre kvantilovú regresiu",
x = "Vysvetľujúca premenná Price",
y = "Vysvetľovaná premenná Profit"
) +
theme_minimal()
We first estimate the standard OLS model, and then quantile regressions for:
m_ols <- lm(Profit ~ Price + Order.Qty + Unit.Cost, data = udaje_nove)
m_q25 <- rq(Profit ~ Price + Order.Qty + Unit.Cost, tau = 0.25, data = udaje_nove)
m_q50 <- rq(Profit ~ Price + Order.Qty + Unit.Cost, tau = 0.50, data = udaje_nove)
m_q75 <- rq(Profit ~ Price + Order.Qty + Unit.Cost, tau = 0.75, data = udaje_nove)
summary(m_ols)
##
## Call:
## lm(formula = Profit ~ Price + Order.Qty + Unit.Cost, data = udaje_nove)
##
## Residuals:
## Min 1Q Median 3Q Max
## -17243 -365 -100 -23 42237
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -28.49945 20.64798 -1.38 0.168
## Price 11.62553 0.06444 180.40 <2e-16 ***
## Order.Qty 9.48104 0.33894 27.97 <2e-16 ***
## Unit.Cost -11.82672 0.13620 -86.83 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1799 on 14996 degrees of freedom
## Multiple R-squared: 0.7179, Adjusted R-squared: 0.7178
## F-statistic: 1.272e+04 on 3 and 14996 DF, p-value: < 2.2e-16
summary(m_q25)
##
## Call: rq(formula = Profit ~ Price + Order.Qty + Unit.Cost, tau = 0.25,
## data = udaje_nove)
##
## tau: [1] 0.25
##
## Coefficients:
## Value Std. Error t value Pr(>|t|)
## (Intercept) -48.87458 3.94586 -12.38630 0.00000
## Price 9.01631 0.02172 415.09917 0.00000
## Order.Qty 3.35760 0.32722 10.26104 0.00000
## Unit.Cost -9.08556 0.03790 -239.73701 0.00000
summary(m_q50)
##
## Call: rq(formula = Profit ~ Price + Order.Qty + Unit.Cost, tau = 0.5,
## data = udaje_nove)
##
## tau: [1] 0.5
##
## Coefficients:
## Value Std. Error t value Pr(>|t|)
## (Intercept) -96.25708 18.26705 -5.26944 0.00000
## Price 10.00000 0.00630 1588.13054 0.00000
## Order.Qty 9.62571 1.31475 7.32132 0.00000
## Unit.Cost -10.00000 0.01238 -807.62608 0.00000
summary(m_q75)
##
## Call: rq(formula = Profit ~ Price + Order.Qty + Unit.Cost, tau = 0.75,
## data = udaje_nove)
##
## tau: [1] 0.75
##
## Coefficients:
## Value Std. Error t value Pr(>|t|)
## (Intercept) -312.19967 46.36092 -6.73411 0.00000
## Price 11.95699 0.02614 457.34544 0.00000
## Order.Qty 30.98420 4.80315 6.45081 0.00000
## Unit.Cost -12.13854 0.03676 -330.22797 0.00000
coef_table <- rbind(
OLS = coef(m_ols),
Q25 = coef(m_q25),
Q50 = coef(m_q50),
Q75 = coef(m_q75)
)
coef_table
## (Intercept) Price Order.Qty Unit.Cost
## OLS -28.49945 11.625531 9.481036 -11.826720
## Q25 -48.87458 9.016313 3.357595 -9.085561
## Q50 -96.25708 10.000000 9.625708 -10.000000
## Q75 -312.19967 11.956993 30.984198 -12.138542
Z tabuľky porovnania koeficientov vyplýva, že vplyv vysvetľujúcich premenných na zisk je heterogénny, teda nie je rovnomerný naprieč celým rozdelením firiem:
Koeficient pri cene sa pohybuje od 9.02 až po 11.96. Keďže je sklon v Q75 výrazne vyšší ako v Q25, znamená to, že rast ceny má silnejší pozitívny vplyv na zisk u firiem, ktoré už dosahujú vyššie zisky, než u firiem v dolnej časti rozdelenia.
Pri tejto premennej vidíme najväčšie rozdiely – v 25. percentile je koeficient 3.36, zatiaľ čo v 75. percentile až 30.98. To naznačuje, že objem objednávok je kritickým faktorom najmä pre najúspešnejšie firmy. Pre vysoko ziskové firmy je zvýšenie objemu objednávok spojené s oveľa prudším nárastom zisku, než je tomu u firiem s nízkym ziskom.
Vplyv nákladov sa javí ako relatívne stabilnejší (od okolo -9 až -12), čo naznačuje, že rast jednotkových nákladov znižuje zisk podobným spôsobom naprieč celým rozdelením firiem.
Keďže sa sklony koeficientov (najmä pri Price a Order.Qty) výrazne líšia v rámci kvantilov, môžeme konštatovať, že vplyv týchto premenných na zisk nie je v našom súbore dát rovnomerný.
ggplot(udaje_nove, aes(x = Price, y = Profit)) +
geom_point(alpha = 0.5) +
geom_abline(
intercept = coef(m_ols)[1],
slope = coef(m_ols)[2],
linewidth = 1
) +
geom_abline(
intercept = coef(m_q25)[1],
slope = coef(m_q25)[2],
linetype = "dashed",
color = "blue",
linewidth = 1
) +
geom_abline(
intercept = coef(m_q50)[1],
slope = coef(m_q50)[2],
linetype = "dotdash",
color = "green",
linewidth = 1
) +
geom_abline(
intercept = coef(m_q75)[1],
slope = coef(m_q75)[2],
linetype = "longdash",
color = "red",
linewidth = 1
) +
labs(
title = "Vyrovnané priamky OLS a kvanilových regresií",
subtitle = "čierna = OLS, Modrá, zelená, červená - Q25,Q50, Q75",
x = "Price",
y = "Profit"
) +
theme_minimal()
Veľmi často chceme odhadnúť celú sadu kvantilov. Napríklad od 10. do 90. percentilu.
taus <- seq(0.1, 0.9, by = 0.1)
m_many <- rq(Profit ~ Price + Order.Qty + Unit.Cost, tau = taus, data = udaje_nove)
summary(m_many)
##
## Call: rq(formula = Profit ~ Price + Order.Qty + Unit.Cost, tau = taus,
## data = udaje_nove)
##
## tau: [1] 0.1
##
## Coefficients:
## Value Std. Error t value Pr(>|t|)
## (Intercept) -82.95016 7.88303 -10.52262 0.00000
## Price 7.56874 0.11958 63.29582 0.00000
## Order.Qty 1.61765 0.46935 3.44655 0.00057
## Unit.Cost -7.71536 0.15083 -51.15194 0.00000
##
## Call: rq(formula = Profit ~ Price + Order.Qty + Unit.Cost, tau = taus,
## data = udaje_nove)
##
## tau: [1] 0.2
##
## Coefficients:
## Value Std. Error t value Pr(>|t|)
## (Intercept) -54.02006 4.55407 -11.86192 0.00000
## Price 8.90016 0.02981 298.55259 0.00000
## Order.Qty 2.95223 0.30754 9.59959 0.00000
## Unit.Cost -9.01963 0.04684 -192.56527 0.00000
##
## Call: rq(formula = Profit ~ Price + Order.Qty + Unit.Cost, tau = taus,
## data = udaje_nove)
##
## tau: [1] 0.3
##
## Coefficients:
## Value Std. Error t value Pr(>|t|)
## (Intercept) -62.13462 4.45695 -13.94107 0.00000
## Price 10.01751 0.11196 89.47100 0.00000
## Order.Qty 4.08802 0.46564 8.77930 0.00000
## Unit.Cost -10.10877 0.12175 -83.02856 0.00000
##
## Call: rq(formula = Profit ~ Price + Order.Qty + Unit.Cost, tau = taus,
## data = udaje_nove)
##
## tau: [1] 0.4
##
## Coefficients:
## Value Std. Error t value Pr(>|t|)
## (Intercept) -71.58454 4.75967 -15.03982 0.00000
## Price 10.00000 0.00089 11220.87466 0.00000
## Order.Qty 7.15845 0.53632 13.34746 0.00000
## Unit.Cost -10.00000 0.00118 -8448.14170 0.00000
##
## Call: rq(formula = Profit ~ Price + Order.Qty + Unit.Cost, tau = taus,
## data = udaje_nove)
##
## tau: [1] 0.5
##
## Coefficients:
## Value Std. Error t value Pr(>|t|)
## (Intercept) -96.25708 18.26705 -5.26944 0.00000
## Price 10.00000 0.00630 1588.13054 0.00000
## Order.Qty 9.62571 1.31475 7.32132 0.00000
## Unit.Cost -10.00000 0.01238 -807.62608 0.00000
##
## Call: rq(formula = Profit ~ Price + Order.Qty + Unit.Cost, tau = taus,
## data = udaje_nove)
##
## tau: [1] 0.6
##
## Coefficients:
## Value Std. Error t value Pr(>|t|)
## (Intercept) -167.09716 14.54193 -11.49071 0.00000
## Price 11.55586 0.17588 65.70254 0.00000
## Order.Qty 15.01549 1.29401 11.60388 0.00000
## Unit.Cost -11.74741 0.20368 -57.67647 0.00000
##
## Call: rq(formula = Profit ~ Price + Order.Qty + Unit.Cost, tau = taus,
## data = udaje_nove)
##
## tau: [1] 0.7
##
## Coefficients:
## Value Std. Error t value Pr(>|t|)
## (Intercept) -249.60291 18.26566 -13.66515 0.00000
## Price 11.86628 0.02304 514.92345 0.00000
## Order.Qty 23.76105 1.97852 12.00950 0.00000
## Unit.Cost -12.04077 0.03030 -397.36042 0.00000
##
## Call: rq(formula = Profit ~ Price + Order.Qty + Unit.Cost, tau = taus,
## data = udaje_nove)
##
## tau: [1] 0.8
##
## Coefficients:
## Value Std. Error t value Pr(>|t|)
## (Intercept) -424.16471 61.22659 -6.92779 0.00000
## Price 12.19096 0.06425 189.73953 0.00000
## Order.Qty 45.46019 6.81236 6.67320 0.00000
## Unit.Cost -12.48296 0.07642 -163.33650 0.00000
##
## Call: rq(formula = Profit ~ Price + Order.Qty + Unit.Cost, tau = taus,
## data = udaje_nove)
##
## tau: [1] 0.9
##
## Coefficients:
## Value Std. Error t value Pr(>|t|)
## (Intercept) -548.60343 42.61068 -12.87479 0.00000
## Price 16.24586 0.34917 46.52702 0.00000
## Order.Qty 75.13727 4.08530 18.39209 0.00000
## Unit.Cost -17.25979 0.36002 -47.94093 0.00000
coef_many <- data.frame(
tau = taus,
intercept = coef(m_many)["(Intercept)", ],
slope = coef(m_many)["Price", ]
)
ggplot(coef_many, aes(x = tau, y = slope)) +
geom_line(color = "darkblue", linewidth = 1) +
geom_point(size = 2, color = "darkblue") +
geom_hline(yintercept = coef(m_ols)["Price"], linetype = "dashed", color = "red") +
labs(
title = "Sklon koeficientu pre Price naprieč kvantilmi",
x = "Kvantil (tau)",
y = "Hodnota koeficientu Price"
) +
theme_minimal()
Z grafu vývoja koeficientu Price naprieč kvantilmi je zrejmé, že vplyv ceny na zisk nie je konštantný. S rastúcou ziskovosťou firmy (rastúci kvantil \(\tau\)) sa hodnota koeficientu Price zvyšuje, čo znamená, že firmy s vyšším ziskom sú citlivejšie na zmeny cien, než predpokladá priemerný OLS odhad.
Ak chcete, môžete kvantilovú regresiu demonštrovať aj na reálnom
súbore údajov. Balík quantreg obsahuje súbor údajov
engel o výdavkoch a príjmoch na potraviny.
data(engel, package = "quantreg")
head(engel)
## income foodexp
## 1 420.1577 255.8394
## 2 541.4117 310.9587
## 3 901.1575 485.6800
## 4 639.0802 402.9974
## 5 750.8756 495.5608
## 6 945.7989 633.7978
m_engel_ols <- lm(foodexp ~ income, data = engel)
m_engel_q25 <- rq(foodexp ~ income, tau = 0.25, data = engel)
m_engel_q50 <- rq(foodexp ~ income, tau = 0.50, data = engel)
m_engel_q75 <- rq(foodexp ~ income, tau = 0.75, data = engel)
rbind(
OLS = coef(m_engel_ols),
Q25 = coef(m_engel_q25),
Q50 = coef(m_engel_q50),
Q75 = coef(m_engel_q75)
)
## (Intercept) income
## OLS 147.47539 0.4851784
## Q25 95.48354 0.4741032
## Q50 81.48225 0.5601806
## Q75 62.39659 0.6440141
Kvantilová regresia potvrdila, že vplyv príjmu na výdavky na potraviny nie je konštantný, keďže koeficient príjmu rastie od hodnoty 0,47 v 25. percentile až po 0,64 v 75. percentile. Tento rastúci trend ukazuje, že domácnosti s vyššími výdavkami reagujú na nárast príjmu citeľne citlivejšie než domácnosti v dolnej časti rozdelenia.