V tomto cvičení analyzujeme problém multikolinearity
pomocou prierezového datasetu
Covid.csv, ktorý obsahuje epidemiologické ukazovatele pre
jednotlivé krajiny počas pandémie Covid‑19.
Ako vysvetľovanú premennú volíme:
Ako vysvetľujúce premenné použijeme ostatné numerické premenné datasetu:
Cieľom je identifikovať, či v modeli existuje multikolinearita a ako ovplyvňuje spoľahlivosť regresného modelu.
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(car)
## Loading required package: carData
##
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
library(ggplot2)
library(reshape2)
library(lmtest)
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
library(sandwich)
rm(list = ls())
covid <- read.csv("Covid.csv")
names(covid)[names(covid) == "Country.Region"] <- "Country"
names(covid)[names(covid) == "Country.Region."] <- "Country"
names(covid)[names(covid) == "Country_Region"] <- "Country"
num_vars <- covid %>% select(where(is.numeric))
y <- num_vars$Confirmed
X <- num_vars %>% select(-Confirmed)
head(num_vars)
model <- lm(Confirmed ~ ., data = num_vars)
summary(model)
## Warning in summary.lm(model): essentially perfect fit: summary may be
## unreliable
##
## Call:
## lm(formula = Confirmed ~ ., data = num_vars)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.616e-09 3.920e-12 7.700e-12 1.343e-11 3.002e-10
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.660e-12 9.534e-12 2.790e-01 0.781
## Deaths 1.000e+00 1.942e-15 5.150e+14 <2e-16 ***
## Recovered 1.000e+00 1.579e-16 6.333e+15 <2e-16 ***
## Active 1.000e+00 1.480e-16 6.758e+15 <2e-16 ***
## New.cases -3.976e-15 8.947e-15 -4.440e-01 0.657
## New.deaths 3.480e-14 2.372e-13 1.470e-01 0.884
## New.recovered -1.301e-15 1.071e-14 -1.210e-01 0.903
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.238e-10 on 180 degrees of freedom
## Multiple R-squared: 1, Adjusted R-squared: 1
## F-statistic: 2.97e+32 on 6 and 180 DF, p-value: < 2.2e-16
Výsledok obsahuje varovanie:
essentially perfect fit: summary may be unreliable
To naznačuje dokonalú (perfect)
multikolinearitu.
Premenná Confirmed je prakticky presnou lineárnou kombináciou
premenných:
Preto koeficienty pri týchto premenných vychádzajú presne
1, rezíduá sú takmer nulové
a \(R^2 = 1\).
Model preto nie je interpretovateľný, keďže nejde o
štatistický odhad, ale o zabudovanú aritmetickú identitu.
cor_matrix <- round(cor(X, use = "complete.obs"), 2)
cor_matrix
## Deaths Recovered Active New.cases New.deaths New.recovered
## Deaths 1.00 0.83 0.87 0.81 0.81 0.77
## Recovered 0.83 1.00 0.68 0.82 0.82 0.92
## Active 0.87 0.68 1.00 0.85 0.78 0.67
## New.cases 0.81 0.82 0.85 1.00 0.94 0.91
## New.deaths 0.81 0.82 0.78 0.94 1.00 0.89
## New.recovered 0.77 0.92 0.67 0.91 0.89 1.00
Hodnoty korelácií medzi väčšinou premenných sú vysoké (0.7–0.95), čo
potvrdzuje silnú lineárnu väzbu.
Napríklad:
Takéto hodnoty výrazne prispievajú k multikolinearite.
cor_long <- melt(cor_matrix)
ggplot(cor_long, aes(Var1, Var2, fill = value)) +
geom_tile() +
scale_fill_gradient2(low = "blue", high = "red", mid = "white",
midpoint = 0, limit = c(-1, 1)) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90)) +
labs(title = "Heatmap korelácií medzi premennými")
Graf ukazuje, že takmer všetky páry premenných vykazujú silnú kladnú
koreláciu
(červené oblasti).
To je typické pre epidemiologické ukazovatele – mnohé z nich sledujú tú
istú dynamiku šírenia choroby.
vif(model)
## Warning in summary.lm(object, ...): essentially perfect fit: summary may be
## unreliable
## Deaths Recovered Active New.cases New.deaths
## 9.091737 10.937277 12.084538 31.661012 9.834389
## New.recovered
## 24.523119
VIF hodnoty:
Bežné pravidlá:
Dáta jednoznačne spĺňajú silnú multikolineritu.
Hodnoty nad 30 sú extrémne a znamenajú, že regresné odhady sú veľmi
nestabilné.
X_scaled <- scale(X)
eigen_vals <- eigen(t(X_scaled) %*% X_scaled)$values
condition_number <- sqrt(max(eigen_vals) / min(eigen_vals))
condition_number
## [1] 17.67078
Vypočítaná hodnota:
Interpretácia:
30 → extrémna multikolinearita
Hodnota 17.7 znamená vážnu multikolinearitu, no nie
ešte extrémnu.
V kombinácii s VIF však potvrdzuje, že regresný model nie je
spoľahlivý.
sort(vif(model), decreasing = TRUE)
## Warning in summary.lm(object, ...): essentially perfect fit: summary may be
## unreliable
## New.cases New.recovered Active Recovered New.deaths
## 31.661012 24.523119 12.084538 10.937277 9.834389
## Deaths
## 9.091737
Najvyššie VIF majú:
Tieto premenné sú štatisticky prebytočné – vysoko korelované a navzájom si konkurujú pri vysvetľovaní Confirmed.
Analýza ukázala veľmi silnú multikolineritu:
Dôsledky multikolinearity:
Možné riešenia: