Pokračujeme v predchádzajúcich úlohách, ale teraz už nie s dátami o
dĺžke života,
ale s finančnými časovými radmi EuStockMarkets. Budeme
skúmať, nakoľko je index FTSE ovplyvnený ostatnými
európskymi indexmi.
Použijeme:
data("EuStockMarkets")
# prevedieme na data.frame
udaje <- as.data.frame(EuStockMarkets)
head(udaje)
## DAX SMI CAC FTSE
## 1 1628.75 1678.1 1772.8 2443.6
## 2 1613.63 1688.5 1750.5 2460.2
## 3 1606.51 1678.6 1718.0 2448.2
## 4 1621.04 1684.1 1708.1 2470.4
## 5 1618.16 1686.6 1723.1 2484.7
## 6 1610.61 1671.6 1714.3 2466.8
summary(udaje)
## DAX SMI CAC FTSE
## Min. :1402 Min. :1587 Min. :1611 Min. :2281
## 1st Qu.:1744 1st Qu.:2166 1st Qu.:1875 1st Qu.:2843
## Median :2141 Median :2796 Median :1992 Median :3247
## Mean :2531 Mean :3376 Mean :2228 Mean :3566
## 3rd Qu.:2722 3rd Qu.:3812 3rd Qu.:2274 3rd Qu.:3994
## Max. :6186 Max. :8412 Max. :4388 Max. :6179
Základný lineárny model:
\[ FTSE_t = \beta_0 + \beta_1 DAX_t + \beta_2 SMI_t + \beta_3 CAC_t + u_t \]
model <- lm(FTSE ~ +1 + DAX + SMI + CAC, data = udaje)
summary(model)
##
## Call:
## lm(formula = FTSE ~ +1 + DAX + SMI + CAC, data = udaje)
##
## Residuals:
## Min 1Q Median 3Q Max
## -534.61 -76.61 12.18 84.13 386.73
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1988.54565 18.75930 106.003 <2e-16 ***
## DAX -0.02123 0.02578 -0.823 0.41
## SMI 0.70758 0.01347 52.541 <2e-16 ***
## CAC -0.34029 0.01988 -17.120 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 121.5 on 1856 degrees of freedom
## Multiple R-squared: 0.9845, Adjusted R-squared: 0.9845
## F-statistic: 3.941e+04 on 3 and 1856 DF, p-value: < 2.2e-16
Komentár:
Testujeme, či je model správne špecifikovaný (funkčná forma, chýbajúce premenné):
resettest(model)
##
## RESET test
##
## data: model
## RESET = 254.83, df1 = 2, df2 = 1854, p-value < 2.2e-16
Interpretácia:
p-value < 0.05 → zamietame H0 → model je
pravdepodobne zle špecifikovanýp-value ≥ 0.05 → nevidíme dôkaz o nesprávnej
špecifikácii.plot(model, which = 1)
Ak rezíduá vykazujú nejaký zakrivený vzor (nie náhodný mrak), model
nemusí byť lineárny v premenných.
Môže byť potrebná transformácia premenných alebo pridanie nelineárnych
(kvadratických) členov.
Pozrieme sa, pri ktorých premenných je najväčší odklon od linearity.
car::crPlots(model)
Interpretácia:
Predpokladajme, že nelinearita je najvýraznejšia pri indexe DAX, prípadne SMI.
Rozšírime model o kvadráty niektorých vysvetľujúcich premenných:
\[ FTSE_t = \beta_0 + \beta_1 DAX_t + \beta_2 SMI_t + \beta_3 CAC_t + \gamma_1 DAX_t^2 + \gamma_2 SMI_t^2 + u_t \]
model_kvadr <- lm(FTSE ~ +1 + DAX + SMI + CAC + I(DAX^2) + I(SMI^2), data = udaje)
summary(model_kvadr)
##
## Call:
## lm(formula = FTSE ~ +1 + DAX + SMI + CAC + I(DAX^2) + I(SMI^2),
## data = udaje)
##
## Residuals:
## Min 1Q Median 3Q Max
## -424.13 -68.94 7.86 78.25 342.98
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.186e+03 4.312e+01 27.500 <2e-16 ***
## DAX 8.953e-02 4.318e-02 2.073 0.0383 *
## SMI 7.965e-01 2.454e-02 32.456 <2e-16 ***
## CAC -5.784e-02 2.189e-02 -2.642 0.0083 **
## I(DAX^2) -5.574e-06 6.050e-06 -0.921 0.3570
## I(SMI^2) -2.575e-05 2.786e-06 -9.241 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 107.9 on 1854 degrees of freedom
## Multiple R-squared: 0.9878, Adjusted R-squared: 0.9878
## F-statistic: 3.009e+04 on 5 and 1854 DF, p-value: < 2.2e-16
Porovnáme základný a kvadratický model pomocou ANOVA:
anova(model, model_kvadr)
## Analysis of Variance Table
##
## Model 1: FTSE ~ +1 + DAX + SMI + CAC
## Model 2: FTSE ~ +1 + DAX + SMI + CAC + I(DAX^2) + I(SMI^2)
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 1856 27406427
## 2 1854 21585905 2 5820522 249.96 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Interpretácia:
summary().Ak je niektorý kvadratický člen štatisticky nevýznamny, môžeme ho vypustiť a nechať len ten dôležitý:
model_kvadr2 <- lm(FTSE ~ +1 + DAX + SMI + CAC + I(DAX^2), data = udaje)
summary(model_kvadr2)
##
## Call:
## lm(formula = FTSE ~ +1 + DAX + SMI + CAC + I(DAX^2), data = udaje)
##
## Residuals:
## Min 1Q Median 3Q Max
## -438.04 -71.63 11.86 83.18 319.43
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.179e+03 4.408e+01 26.744 < 2e-16 ***
## DAX 3.758e-01 3.075e-02 12.223 < 2e-16 ***
## SMI 6.041e-01 1.329e-02 45.468 < 2e-16 ***
## CAC -8.229e-02 2.222e-02 -3.704 0.000218 ***
## I(DAX^2) -5.549e-05 2.787e-06 -19.912 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 110.3 on 1855 degrees of freedom
## Multiple R-squared: 0.9873, Adjusted R-squared: 0.9872
## F-statistic: 3.596e+04 on 4 and 1855 DF, p-value: < 2.2e-16
anova(model, model_kvadr2)
## Analysis of Variance Table
##
## Model 1: FTSE ~ +1 + DAX + SMI + CAC
## Model 2: FTSE ~ +1 + DAX + SMI + CAC + I(DAX^2)
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 1856 27406427
## 2 1855 22580240 1 4826186 396.48 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Predpokladajme, že vzťah medzi FTSE a DAX môže byť iný pri
nižších hodnotách DAX a iný pri
vyšších hodnotách DAX (napr. nad horným kvartilom).
Vytvoríme dummy premennú:
threshold <- quantile(udaje$DAX, 0.75)
udaje$DUM <- ifelse(udaje$DAX < threshold, 0, 1)
threshold
## 75%
## 2722.367
Model:
\[ FTSE_t = \beta_0 + \beta_D DUM_t + \beta_1 DAX_t + \beta_2 SMI_t + \beta_3 CAC_t + u_t \]
modelD_auto <- lm(FTSE ~ +1 + DUM + DAX + SMI + CAC, data = udaje)
summary(modelD_auto)
##
## Call:
## lm(formula = FTSE ~ +1 + DUM + DAX + SMI + CAC, data = udaje)
##
## Residuals:
## Min 1Q Median 3Q Max
## -517.20 -77.66 12.17 83.49 378.71
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2016.63247 19.95235 101.072 < 2e-16 ***
## DUM 51.78977 12.91051 4.011 6.27e-05 ***
## DAX -0.03871 0.02604 -1.487 0.137
## SMI 0.70604 0.01342 52.618 < 2e-16 ***
## CAC -0.33652 0.01982 -16.980 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 121 on 1855 degrees of freedom
## Multiple R-squared: 0.9847, Adjusted R-squared: 0.9846
## F-statistic: 2.981e+04 on 4 and 1855 DF, p-value: < 2.2e-16
Tu testujeme, či DUM spôsobuje posun regresnej
nadroviny (zmena interceptu).
Ak koeficient pri DUM nie je významný, zlom v intercept-e nie je
štatisticky potvrdený.
Teraz skúmame, či sklon vzťahu FTSE–DAX je iný pre DUM = 0 a DUM = 1:
\[ FTSE_t = \beta_0 + \beta_1 DAX_t + \beta_{D} (DUM_t \cdot DAX_t) + \beta_2 SMI_t + \beta_3 CAC_t + u_t \]
modelD_sklon <- lm(FTSE ~ +1 + DAX + I(DUM * DAX) + SMI + CAC, data = udaje)
summary(modelD_sklon)
##
## Call:
## lm(formula = FTSE ~ +1 + DAX + I(DUM * DAX) + SMI + CAC, data = udaje)
##
## Residuals:
## Min 1Q Median 3Q Max
## -539.51 -75.49 11.24 84.11 390.08
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.958e+03 2.595e+01 75.457 <2e-16 ***
## DAX -8.510e-03 2.681e-02 -0.317 0.7510
## I(DUM * DAX) -8.046e-03 4.696e-03 -1.713 0.0868 .
## SMI 7.058e-01 1.350e-02 52.280 <2e-16 ***
## CAC -3.345e-01 2.015e-02 -16.599 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 121.5 on 1855 degrees of freedom
## Multiple R-squared: 0.9846, Adjusted R-squared: 0.9845
## F-statistic: 2.959e+04 on 4 and 1855 DF, p-value: < 2.2e-16
Porovnáme pôvodný model a model so zlomom v sklone:
anova(model, modelD_sklon)
## Analysis of Variance Table
##
## Model 1: FTSE ~ +1 + DAX + SMI + CAC
## Model 2: FTSE ~ +1 + DAX + I(DUM * DAX) + SMI + CAC
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 1856 27406427
## 2 1855 27363130 1 43296 2.9352 0.08684 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Interpretácia:
RESET test pre model so zlomom v sklone:
resettest(modelD_sklon)
##
## RESET test
##
## data: modelD_sklon
## RESET = 254.9, df1 = 2, df2 = 1853, p-value < 2.2e-16
Ak p-hodnota je stále malá, problém nesprávnej špecifikácie úplne nezmizol.
Testujeme, aká transformácia vysvetľovanej premennej FTSE by bola vhodná:
\[ FTSE^{(\lambda)} = \begin{cases} \frac{FTSE^\lambda - 1}{\lambda}, & \lambda \ne 0 \\ \log(FTSE), & \lambda = 0 \end{cases} \]
boxcox(model)
Interpretácia:
log(FTSE),sqrt(FTSE),1/FTSE.Predpokladajme, že optimálne \(\lambda\) je niekde inde – vypočítame ho:
bc <- boxcox(model)
lambda_opt <- bc$x[which.max(bc$y)]
lambda_opt
## [1] 1.393939
Vytvoríme transformovanú závislú premennú:
if (abs(lambda_opt) < 1e-6) {
udaje$FTSE_lambda <- log(udaje$FTSE)
} else {
udaje$FTSE_lambda <- (udaje$FTSE^lambda_opt - 1) / lambda_opt
}
model_lambda <- lm(FTSE_lambda ~ +1 + DAX + SMI + CAC, data = udaje)
summary(model_lambda)
##
## Call:
## lm(formula = FTSE_lambda ~ +1 + DAX + SMI + CAC, data = udaje)
##
## Residuals:
## Min 1Q Median 3Q Max
## -13796.2 -1789.1 264.6 1847.4 10286.8
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 18748.3624 444.3618 42.19 <2e-16 ***
## DAX 0.7636 0.6107 1.25 0.211
## SMI 16.4521 0.3190 51.57 <2e-16 ***
## CAC -4.8512 0.4708 -10.30 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2878 on 1856 degrees of freedom
## Multiple R-squared: 0.9875, Adjusted R-squared: 0.9874
## F-statistic: 4.875e+04 on 3 and 1856 DF, p-value: < 2.2e-16
RESET test pre transformovaný model:
resettest(model_lambda)
##
## RESET test
##
## data: model_lambda
## RESET = 53.642, df1 = 2, df2 = 1854, p-value < 2.2e-16
Poznámka: ANOVA porovnanie model vs
model_lambda už nemá zmysel, lebo vysvetľovaná
premenná
je iná (FTSE vs FTSE_lambda).
V tejto úlohe sme: