# 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

Scatterplot údajov

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()

6. Odhad OLS a kvantilovej regresie

We first estimate the standard OLS model, and then quantile regressions for:

  • \(\tau = 0.10\)
  • \(\tau = 0.50\)
  • \(\tau = 0.90\)
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)

výsledky OLS

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

výsledky kvantilovej regresie

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

7. Porovnanie odhadnutých koeficientov

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

Interpretácia

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:

Premenná Price

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.

Premenná Order.Qty

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.

Premenná Unit.Cost

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.

Záver

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ý.

8. Grafické porovnanie regresných priamok

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()

9. Odhadovanie viacerých kvantilov naraz

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

Graf koeficientov sklonu naprieč kvantilmi

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.

14. Voliteľný empirický príklad so vstavaným súborom údajov

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.