Po autokoreácii a heteroskedasticite rezíduí je multikolinearita tretím závažným porušením predpokladov použitia metódy najmenších štvorcov. Tu sa okrem iného predpokadá, že matica \(\mathbf X\) je tvorená lineárne nezávislými riadkami a tiež stĺpcami, čo zabezpečí regularitu matice \(\mathbf X^T\mathbf X\) a teda možnosť jej inverzie. Tá sa používa pri odhadoch regresných koeficientov. V praxi sa ale môže stať, že vzniká "takmer singulárna matica \(\mathbf X^T\mathbf X\) ", t.j. matica \(\mathbf X\) je tvorená "približne" lineárne závislými stĺpcami, t.j. existuje taká ich lineárna kombinácia, v ktorej
\[ x_{il} = \alpha_0 + \alpha_1 x_{i1} + \dots + \alpha_{l-1} x_{i,(l-1)} + \alpha_{l+1} x_{i,(l+1)} + \alpha_k x_{i,k} + \nu_i \]
Tu \(\nu_i\) sú rádovo menšie čísla , než regresory \(x_{.}\), t.j. \((\forall i)(\nu_i << x_{.,i})\). V tomto prípade je inverzná matica \((\mathbf X^T\mathbf X)^{-1}\) veľmi nestabilná a obsahuje na hlavnej diagonále veľmi veľké hodnoty. Táto matica sa používa pri výpočtoch \[\hat \beta = (\mathbf X^T\mathbf X)^{-1} \mathbf X^T \mathbf y\] a tiež \[\text{std}(\beta_i) = \sqrt{\sigma^2 (\mathbf X^T \mathbf X)^{-1}_{ii}}.\] To spôsobuje nestabilitu odhadovaných regresných koeficientov a ich nadhodnotené rozptyly.
Tento problém nazývame problémom multikolinearity.
Multikolinearita patrí medzi najčastejšie problémy viacnásobnej
lineárnej regresie.
Je dôležité jasne rozlišovať dva fakty:
Budeme pracovať s regresným modelom z minulých cvičení, pričom
\[ Life.expectancy_i = \beta_0 + \beta_1 BMI_i + \beta_2 GDP_i + \beta_3 Schooling_i + u_i \]
Prierezové údaje máme z databázy WHO a po ich nadčítaní sme ich uložili do data.frame udaje.
udaje <- read.csv("udaje/Life_Expectancy_Data.csv",dec=".",sep=",",header = TRUE)
# select just the record from 2015
udaje.2015 <- udaje[udaje$Year==2015,c("Life.expectancy","BMI","GDP","Schooling")]
# data imputation
# Compute column medians
#column_medians <- sapply(udaje.2015, median, na.rm = TRUE)
# Impute missing values with column medians
# Compute column medians
column_medians <- sapply(udaje.2015, median, na.rm = TRUE)
# Impute missing values with column medians
udaje_imputed <- udaje.2015
for (col in names(udaje.2015)) {
udaje_imputed[[col]][is.na(udaje_imputed[[col]])] <- column_medians[col]
}
udaje.2015 <- udaje_imputed
udaje <- udaje.2015
model <- lm(Life.expectancy ~ BMI + GDP + Schooling,
data = udaje)
summary(model)
##
## Call:
## lm(formula = Life.expectancy ~ BMI + GDP + Schooling, data = udaje)
##
## Residuals:
## Min 1Q Median 3Q Max
## -17.6471 -2.4024 0.4563 3.2355 12.8591
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.419e+01 1.839e+00 24.033 <2e-16 ***
## BMI 4.948e-02 2.144e-02 2.308 0.0222 *
## GDP 6.972e-05 3.845e-05 1.813 0.0715 .
## Schooling 1.921e+00 1.645e-01 11.676 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.033 on 179 degrees of freedom
## Multiple R-squared: 0.6224, Adjusted R-squared: 0.6161
## F-statistic: 98.36 on 3 and 179 DF, p-value: < 2.2e-16
Vo výsledkoch pozorujeme veľké rádové rozdiely v odhade regresných koeficientov - porovnajte si rády koeficientov pri GDP a pri Schooling.
Korelácia dokáže zachytiť párové vzťahy medzi premennými. Ak medzi niektorými vysvetľujúcimi premennými je vysoká korelácia (signalizujúca multikolinearitu), potom je najjednoduchšie ju zo zoznamu regresorov vylúčiť. Korelácie sa dajú aj testovať, alebo len vyčísliť a potom podľa intuitívneho pravidla vylúčiť jednu premennú, ktorá má koreláciu s inou premennou v absolútnej hodnote vyššiu ako 0.8, resp. 0.9.
xvars <- udaje[, c("BMI", "GDP", "Schooling")]
round(cor(xvars), 3)
## BMI GDP Schooling
## BMI 1.000 0.311 0.526
## GDP 0.311 1.000 0.435
## Schooling 0.526 0.435 1.000
V našom prípade teda nevidíme dve premenné ktoré by boli silne korelované.
Korelačný vzťah sa dá vytušiť aj z jednoduchých párových scatterplotov ako je to na nasledujúcom obrázku.
pairs(xvars,
main = "Scatterplotová matica – premenné BMI, GDP, Schooling")
Indikátorom multikolinearity u premennej, ktorá multikolinearitu zapríčiňuje, je Variance Inflation Factor (VIF). Pre premennú \(x_j\) je potom
\[ VIF_j = \frac{1}{1 - R_j^2} \]
kde \(R_j^2\) pochádza z regresie:
\[ X_j = \gamma_0 + \gamma_1 X_1 + \cdots + \gamma_{j-1} X_{j-1} + \gamma_{j+1} X_{j+1} + u. \]
library(car)
vif(model)
## BMI GDP Schooling
## 1.398736 1.247834 1.558912
Intuitívnym kritériom, ktoré signalizuje prítomnosť multikolinearity, je podmienka VIF > 5 (prísne kritérium), alebo VIF > 10 (menej prísne kritérium). V našom prípade to nespĺňa žiadna z vysvetľujúcich veličín.
Pri existencii multikolinearity sa model prejavuje tak, že koeficient determinácie je síce vysoký a zdá sa, že model je veľmi dobrý, ale regresné koeficienty nie sú štatisticky významné - t.j. štandardné odchýlky regresných koeficientov sú veľmi veľké. Uvedomíme si to, ak sa pozrieme, ako sa počítajú - t.j. \(\text{std}(\beta_i) = \sqrt{\sigma^2 (\mathbf X^T \mathbf X)^{-1}_{ii}}\), kde rozhodujúci je \(i\)ty prvok hlavnej diagonály matice \((\mathbf X^T \mathbf X)^{-1}\). Tie prvky sú ale v prípade podobnosti vysvetľujúcich premenných mimoriadne veľké. Túto situáciu zachytáva nasledovný ukazovateľ.
Pri výpočte Condition number \(\kappa\) sa používa vzorec
\[\kappa = \frac{\theta_{\text{max}}}{\theta_{\text{min}}}\]
kde \(\theta_.\) sú vlastné čísla matice (vysvetlené nižšie). Conditional number nie je test, je to len indikátor, ktorý posudzuje mieru multikolinearity medzi premennými. Používame intuitívne pravidlo. Ak Conditional number je
V našom prípade to vypočítame nasledovne
X <- model.matrix(model)[, -1]
XtX <- t(X) %*% X
eig <- eigen(XtX)
condition_number <- sqrt(max(eig$values) / min(eig$values))
condition_number
## [1] 2692.719
Keďže u nás tento indikátor presahuje významne hodnotu 100, signalizuje prítomnosť závažnej multikolinearity.
Vlastné číslo štvorcovej matice \(\mathbf X^T \mathbf X\) je číslo \(\theta_j\), pre ktoré platí \((\mathbf X^T \mathbf X)\mathbf h^j = \theta_i\mathbf h^j\). \(\mathbf h^j\) je tzv vlastný vektor tejto matice. Máme toľko vlastných čísel (teda aj vlastných vektorov), koľko obsahuje matica \(\mathbf X^T \mathbf X\) riadkov (stĺpcov).
Môže sa stať, že VIF faktor nesignalizuje multikolinearitu u žiadnej z vysvetľujúcich veličín, ale sú navzájom prepojené cyklickými lineárnymi závislosťami všetky premenné. To zachytáva práve Condition Number.
Pokúsme sa vynechať postupne dve premenné, ktoré majú najvyšší VIF a porovnajme následne upravené koeficienty determinácie oboch nových modelov
model_noBMI <- lm(Life.expectancy ~ GDP + Schooling, data = udaje)
summary(model_noBMI)
##
## Call:
## lm(formula = Life.expectancy ~ GDP + Schooling, data = udaje)
##
## Residuals:
## Min 1Q Median 3Q Max
## -18.3746 -2.4939 0.5427 3.3179 10.8549
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.401e+01 1.859e+00 23.672 <2e-16 ***
## GDP 7.920e-05 3.869e-05 2.047 0.0421 *
## Schooling 2.094e+00 1.481e-01 14.142 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.094 on 180 degrees of freedom
## Multiple R-squared: 0.6112, Adjusted R-squared: 0.6069
## F-statistic: 141.5 on 2 and 180 DF, p-value: < 2.2e-16
model_noSchooling <- lm(Life.expectancy ~ GDP + BMI, data = udaje)
summary(model_noSchooling)
##
## Call:
## lm(formula = Life.expectancy ~ GDP + BMI, data = udaje)
##
## Residuals:
## Min 1Q Median 3Q Max
## -16.2929 -4.1549 0.4721 4.0853 23.2326
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.317e+01 1.140e+00 55.429 < 2e-16 ***
## GDP 2.206e-04 4.793e-05 4.603 7.85e-06 ***
## BMI 1.638e-01 2.524e-02 6.490 8.06e-10 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 6.662 on 180 degrees of freedom
## Multiple R-squared: 0.3349, Adjusted R-squared: 0.3275
## F-statistic: 45.31 on 2 and 180 DF, p-value: < 2.2e-16
Tu vidíme, že vynechanie premennej Schooling podstatne znižuje upravený koeficient determinácie, a preto v prípade vynechávania premennej by sme uprednostnili vynechanie premennej GDP.
Škálovanie môže byť veľmi efektívne, znižuje ale interpretovateľnosť modelu. Ide o úpravu premenných podľa nasledovného vzorca:
\[x^{scale} = \frac{x-M}{\sqrt{D}}\] kde \(M\) je stredná hodnota (priemer) a \(D\) je rozptyl premennej.
udaje$BMI_c <- scale(udaje$BMI, center=TRUE, scale=TRUE)
udaje$GDP_c <- scale(udaje$GDP, center=TRUE, scale=TRUE)
udaje$Schooling_c <- scale(udaje$Schooling, center=TRUE, scale=TRUE)
model_centered <- lm(Life.expectancy ~ BMI_c + GDP_c + Schooling_c,
data = udaje)
summary(model_centered)
##
## Call:
## lm(formula = Life.expectancy ~ BMI_c + GDP_c + Schooling_c, data = udaje)
##
## Residuals:
## Min 1Q Median 3Q Max
## -17.6471 -2.4024 0.4563 3.2355 12.8591
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 71.6169 0.3721 192.478 <2e-16 ***
## BMI_c 1.0183 0.4413 2.308 0.0222 *
## GDP_c 0.7557 0.4168 1.813 0.0715 .
## Schooling_c 5.4392 0.4658 11.676 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.033 on 179 degrees of freedom
## Multiple R-squared: 0.6224, Adjusted R-squared: 0.6161
## F-statistic: 98.36 on 3 and 179 DF, p-value: < 2.2e-16
vif(model_centered)
## BMI_c GDP_c Schooling_c
## 1.398736 1.247834 1.558912
Conditional Number je
X <- model.matrix(model_centered)[, -1]
XtX <- t(X) %*% X
eig <- eigen(XtX)
condition_number <- sqrt(max(eig$values) / min(eig$values))
condition_number
## [1] 2.0353
Z výsledkov vidíme, že ukazovateľ Condition number sa podstatne zlepšil a nesignalizuje už žiadnu multikolinearitu. Ukazovatele VIF aj naďalej ostali veľmi nízke, čo je dobrou vlastnosťou preškálovania premenných
Ak sa chceme vynhúť strate interpretovateľnosti, môžeme sa pozrieť, v akých rádoch sa pohybuje vývoj jednotlivých vysvetľujúcich veličín a upraviť jednoduchým prevodom na iné jednotky tú premennú, ktorá sa odlišuje od ostatných. V našom prípade ide o premennú GDP, ktorá meria HDP na obyvateľa v dolároch. My to predelením 1000 prevedieme na HDP na obyvateľa vyjadrený v tisícoch dolárov. Tým dostaneme premenné vyjadrené v rádovo porovnateľných jednotkách tak, ako je to uvedené v nasledovnej tabuľke.
udaje$GDP1000 = udaje$GDP/1000
head(udaje)
## Life.expectancy BMI GDP Schooling BMI_c GDP_c Schooling_c
## 1 65.0 19.1 584.2592 10.1 -1.1524374 -0.5466216 -1.0018056
## 17 77.8 58.0 3954.2278 14.2 0.7376778 -0.2356953 0.4461905
## 33 75.6 59.5 4132.7629 14.4 0.8105614 -0.2192230 0.5168244
## 49 52.4 23.3 3695.7937 11.4 -0.9483632 -0.2595394 -0.5426849
## 65 76.4 47.7 13566.9541 13.9 0.2372103 0.6512118 0.3402395
## 81 76.3 62.8 13467.1236 17.3 0.9709054 0.6420010 1.5410168
## GDP1000
## 1 0.5842592
## 17 3.9542278
## 33 4.1327629
## 49 3.6957937
## 65 13.5669541
## 81 13.4671236
Potom lineárny model dosiahne výsledky
model_GDP_1000 <- lm(Life.expectancy ~ BMI + GDP1000 + Schooling,
data = udaje)
summary(model_GDP_1000)
##
## Call:
## lm(formula = Life.expectancy ~ BMI + GDP1000 + Schooling, data = udaje)
##
## Residuals:
## Min 1Q Median 3Q Max
## -17.6471 -2.4024 0.4563 3.2355 12.8591
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 44.19364 1.83886 24.033 <2e-16 ***
## BMI 0.04948 0.02144 2.308 0.0222 *
## GDP1000 0.06972 0.03845 1.813 0.0715 .
## Schooling 1.92097 0.16452 11.676 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.033 on 179 degrees of freedom
## Multiple R-squared: 0.6224, Adjusted R-squared: 0.6161
## F-statistic: 98.36 on 3 and 179 DF, p-value: < 2.2e-16
vif(model_GDP_1000)
## BMI GDP1000 Schooling
## 1.398736 1.247834 1.558912
kde všetky regresné koeficienty majú porovnateľné rády a tiež VIF je akceptovateľný vo všetkých prípadoch. Conditional number je potom
X <- model.matrix(model_GDP_1000)[, -1]
XtX <- t(X) %*% X
eig <- eigen(XtX)
condition_number <- sqrt(max(eig$values) / min(eig$values))
condition_number
## [1] 10.618
čo sa nachádza niekde na hranici nášho intuitívneho kritéria medzi Nízka multikolinearita a Mierna multikolinearita. Regresné koeficienty si ale zachovali dobrú interpretovateľnosť.
Poznámka: Dummy premenné neškálujeme
### ocistenie databazy od nadbytocnych - pracovnych stlpcov
library(dplyr)
udaje <- udaje %>%
dplyr::select(-Schooling_c, -BMI_c, -GDP_c, GDP1000)
PCA nám vytvára pracovný vektor, ktorý je definovaný ako vážený súťet dvoch nami špecifikovaných korelovaných premenných. Tento vektor potom vystupuje ako vysvetľujúca veličina, zatiaľ čo začlenené dve vysvetľujúce premenné vylúčime zo zoznamu regresorov. Tým sa redukuje počet vysvetľujúcich veličín a odstraňuje sa aj problém multikolinearity.
X_pca <- scale(udaje[, c("GDP", "Schooling")], center=TRUE, scale=TRUE)
pca_res <- prcomp(X_pca)
summary(pca_res)
## Importance of components:
## PC1 PC2
## Standard deviation 1.1980 0.7516
## Proportion of Variance 0.7176 0.2824
## Cumulative Proportion 0.7176 1.0000
udaje$PC1 <- pca_res$x[,1]
model_pca <- lm(Life.expectancy ~ BMI + PC1, data = udaje)
summary(model_pca)
##
## Call:
## lm(formula = Life.expectancy ~ BMI + PC1, data = udaje)
##
## Residuals:
## Min 1Q Median 3Q Max
## -16.3086 -3.3559 0.7001 3.9098 16.0834
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 68.11003 1.07188 63.542 < 2e-16 ***
## BMI 0.08190 0.02311 3.545 0.000501 ***
## PC1 4.10533 0.39696 10.342 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.578 on 180 degrees of freedom
## Multiple R-squared: 0.5337, Adjusted R-squared: 0.5285
## F-statistic: 103 on 2 and 180 DF, p-value: < 2.2e-16
vif(model_pca)
## BMI PC1
## 1.322726 1.322726
Hrebeňová regresia je modifikácia regresie, ktorá zavádza perturbácie do matice \(\mathbf X^T \mathbf X\) tak, aby znížila dôsledky multikolinearity. Treba ale upozorniť, že odhadované regresné koeficienty sú skreslené. Perturbácia vyzerá nasledovne
\[(\mathbf X^T \mathbf X + \lambda \mathbf I)\]
V tomto kroku si vypíšeme výsledky odhadov regresných koeficientov s meniacimi sa parametrami \(lambda\) tak, aby sme získlali určitú predstavu o číselnom ráde prvkov, ktoré obsahuje. Na základe toho sa potom rozhodneme pre nejakú voľbu parametra \(\lambda\).
Nastavovanie rôznych hodnôt \(\lambda\) je predmetom hlbšej analýzy, tento prehľad je len jej časťou.
ridge_fit <- lm.ridge(y ~ X, lambda = seq(0, 10, 1))
ridge_fit
## XBMI XGDP XSchooling
## 0 44.19364 0.04947912 6.972179e-05 1.920974
## 1 44.34557 0.05009188 7.058986e-05 1.906765
## 2 44.49495 0.05068217 7.142956e-05 1.892841
## 3 44.64187 0.05125088 7.224193e-05 1.879194
## 4 44.78640 0.05179884 7.302793e-05 1.865813
## 5 44.92861 0.05232686 7.378848e-05 1.852689
## 6 45.06857 0.05283570 7.452448e-05 1.839815
## 7 45.20636 0.05332607 7.523678e-05 1.827183
## 8 45.34203 0.05379867 7.592618e-05 1.814785
## 9 45.47564 0.05425417 7.659347e-05 1.802613
## 10 45.60726 0.05469318 7.723938e-05 1.790661