V tejto úlohe nadväzujem na predchádzajúce zadanie s databázou
EuStockMarkets.
Budeme skúmať, či je v jednoduchom lineárnom regresnom modeli prítomná
heteroskedasticita
a ukážeme si dve základné možnosti, ako ju riešiť.
Použitý model:
data("EuStockMarkets")
stocks <- as.data.frame(EuStockMarkets)
# jednoduchý lineárny model
model_lin <- lm(FTSE ~ DAX, data = stocks)
summary(model_lin)
##
## Call:
## lm(formula = FTSE ~ DAX, data = stocks)
##
## Residuals:
## Min 1Q Median 3Q Max
## -755.13 -143.29 37.25 167.78 372.18
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.344e+03 1.273e+01 105.5 <2e-16 ***
## DAX 8.780e-01 4.625e-03 189.8 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 216.3 on 1858 degrees of freedom
## Multiple R-squared: 0.951, Adjusted R-squared: 0.9509
## F-statistic: 3.604e+04 on 1 and 1858 DF, p-value: < 2.2e-16
Komentár:
Model popisuje, ako sa hodnota indexu FTSE mení v závislosti od indexu
DAX.
Koeficient pri DAX by mal byť kladný – rast DAX je spojený
s rastom FTSE.
Pred použitím modelu potrebujeme overiť, či spĺňa predpoklady klasickej
lineárnej regresie,
najmä konštantný rozptyl chýb (homoskedasticita).
plot(
fitted(model_lin),
resid(model_lin),
pch = 19,
col = "darkgreen",
xlab = "Odhadnuté hodnoty (fitted values)",
ylab = "Rezíduá",
main = "Rezíduá vs. fitted values (FTSE ~ DAX)"
)
abline(h = 0, col = "red", lwd = 2)
Interpretácia (graf):
Ak by platila homoskedasticita, body by mali byť
rozptýlené okolo horizontálnej čiary 0
bez výrazného vzoru (≈ náhodný mrak).
Ak sa rozptyl rezíduí zväčšuje alebo zmenšuje s úrovňou
fitted hodnôt (tvar lievika),
je to vizuálny signál heteroskedasticity.
bptest(model_lin)
##
## studentized Breusch-Pagan test
##
## data: model_lin
## BP = 265.15, df = 1, p-value < 2.2e-16
Interpretácia (test):
Postup:
bptest(model_lin).p-value < 0.05, zamietame H₀ →
dáta naznačujú heteroskedasticitu.p-value ≥ 0.05, H₀ nezamietame → nemáme dôkaz o
heteroskedasticite.(Skutočnú p-hodnotu uvidíš pri spustení kódu.)
Aj keď je heteroskedasticita prítomná, odhady koeficientov (β₀, β₁)
sú stále neskreslené,
ale štandardné chyby a testy už nie sú spoľahlivé.
Jedným z riešení je použiť
robustné (heteroskedasticity-consistent) smerodajné
odchýlky.
# robustná kovariančná matica typu HC1
vcov_hc <- sandwich::vcovHC(model_lin, type = "HC1")
# koeficienty s robustnými smerodajnými chybami
coeftest(model_lin, vcov. = vcov_hc)
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.3437e+03 1.7774e+01 75.597 < 2.2e-16 ***
## DAX 8.7802e-01 7.4383e-03 118.041 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Interpretácia (robustné SE):
Std. Error sú teraz upravené tak, aby
boli korektné aj pri heteroskedasticite.DAX štatisticky významnýDAX veľmi významný
(p-hodnota ≪ 0.05),Robustné smerodajné odchýlky sú najjednoduchší praktický
spôsob, ako heteroskedasticitu ošetriť,
bez zmeny samotného modelu.
Ďalšou bežnou možnosťou je použiť model v logaritmoch, napríklad:
\[ \log(\text{FTSE}) = \alpha_0 + \alpha_1 \log(\text{DAX}) + u \]
Takýto model často stabilizuje rozptyl a lepšie zachytí percentuálne zmeny.
stocks$log_FTSE <- log(stocks$FTSE)
stocks$log_DAX <- log(stocks$DAX)
model_log <- lm(log_FTSE ~ log_DAX, data = stocks)
summary(model_log)
##
## Call:
## lm(formula = log_FTSE ~ log_DAX, data = stocks)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.15540 -0.03782 0.00949 0.04279 0.10469
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.843766 0.026653 106.7 <2e-16 ***
## log_DAX 0.682921 0.003429 199.1 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.05371 on 1858 degrees of freedom
## Multiple R-squared: 0.9552, Adjusted R-squared: 0.9552
## F-statistic: 3.965e+04 on 1 and 1858 DF, p-value: < 2.2e-16
# graf rezíduá vs. fitted pre log-model
plot(
fitted(model_log),
resid(model_log),
pch = 19,
col = "purple",
xlab = "Odhadnuté hodnoty (fitted values)",
ylab = "Rezíduá",
main = "Rezíduá vs. fitted values (log(FTSE) ~ log(DAX))"
)
abline(h = 0, col = "red", lwd = 2)
# Breusch–Pagan test pre log-model
bptest(model_log)
##
## studentized Breusch-Pagan test
##
## data: model_log
## BP = 87.751, df = 1, p-value < 2.2e-16
Interpretácia:
bptest(model_log) porovnaj p-hodnotu s
0.05.V tejto úlohe som:
Pri interpretácii stačí zdôrazniť:
summary(lm) nie sú spoľahlivé,