1. Úvod

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.


2. Príprava údajov

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)

3. Viacnásobná lineárna regresia

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

Komentár k regresii

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:

  • Confirmed = Deaths + Recovered + Active

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.


4. Multikolinearita

4.1 Korelačná matica

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

Komentár

Hodnoty korelácií medzi väčšinou premenných sú vysoké (0.7–0.95), čo potvrdzuje silnú lineárnu väzbu.
Napríklad:

  • Deaths – Recovered: 0.83
  • Active – New cases: 0.85
  • New cases – New deaths: 0.94

Takéto hodnoty výrazne prispievajú k multikolinearite.


4.2 Heatmap korelácií

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")

Komentár

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.


4.3 VIF – Variance Inflation Factor

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

Komentár

VIF hodnoty:

  • New.cases: ~31.7
  • New.recovered: ~24.5
  • Active: ~12.1
  • Recovered: ~10.9
  • Deaths: ~9.1

Bežné pravidlá:

  • VIF > 5 → začínajúci problém
  • VIF > 10 → závažná multikolinearita

Dáta jednoznačne spĺňajú silnú multikolineritu.
Hodnoty nad 30 sú extrémne a znamenajú, že regresné odhady sú veľmi nestabilné.


4.4 Condition Number

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

Komentár

Vypočítaná hodnota:

  • Condition Number ≈ 17.7

Interpretácia:

  • < 10 → žiadna multikolinearita
  • 10–30 → mierna až silná multikolinearita
  • 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ý.


4.5 Najproblematickejšie premenné podľa VIF

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

Komentár

Najvyššie VIF majú:

  1. New.cases
  2. New.recovered
  3. Active
  4. Recovered
  5. Deaths

Tieto premenné sú štatisticky prebytočné – vysoko korelované a navzájom si konkurujú pri vysvetľovaní Confirmed.


5. Záver

Analýza ukázala veľmi silnú multikolineritu:

Dôsledky multikolinearity:

Možné riešenia: