Cieľom tejto práce je porovnať výsledky klasickej lineárnej regresie odhadovanej metódou OLS s výsledkami kvantilovej regresie na vlastných údajoch.
V práci používame dáta zo zápasov basketbalovej súťaže EuroLeague. Každé pozorovanie predstavuje jeden zápas. V datasete sa nachádzajú informácie o tímoch, dátume zápasu, počte bodov domácich a hostí, ako aj o bodoch v jednotlivých častiach zápasu.
Hlavná výskumná otázka je:
Ako počet bodov v prvom polčase súvisí s počtom bodov v druhom polčase a líši sa tento vzťah pri zápasoch s nízkym, stredným a vysokým počtom bodov v druhom polčase?
Na túto otázku použijeme dva prístupy:
Budeme odhadovať kvantilové regresie pre:
Dataset načítame zo súboru
euroleague_dset_csv_03_19.csv.
data_raw <- read_csv("cviko_8/euroleague_dset_csv_03_19.csv")
head(data_raw)
## # A tibble: 6 × 21
## DATE HT AT HS AS Q1H Q1A Q2H Q2A Q3H Q3A Q4H Q4A
## <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 19.05… Anad… CSKA… 83 91 20 29 22 15 20 24 21 23
## 2 19.05… Fene… Real… 5 94 16 24 24 14 23 31 12 25
## 3 17.05… CSKA… Real… 95 90 18 22 25 23 22 28 30 17
## 4 17.05… Fene… Anad… 73 92 20 19 20 26 17 23 16 24
## 5 01.05… Anad… Barc… 80 71 23 28 24 14 14 15 19 14
## 6 26.04… Barc… Anad… 82 72 15 22 21 16 27 12 19 22
## # ℹ 8 more variables: P1H <dbl>, P1A <dbl>, P2H <dbl>, P2A <dbl>, P1T <dbl>,
## # P2T <dbl>, HTT <dbl>, FTT <dbl>
glimpse(data_raw)
## Rows: 3,715
## Columns: 21
## $ DATE <chr> "19.05.2019", "19.05.2019", "17.05.2019", "17.05.2019", "01.05.20…
## $ HT <chr> "Anadolu Efes SK", "Fenerbahce Ulker", "CSKA Moscow", "Fenerbahce…
## $ AT <chr> "CSKA Moscow", "Real Madrid", "Real Madrid", "Anadolu Efes SK", "…
## $ HS <dbl> 83, 5, 95, 73, 80, 82, 83, 82, 68, 77, 82, 57, 78, 72, 80, 68, 75…
## $ AS <dbl> 91, 94, 90, 92, 71, 72, 92, 99, 102, 84, 89, 66, 63, 74, 82, 78, …
## $ Q1H <dbl> 20, 16, 18, 20, 23, 15, 22, 16, 20, 18, 18, 19, 21, 16, 21, 18, 2…
## $ Q1A <dbl> 29, 24, 22, 19, 28, 22, 20, 30, 26, 28, 23, 15, 8, 19, 20, 27, 17…
## $ Q2H <dbl> 22, 24, 25, 20, 24, 21, 26, 25, 19, 21, 23, 15, 14, 18, 18, 19, 2…
## $ Q2A <dbl> 15, 14, 23, 26, 14, 16, 19, 19, 26, 18, 13, 16, 18, 19, 26, 15, 1…
## $ Q3H <dbl> 20, 23, 22, 17, 14, 27, 23, 20, 18, 20, 17, 12, 26, 25, 19, 15, 1…
## $ Q3A <dbl> 24, 31, 28, 23, 15, 12, 29, 23, 32, 16, 22, 18, 15, 24, 27, 24, 1…
## $ Q4H <dbl> 21, 12, 30, 16, 19, 19, 12, 21, 11, 18, 24, 11, 17, 13, 22, 16, 1…
## $ Q4A <dbl> 23, 25, 17, 24, 14, 22, 24, 27, 18, 22, 31, 17, 22, 12, 9, 12, 20…
## $ P1H <dbl> 42, 40, 43, 40, 47, 36, 48, 41, 39, 39, 41, 34, 35, 34, 39, 37, 4…
## $ P1A <dbl> 44, 38, 45, 45, 42, 38, 39, 49, 52, 46, 36, 31, 26, 38, 46, 42, 3…
## $ P2H <dbl> 41, 35, 52, 33, 33, 46, 35, 41, 29, 38, 41, 23, 43, 38, 41, 31, 3…
## $ P2A <dbl> 47, 56, 45, 47, 29, 34, 53, 50, 50, 38, 53, 35, 37, 36, 36, 36, 3…
## $ P1T <dbl> 86, 78, 88, 85, 89, 74, 87, 90, 91, 85, 77, 65, 61, 72, 85, 79, 7…
## $ P2T <dbl> 88, 91, 97, 80, 62, 80, 88, 91, 79, 76, 94, 58, 80, 74, 77, 67, 6…
## $ HTT <dbl> 86, 78, 88, 85, 89, 74, 87, 90, 91, 85, 77, 65, 61, 72, 85, 79, 7…
## $ FTT <dbl> 174, 169, 185, 165, 151, 154, 175, 181, 170, 161, 171, 123, 141, …
V pôvodnom datasete používame najmä tieto premenné:
DATE — dátum zápasu,HT — domáci tím,AT — hosťujúci tím,P1T — celkový počet bodov v prvom polčase,P2T — celkový počet bodov v druhom polčase,P1H — body domáceho tímu v prvom polčase,P1A — body hosťujúceho tímu v prvom polčase,FTT — celkový počet bodov v zápase.Ako závislú premennú používame P2T, teda počet bodov v
druhom polčase. Táto voľba je vhodná preto, že nás zaujíma, či vývoj v
prvom polčase súvisí s následným skórovaním v druhom polčase.
Vytvoríme pracovný dataset, v ktorom upravíme dátum, vytvoríme rok zápasu a premennú vyjadrujúcu absolútny rozdiel v skóre po prvom polčase.
data_model <- data_raw %>%
mutate(
DATE = as.Date(DATE, format = "%d.%m.%Y"),
year = as.numeric(format(DATE, "%Y")),
year_c = year - min(year, na.rm = TRUE),
first_half_points = P1T,
second_half_points = P2T,
halftime_margin = P1H - P1A,
abs_halftime_margin = abs(halftime_margin),
total_points = FTT
) %>%
filter(
!is.na(DATE),
first_half_points > 0,
second_half_points > 0
)
head(data_model)
## # A tibble: 6 × 28
## DATE HT AT HS AS Q1H Q1A Q2H Q2A Q3H Q3A Q4H
## <date> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2019-05-19 Anadol… CSKA… 83 91 20 29 22 15 20 24 21
## 2 2019-05-19 Fenerb… Real… 5 94 16 24 24 14 23 31 12
## 3 2019-05-17 CSKA M… Real… 95 90 18 22 25 23 22 28 30
## 4 2019-05-17 Fenerb… Anad… 73 92 20 19 20 26 17 23 16
## 5 2019-05-01 Anadol… Barc… 80 71 23 28 24 14 14 15 19
## 6 2019-04-26 Barcel… Anad… 82 72 15 22 21 16 27 12 19
## # ℹ 16 more variables: Q4A <dbl>, P1H <dbl>, P1A <dbl>, P2H <dbl>, P2A <dbl>,
## # P1T <dbl>, P2T <dbl>, HTT <dbl>, FTT <dbl>, year <dbl>, year_c <dbl>,
## # first_half_points <dbl>, second_half_points <dbl>, halftime_margin <dbl>,
## # abs_halftime_margin <dbl>, total_points <dbl>
data_model %>%
summarise(
pocet_zapasov = n(),
priemer_1_polcas = mean(first_half_points),
median_1_polcas = median(first_half_points),
priemer_2_polcas = mean(second_half_points),
median_2_polcas = median(second_half_points),
priemer_rozdiel_polcas = mean(abs_halftime_margin),
median_rozdiel_polcas = median(abs_halftime_margin)
) %>%
kable(digits = 2, caption = "Základné opisné štatistiky použitých premenných")
| pocet_zapasov | priemer_1_polcas | median_1_polcas | priemer_2_polcas | median_2_polcas | priemer_rozdiel_polcas | median_rozdiel_polcas |
|---|---|---|---|---|---|---|
| 3713 | 76.46 | 76 | 76.56 | 76 | 7.85 | 7 |
Najprv zobrazíme vzťah medzi počtom bodov v prvom a druhom polčase.
ggplot(data_model, aes(x = first_half_points, y = second_half_points)) +
geom_point(alpha = 0.4) +
geom_smooth(method = "lm", se = FALSE) +
labs(
title = "Vzťah medzi bodmi v prvom a druhom polčase",
x = "Počet bodov v prvom polčase",
y = "Počet bodov v druhom polčase"
) +
theme_minimal()
Základný OLS model má tvar:
\[ P2T_i = \beta_0 + \beta_1 P1T_i + \beta_2 AbsMargin_i + \beta_3 Year_i + u_i, \]
kde:
Pri OLS regresii odhadujeme podmienený priemer:
\[ E(P2T_i \mid X_i) = \beta_0 + \beta_1 P1T_i + \beta_2 AbsMargin_i + \beta_3 Year_i. \]
Pri kvantilovej regresii odhadujeme podmienený kvantil:
\[ Q_{\tau}(P2T_i \mid X_i) = \beta_0(\tau) + \beta_1(\tau)P1T_i + \beta_2(\tau)AbsMargin_i + \beta_3(\tau)Year_i. \]
m_ols <- lm(
second_half_points ~ first_half_points + abs_halftime_margin + year_c,
data = data_model
)
summary(m_ols)
##
## Call:
## lm(formula = second_half_points ~ first_half_points + abs_halftime_margin +
## year_c, data = data_model)
##
## Residuals:
## Min 1Q Median 3Q Max
## -39.666 -7.853 -0.064 7.166 45.749
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 58.54202 1.33568 43.829 <2e-16 ***
## first_half_points 0.22064 0.01708 12.915 <2e-16 ***
## abs_halftime_margin 0.04092 0.03044 1.344 0.1790
## year_c 0.09951 0.03903 2.550 0.0108 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 11.11 on 3709 degrees of freedom
## Multiple R-squared: 0.04786, Adjusted R-squared: 0.04709
## F-statistic: 62.14 on 3 and 3709 DF, p-value: < 2.2e-16
Premenná first_half_points je štatisticky významná, keďže jej p-hodnota je menšia ako 0,05. Odhadnutý koeficient 0,221 znamená, že ak sa počet bodov v prvom polčase zvýši o jeden bod, počet bodov v druhom polčase sa v priemere zvýši približne o 0,221 bodu, pri nezmenených ostatných premenných.
Premenná abs_halftime_margin má kladný koeficient 0,041, ale nie je štatisticky významná na 5 % hladine významnosti. To znamená, že v OLS modeli nemáme dostatočný dôkaz, že veľkosť rozdielu po prvom polčase významne ovplyvňuje počet bodov v druhom polčase.
Premenná year_c je štatisticky významná na 5 % hladine významnosti. Koeficient 0,100 naznačuje, že v novších sezónach sa počet bodov v druhom polčase mierne zvyšoval.
Hodnota R-squared je približne 0,048, čo znamená, že model vysvetľuje približne 4,8 % variability počtu bodov v druhom polčase. Ide o nízku hodnotu, čo naznačuje, že skórovanie v druhom polčase závisí aj od mnohých ďalších faktorov, ktoré v modeli nie sú zahrnuté.
Teraz odhadneme kvantilové regresie pre dolný kvartil, medián a horný kvartil.
m_q25 <- rq(
second_half_points ~ first_half_points + abs_halftime_margin + year_c,
tau = 0.25,
data = data_model
)
m_q50 <- rq(
second_half_points ~ first_half_points + abs_halftime_margin + year_c,
tau = 0.50,
data = data_model
)
m_q75 <- rq(
second_half_points ~ first_half_points + abs_halftime_margin + year_c,
tau = 0.75,
data = data_model
)
summary(m_q25)
##
## Call: rq(formula = second_half_points ~ first_half_points + abs_halftime_margin +
## year_c, tau = 0.25, data = data_model)
##
## tau: [1] 0.25
##
## Coefficients:
## Value Std. Error t value Pr(>|t|)
## (Intercept) 52.66322 1.67057 31.52418 0.00000
## first_half_points 0.19083 0.02132 8.94934 0.00000
## abs_halftime_margin 0.06706 0.04272 1.56966 0.11658
## year_c 0.10664 0.04875 2.18750 0.02877
Dolný kvartil, teda \(\tau = 0{,}25\), opisuje zápasy s nižším počtom bodov v druhom polčase.
Pri dolnom kvartile je koeficient pri first_half_points rovný 0,191 a je štatisticky významný. To znamená, že pri zápasoch s nižším počtom bodov v druhom polčase je vyšší počet bodov v prvom polčase spojený s vyšším dolným kvartilom počtu bodov v druhom polčase.
Koeficient pri abs_halftime_margin je kladný, ale nie je štatisticky významný na 5 % hladine významnosti. Preto nemožno tvrdiť, že veľkosť rozdielu po prvom polčase má v dolnej časti rozdelenia jednoznačný vplyv.
Premenná year_c je pri dolnom kvartile štatisticky významná. To naznačuje, že aj pri zápasoch s nižším skóre v druhom polčase existuje mierny rastúci trend v čase.
summary(m_q50)
##
## Call: rq(formula = second_half_points ~ first_half_points + abs_halftime_margin +
## year_c, tau = 0.5, data = data_model)
##
## tau: [1] 0.5
##
## Coefficients:
## Value Std. Error t value Pr(>|t|)
## (Intercept) 57.78897 1.58853 36.37888 0.00000
## first_half_points 0.22730 0.02034 11.17730 0.00000
## abs_halftime_margin 0.07403 0.03549 2.08556 0.03709
## year_c 0.08368 0.04634 1.80576 0.07104
Mediánová regresia, teda \(\tau = 0{,}50\), opisuje typický zápas z hľadiska počtu bodov v druhom polčase.
Pri mediánovej regresii je koeficient pri first_half_points rovný 0,227 a je štatisticky významný. To znamená, že pri typickom zápase je zvýšenie počtu bodov v prvom polčase o jeden bod spojené so zvýšením mediánu počtu bodov v druhom polčase približne o 0,227 bodu.
Koeficient pri abs_halftime_margin je rovný 0,074 a je štatisticky významný na 5 % hladine významnosti. To znamená, že pri mediáne väčší rozdiel po prvom polčase súvisí s mierne vyšším počtom bodov v druhom polčase.
Premenná year_c má kladný koeficient, ale jej p-hodnota je približne 0,071. To znamená, že na 5 % hladine významnosti nie je štatisticky významná, ale na 10 % hladine významnosti by sa dala považovať za slabo významnú.
summary(m_q75)
##
## Call: rq(formula = second_half_points ~ first_half_points + abs_halftime_margin +
## year_c, tau = 0.75, data = data_model)
##
## tau: [1] 0.75
##
## Coefficients:
## Value Std. Error t value Pr(>|t|)
## (Intercept) 63.90968 2.07580 30.78797 0.00000
## first_half_points 0.24194 0.02664 9.08099 0.00000
## abs_halftime_margin 0.04839 0.04605 1.05085 0.29340
## year_c 0.12258 0.06087 2.01372 0.04411
Horný kvartil, teda \(\tau = 0{,}75\), opisuje zápasy s vyšším počtom bodov v druhom polčase.
Pri hornom kvartile je koeficient pri first_half_points rovný 0,242 a je štatisticky významný. To znamená, že pri zápasoch s vyšším počtom bodov v druhom polčase je zvýšenie počtu bodov v prvom polčase o jeden bod spojené so zvýšením horného kvartilu počtu bodov v druhom polčase približne o 0,242 bodu.
Koeficient pri abs_halftime_margin je kladný, ale nie je štatisticky významný. Preto nemožno tvrdiť, že veľkosť rozdielu po prvom polčase významne ovplyvňuje horný kvartil počtu bodov v druhom polčase.
Premenná year_c je štatisticky významná na 5 % hladine významnosti. To naznačuje, že pri zápasoch s vyšším počtom bodov v druhom polčase existuje mierny rastúci časový trend.
V tejto časti porovnáme koeficienty z OLS modelu a z kvantilových regresií.
coef_table <- rbind(
OLS = coef(m_ols),
Q25 = coef(m_q25),
Q50 = coef(m_q50),
Q75 = coef(m_q75)
)
kable(coef_table, digits = 4, caption = "Porovnanie odhadnutých koeficientov")
| (Intercept) | first_half_points | abs_halftime_margin | year_c | |
|---|---|---|---|---|
| OLS | 58.5420 | 0.2206 | 0.0409 | 0.0995 |
| Q25 | 52.6632 | 0.1908 | 0.0671 | 0.1066 |
| Q50 | 57.7890 | 0.2273 | 0.0740 | 0.0837 |
| Q75 | 63.9097 | 0.2419 | 0.0484 | 0.1226 |
Porovnanie koeficientov ukazuje, či je vzťah medzi premennými rovnaký v rôznych častiach rozdelenia závislej premennej.
Pri premennej first_half_points môžeme porovnať
koeficienty v dolnom, strednom a hornom kvartile. Ak je koeficient v
hornom kvartile vyšší ako v dolnom kvartile, znamená to, že počet bodov
v prvom polčase má silnejší vzťah s druhým polčasom pri zápasoch s
vyšším počtom bodov v druhom polčase.
V našom prípade je koeficient pri first_half_points:
Keďže koeficient v hornom kvartile je vyšší ako v dolnom kvartile, výsledky naznačujú, že vzťah medzi bodmi v prvom a druhom polčase je silnejší pri zápasoch s vyšším počtom bodov v druhom polčase. To znamená, že efekt nie je rovnaký v celom rozdelení závislej premennej.
coef_long <- coef_table %>%
as.data.frame() %>%
rownames_to_column("model") %>%
pivot_longer(
cols = -model,
names_to = "premenna",
values_to = "koeficient"
)
ggplot(coef_long, aes(x = model, y = koeficient, group = premenna)) +
geom_line() +
geom_point(size = 2) +
facet_wrap(~ premenna, scales = "free_y") +
labs(
title = "Porovnanie koeficientov medzi OLS a kvantilovými regresiami",
x = "Model",
y = "Odhadnutý koeficient"
) +
theme_minimal()
Výsledky OLS regresie ukázali, že počet bodov v prvom polčase má pozitívny a štatisticky významný vzťah s počtom bodov v druhom polčase. To znamená, že zápasy s vyšším skóre v prvom polčase majú tendenciu mať aj vyšší počet bodov v druhom polčase.
Kvantilová regresia ukázala, že tento vzťah nie je úplne rovnaký vo všetkých častiach rozdelenia. Koeficient pri počte bodov v prvom polčase rastie od dolného kvartilu cez medián až po horný kvartil. V dolnom kvartile je koeficient 0,191, v mediáne 0,227 a v hornom kvartile 0,242. To naznačuje, že vzťah medzi bodmi v prvom a druhom polčase je silnejší pri zápasoch, ktoré majú vyšší počet bodov v druhom polčase.
Naopak, premenná abs_halftime_margin nebola vo väčšine modelov štatisticky významná. Výnimkou je mediánová regresia, kde bola významná na 5 % hladine významnosti. Časový trend year_c bol vo väčšine modelov kladný, čo naznačuje mierny rast počtu bodov v druhom polčase v novších sezónach.
Celkovo môžeme povedať, že kvantilová regresia poskytla podrobnejší pohľad ako OLS. OLS ukázala iba priemerný vzťah, zatiaľ čo kvantilová regresia ukázala, že efekt počtu bodov v prvom polčase je silnejší v hornej časti rozdelenia počtu bodov v druhom polčase.