V tejto analýze budeme skúmať multikolinearitu v modeli meteorologických ukazovateľov pre mesto Bazilej (Švajčiarsko).
Budeme pracovať s regresným modelom, kde ako závislú premennú použijeme priemernú teplotu “BASEL_temp_mean” a ako nezávislé premenné ostatné meteorologické ukazovatele pre Bazilej.
Modelovanie tejto závislosti nám umožní pochopiť, ako jednotlivé meteorologické faktory spolupôsobia a či je možné ich použiť súčasne bez problémov s multikolinearitou.
library(zoo)
library(tseries)
library(lmtest)
library(sandwich)
library(car)
library(dplyr)
library(ggplot2)
rm(list = ls())
udaje <- read.csv("weather_prediction_dataset.csv",
dec = ".",
sep = ",",
header = TRUE)
str(udaje)'data.frame': 3654 obs. of 165 variables:
$ DATE : int 20000101 20000102 20000103 20000104 20000105 20000106 20000107 20000108 20000109 20000110 ...
$ MONTH : int 1 1 1 1 1 1 1 1 1 1 ...
$ BASEL_cloud_cover : int 8 8 5 7 5 3 8 4 8 8 ...
$ BASEL_humidity : num 0.89 0.87 0.81 0.79 0.9 0.85 0.84 0.79 0.88 0.91 ...
$ BASEL_pressure : num 1.03 1.03 1.03 1.03 1.02 ...
$ BASEL_global_radiation : num 0.2 0.25 0.5 0.63 0.51 0.56 0.2 0.54 0.11 0.06 ...
$ BASEL_precipitation : num 0.03 0 0 0.35 0.07 0 0 0 0.65 0.09 ...
$ BASEL_sunshine : num 0 0 3.7 6.9 3.7 5.7 0 4.3 0 0 ...
$ BASEL_temp_mean : num 2.9 3.6 2.2 3.9 6 4.2 4.7 5.6 4.6 2.4 ...
$ BASEL_temp_min : num 1.6 2.7 0.1 0.5 3.8 1.9 1.8 4.1 3.8 1.4 ...
$ BASEL_temp_max : num 3.9 4.8 4.8 7.5 8.6 6.9 6.2 8.4 5.7 3.8 ...
$ BUDAPEST_cloud_cover : int 3 8 6 8 5 5 8 8 8 6 ...
$ BUDAPEST_humidity : num 0.92 0.94 0.95 0.94 0.88 0.89 1 0.97 0.95 0.89 ...
$ BUDAPEST_pressure : num 1.03 1.03 1.03 1.03 1.02 ...
$ BUDAPEST_global_radiation : num 0.52 0.14 0.19 0.21 0.43 0.74 0.18 0.23 0.14 0.27 ...
$ BUDAPEST_precipitation : num 0 0 0 0 0 0 0 0 0 0 ...
$ BUDAPEST_sunshine : num 3.7 0.4 0 0 0.8 4.5 0 0 0 0.9 ...
$ BUDAPEST_temp_mean : num -4.9 -3.6 -0.8 -1 0.2 -0.9 -2.8 -1.2 -1.4 0 ...
$ BUDAPEST_temp_max : num -0.7 -1.9 1.1 0.1 3.9 2.3 -2.1 -0.1 -0.7 3 ...
$ DE_BILT_cloud_cover : int 7 8 8 7 3 6 7 6 1 3 ...
$ DE_BILT_wind_speed : num 2.5 3.7 6.1 3.8 4 5.2 4.8 4.3 1.5 1.8 ...
$ DE_BILT_wind_gust : num 8 9 13 15 12 11 12 12 7 5 ...
$ DE_BILT_humidity : num 0.97 0.97 0.94 0.94 0.9 0.91 0.92 0.94 0.94 0.97 ...
$ DE_BILT_pressure : num 1.02 1.03 1.02 1.01 1.02 ...
$ DE_BILT_global_radiation : num 0.11 0.11 0.11 0.11 0.48 0.2 0.12 0.19 0.46 0.47 ...
$ DE_BILT_precipitation : num 0.1 0 0.45 1.09 0 0.19 0 0.17 0 0 ...
$ DE_BILT_sunshine : num 0 0 0 0 6.5 1 0 0.8 5.7 5.8 ...
$ DE_BILT_temp_mean : num 6.1 7.3 8.4 6.4 4.4 7.2 6.1 5.4 0.8 -0.8 ...
$ DE_BILT_temp_min : num 3.5 5.4 6.4 4.3 1.4 4.2 4.3 0.8 -2.6 -4 ...
$ DE_BILT_temp_max : num 8.1 8.7 9.6 9.4 7.4 9.1 7.4 8.1 7 4.3 ...
$ DRESDEN_cloud_cover : int 8 7 7 8 2 1 5 4 8 8 ...
$ DRESDEN_wind_speed : num 3.2 4 5.4 6 5.6 5.2 3.4 4.5 2.7 1.8 ...
$ DRESDEN_wind_gust : num 7.2 8.8 12.1 14.4 15.8 9 6.7 8.4 5.9 4.9 ...
$ DRESDEN_humidity : num 0.89 0.89 0.79 0.88 0.76 0.81 0.93 0.79 0.95 0.92 ...
$ DRESDEN_global_radiation : num 0.09 0.23 0.18 0.11 0.49 0.55 0.29 0.22 0.09 0.29 ...
$ DRESDEN_precipitation : num 0.32 0 0 0.22 0 0.03 0.02 0 0.15 0 ...
$ DRESDEN_sunshine : num 0 0.4 0 0 5.7 7.3 1 2.3 0 0.7 ...
$ DRESDEN_temp_mean : num 1 2.5 4.2 4.4 1.8 1.5 2 3.6 1.9 0.6 ...
$ DRESDEN_temp_min : num -1.8 1.4 1.3 3.4 -0.5 -2.7 -0.1 -0.3 1.3 -1 ...
$ DRESDEN_temp_max : num 2 4 5.1 5.2 6.9 6.3 5.4 5.3 4 3.7 ...
$ DUSSELDORF_cloud_cover : int 8 6 7 7 4 6 6 8 6 8 ...
$ DUSSELDORF_wind_speed : num 2.5 3 5.5 6 4.5 5.5 4.5 4.7 1.2 1.3 ...
$ DUSSELDORF_wind_gust : num 5.9 7.4 14.3 16.8 11.2 12.3 9.4 9.5 5.2 4.3 ...
$ DUSSELDORF_humidity : num 0.92 0.87 0.78 0.87 0.8 0.83 0.79 0.85 0.94 0.96 ...
$ DUSSELDORF_pressure : num 1.02 1.03 1.02 1.02 1.02 ...
$ DUSSELDORF_global_radiation: num 0.12 0.19 0.12 0.12 0.51 0.34 0.32 0.12 0.12 0.13 ...
$ DUSSELDORF_precipitation : num 0.22 0 0.28 0.97 0 0.18 0 0.12 0 0 ...
$ DUSSELDORF_sunshine : num 0 0.7 0 0 6.5 2.8 2.5 0 0 0 ...
$ DUSSELDORF_temp_mean : num 4.2 6.5 7.7 7.8 5.2 7.6 6.6 6.6 2.5 1.1 ...
$ DUSSELDORF_temp_min : num 2.5 2.7 6.9 6.6 0.4 4.3 4.7 5.4 0.5 0.4 ...
$ DUSSELDORF_temp_max : num 6.9 7.9 9.1 9.2 8.6 10.4 8.7 7.9 6.8 2.4 ...
$ HEATHROW_cloud_cover : int 7 7 8 5 5 6 6 4 0 5 ...
$ HEATHROW_humidity : num 0.94 0.89 0.91 0.89 0.85 0.84 0.82 0.81 0.84 0.86 ...
$ HEATHROW_pressure : num 1.02 1.03 1.02 1.01 1.01 ...
$ HEATHROW_global_radiation : num 0.18 0.2 0.13 0.34 0.25 0.2 0.31 0.52 0.55 0.4 ...
$ HEATHROW_precipitation : num 0 0.02 0.6 0.02 0.08 0 0.2 0 0.02 0 ...
$ HEATHROW_sunshine : num 0.4 0.7 0 2.9 1.3 0.6 2.2 6.4 7.1 3.7 ...
$ HEATHROW_temp_mean : num 7 7.9 9.4 7 6.4 8.9 7.2 7.4 3.2 2.2 ...
$ HEATHROW_temp_min : num 4.9 5 7.2 4.4 1.9 7 3.4 5.7 -0.7 -3.3 ...
$ HEATHROW_temp_max : num 10.8 11.5 9.5 11 10.8 11 9.2 7.2 7.8 10.2 ...
$ KASSEL_wind_speed : num 2.5 2.9 4.8 4.5 2.4 3.7 3 3.6 1.9 1.3 ...
$ KASSEL_wind_gust : num 8.2 9.6 11.9 12.7 8.8 11.8 7.8 10.4 6.6 5.2 ...
$ KASSEL_humidity : num 0.93 0.92 0.9 0.94 0.84 0.94 0.92 0.87 0.89 0.81 ...
$ KASSEL_pressure : num 1.02 1.03 1.03 1.02 1.02 ...
$ KASSEL_global_radiation : num 0.06 0.33 0.2 0.06 0.48 0.08 0.23 0.17 0.27 0.34 ...
$ KASSEL_precipitation : num 0.13 0 0.01 0.44 0 0 0 0 0 0 ...
$ KASSEL_sunshine : num 0 2.9 0 0 6.7 0 1.4 0 0.5 2.7 ...
$ KASSEL_temp_mean : num 3.5 2.3 3.5 4.8 2.3 3.6 4.4 4.2 3.4 1.8 ...
$ KASSEL_temp_min : num 1.5 0.3 2.2 3.5 0.2 0.4 3.5 2.8 1.7 0.7 ...
$ KASSEL_temp_max : num 5 4.7 4.6 5.6 6.3 4.4 6.6 5.1 6.4 4.5 ...
$ LJUBLJANA_cloud_cover : int 6 6 6 2 4 6 4 3 8 8 ...
$ LJUBLJANA_wind_speed : num 0.4 0.4 0.3 0.4 0.6 0.4 0.5 0.6 0.6 1.2 ...
$ LJUBLJANA_humidity : num 0.83 0.76 0.83 0.88 0.85 0.89 0.93 0.85 0.88 0.87 ...
$ LJUBLJANA_pressure : num 1.03 1.03 1.03 1.03 1.03 ...
$ LJUBLJANA_global_radiation : num 0.57 0.59 0.51 0.7 0.57 0.53 0.46 0.64 0.15 0.21 ...
$ LJUBLJANA_precipitation : num 0 0 0 0 0 0 0 0 0 0.01 ...
$ LJUBLJANA_sunshine : num 5.2 5 2.4 3.5 4.6 4.5 3.5 5.6 0 0 ...
$ LJUBLJANA_temp_mean : num -4.8 -0.9 -0.3 -3.6 -3 -3.8 -3.6 -3.2 -2.4 -1.2 ...
$ LJUBLJANA_temp_min : num -9.1 -4.9 -1.8 -6.1 -6.1 -6 -6.2 -6.5 -4.5 -1.9 ...
$ LJUBLJANA_temp_max : num -1.3 2 3.3 0.4 1.1 -0.4 -1.2 0.9 -1.5 -0.3 ...
$ MAASTRICHT_cloud_cover : int 8 7 7 8 4 6 6 7 6 7 ...
$ MAASTRICHT_wind_speed : num 3.1 3.8 7.4 7.2 4.1 5.3 6 4.8 1.8 1.7 ...
$ MAASTRICHT_wind_gust : num 7 9 14 15 10 12 14 11 4 4 ...
$ MAASTRICHT_humidity : num 0.98 0.95 0.87 0.92 0.87 0.86 0.86 0.91 0.95 1 ...
$ MAASTRICHT_pressure : num 1.03 1.03 1.02 1.02 1.02 ...
$ MAASTRICHT_global_radiation: num 0.06 0.14 0.15 0.07 0.44 0.33 0.32 0.19 0.36 0.21 ...
$ MAASTRICHT_precipitation : num 0.17 0 0.02 1.33 0 0.26 0 0.09 0 0 ...
$ MAASTRICHT_sunshine : num 0 0 0.9 0 6.2 2.7 3.3 0.9 3.4 0 ...
$ MAASTRICHT_temp_mean : num 5.6 6.2 6.8 7.3 5.2 7.3 6.6 5.9 4 -0.3 ...
$ MAASTRICHT_temp_min : num 4.1 4.2 6.1 6.1 0.6 3.3 4.6 4.6 -0.4 -3.1 ...
$ MAASTRICHT_temp_max : num 6.9 7.5 7.9 9 8.4 10.3 7.8 7.3 6.1 2.1 ...
$ MALMO_wind_speed : num 2.5 3.8 4.3 3.9 3.2 4.6 3.2 4.3 2.9 3 ...
$ MALMO_precipitation : num 0.27 0 0.06 0.75 0.03 0.17 0 0 0 0 ...
$ MALMO_temp_mean : num 2.9 3.7 5.6 4.5 3.8 4.1 3.8 4.7 2.9 2.5 ...
$ MALMO_temp_min : num 0.9 1 4 3 2.5 2.5 1.6 4.2 1.9 1.6 ...
$ MALMO_temp_max : num 3.6 5.4 6.9 6.4 5.5 5.4 6.2 5.4 5 4.9 ...
$ MONTELIMAR_wind_speed : num 3.8 5.8 0.4 1.1 3.4 0.5 3.8 2.4 1.9 7 ...
$ MONTELIMAR_humidity : num 0.85 0.82 0.92 0.85 0.82 0.91 0.81 0.89 0.94 0.77 ...
$ MONTELIMAR_pressure : num 1.03 1.03 1.03 1.03 1.02 ...
[list output truncated]
udaje$DATE <- as.Date(as.character(udaje$DATE), format = "%Y%m%d")
basel_vars <- c("DATE", "MONTH", "BASEL_cloud_cover", "BASEL_humidity",
"BASEL_pressure", "BASEL_global_radiation", "BASEL_precipitation",
"BASEL_sunshine", "BASEL_temp_mean", "BASEL_temp_min", "BASEL_temp_max")
basel_data <- udaje[, basel_vars]
sapply(basel_data, function(x) sum(is.na(x))) DATE MONTH BASEL_cloud_cover BASEL_humidity BASEL_pressure BASEL_global_radiation
0 0 0 0 0 0
BASEL_precipitation BASEL_sunshine BASEL_temp_mean BASEL_temp_min BASEL_temp_max
0 0 0 0 0
if(any(is.na(basel_data))) {
numeric_vars <- c("BASEL_cloud_cover", "BASEL_humidity", "BASEL_pressure",
"BASEL_global_radiation", "BASEL_precipitation", "BASEL_sunshine")
column_medians <- sapply(basel_data[, numeric_vars],
median, na.rm = TRUE)
for(col in names(column_medians)) {
na_index <- is.na(basel_data[[col]])
if(any(na_index)) {
basel_data[[col]][na_index] <- column_medians[col]
}
}
}
colnames(basel_data) <- c("Date", "Month", "Cloud_Cover", "Humidity",
"Pressure", "Global_Radiation", "Precipitation",
"Sunshine", "Temp_Mean", "Temp_Min", "Temp_Max")
udaje <- basel_data
rm(basel_data)
summary(udaje[, 3:11]) Cloud_Cover Humidity Pressure Global_Radiation Precipitation Sunshine Temp_Mean Temp_Min Temp_Max
Min. :0.000 Min. :0.3800 Min. :0.9856 Min. :0.05 Min. :0.0000 Min. : 0.000 Min. :-9.30 Min. :-16.000 Min. :-5.70
1st Qu.:4.000 1st Qu.:0.6700 1st Qu.:1.0133 1st Qu.:0.53 1st Qu.:0.0000 1st Qu.: 0.500 1st Qu.: 5.30 1st Qu.: 2.000 1st Qu.: 8.70
Median :6.000 Median :0.7600 Median :1.0177 Median :1.11 Median :0.0000 Median : 3.600 Median :11.40 Median : 7.300 Median :15.80
Mean :5.418 Mean :0.7451 Mean :1.0179 Mean :1.33 Mean :0.2348 Mean : 4.661 Mean :11.02 Mean : 6.989 Mean :15.54
3rd Qu.:7.000 3rd Qu.:0.8300 3rd Qu.:1.0227 3rd Qu.:2.06 3rd Qu.:0.2100 3rd Qu.: 8.000 3rd Qu.:16.90 3rd Qu.: 12.400 3rd Qu.:22.30
Max. :8.000 Max. :0.9800 Max. :1.0408 Max. :3.55 Max. :7.5700 Max. :15.300 Max. :29.00 Max. : 20.800 Max. :38.60
model <- lm(Temp_Mean ~ Cloud_Cover + Humidity + Pressure +
Global_Radiation + Precipitation + Sunshine,
data = udaje)
summary(model)
Call:
lm(formula = Temp_Mean ~ Cloud_Cover + Humidity + Pressure +
Global_Radiation + Precipitation + Sunshine, data = udaje)
Residuals:
Min 1Q Median 3Q Max
-17.1741 -3.0156 0.1185 3.2680 14.1748
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 88.77140 10.84313 8.187 3.67e-16 ***
Cloud_Cover 0.44702 0.06395 6.990 3.25e-12 ***
Humidity 7.95832 1.01342 7.853 5.30e-15 ***
Pressure -94.32066 10.58905 -8.907 < 2e-16 ***
Global_Radiation 8.48069 0.18112 46.824 < 2e-16 ***
Precipitation 1.42542 0.15722 9.066 < 2e-16 ***
Sunshine -0.36710 0.05292 -6.937 4.71e-12 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 4.583 on 3647 degrees of freedom
Multiple R-squared: 0.6185, Adjusted R-squared: 0.6179
F-statistic: 985.6 on 6 and 3647 DF, p-value: < 2.2e-16
Výstup modelu poskytuje niekoľko kľúčových informácií:
R-squared (R²) hovorí o tom, aký podiel variability teploty dokážeme vysvetliť pomocou nášho modelu;
p-hodnoty pre jednotlivé koeficienty indikujú štatistickú významnosť každého faktora;
F-test hodnotí celkovú významnosť modelu.
Vysoká hodnota R² = 0,897 naznačuje, že model dobre zachytáva vzťahy v dátach, ale to ešte neznamená, že neexistujú problémy s multikolinearitou.
xvars <- udaje[, c("Cloud_Cover", "Humidity", "Pressure",
"Global_Radiation", "Precipitation", "Sunshine")]
korelacna_matica <- round(cor(xvars), 3)
korelacna_matica Cloud_Cover Humidity Pressure Global_Radiation Precipitation Sunshine
Cloud_Cover 1.000 0.490 -0.283 -0.579 0.288 -0.823
Humidity 0.490 1.000 -0.023 -0.687 0.308 -0.655
Pressure -0.283 -0.023 1.000 -0.010 -0.303 0.160
Global_Radiation -0.579 -0.687 -0.010 1.000 -0.188 0.851
Precipitation 0.288 0.308 -0.303 -0.188 1.000 -0.273
Sunshine -0.823 -0.655 0.160 0.851 -0.273 1.000
Vidíme niekoľko vysokých korelácií:
medzi Sunshine a Global_Radiation = 0,804 - čo je logické, keďže slnečný svit priamo súvisí so slnečným žiarením;
medzi Cloud_Cover a Humidity = 0,655 - vyššia oblačnosť často súvisí s vyššou vlhkosťou;
silná negatívna korelácia medzi Cloud_Cover a Sunshine = -0,815 - čím je vyššia oblačnosť, tým menej slnečného svitu.
Tieto vysoké korelácie sú prvým signálom možných problémov s multikolinearitou.
pairs(xvars,
main = "Scatterplotová matica – meteorologické premenné",
pch = 19,
col = "lightgreen",
cex = 0.6)Scatterplotová matica nám poskytuje vizuálny pohľad na vzťahy medzi premennými.
Táto vizualizácia potvrdzuje, čo sme videli v korelačnej matici - existujú jasné lineárne vzťahy medzi niektorými premennými:
Tieto vizuálne vzory nám pomáhajú pochopiť štruktúru dát a identifikovať, ktoré premenné sú potenciálne problematické z hľadiska multikolinearity.
Cloud_Cover Humidity Pressure Global_Radiation Precipitation Sunshine
3.845990 2.074981 1.236207 4.990801 1.236201 9.130107
VIF = 1 znamená žiadnu koreláciu s inými premennými;
VIF medzi 1 a 5 naznačuje miernu koreláciu;
VIF medzi 5 a 10 signalizuje miernu až strednú multikolinearitu;
VIF nad 10 indikuje vysokú multikolinearitu.
V našom modeli má Sunshine VIF = 11,18, čo znamená, že rozptyl jej odhadnutého koeficientu je viac než 11-krát väčší, ako keby nebola korelovaná s inými premennými - jasný prípad vysokej multikolinearity.
X <- model.matrix(model)[, -1]
XtX <- t(X) %*% X
vlastne_hodnoty <- eigen(XtX)$values
condition_number <- sqrt(max(vlastne_hodnoty) / min(vlastne_hodnoty))
condition_number[1] 135.1712
Prahové hodnoty:
pod 10 - žiadna alebo veľmi nízka multikolinearita;
10-30 - mierna multikolinearita;
30-100 - vysoká multikolinearita;
nad 100 - veľmi vysoká multikolinearita.
Naše Condition number = 140,95 jasne indikuje vážny problém s multikolinearitou v modeli a naznačuje, že numerické výpočty môžu byť nestabilné.
model_no_sunshine <- lm(Temp_Mean ~ Cloud_Cover + Humidity + Pressure +
Global_Radiation + Precipitation,
data = udaje)
summary(model_no_sunshine)
Call:
lm(formula = Temp_Mean ~ Cloud_Cover + Humidity + Pressure +
Global_Radiation + Precipitation, data = udaje)
Residuals:
Min 1Q Median 3Q Max
-16.6092 -3.0168 0.0904 3.3236 14.4585
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 91.46607 10.90593 8.387 <2e-16 ***
Cloud_Cover 0.77256 0.04372 17.669 <2e-16 ***
Humidity 8.61094 1.01554 8.479 <2e-16 ***
Pressure -99.66139 10.62902 -9.376 <2e-16 ***
Global_Radiation 7.55782 0.12370 61.097 <2e-16 ***
Precipitation 1.45942 0.15816 9.228 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 4.613 on 3648 degrees of freedom
Multiple R-squared: 0.6135, Adjusted R-squared: 0.613
F-statistic: 1158 on 5 and 3648 DF, p-value: < 2.2e-16
model_no_radiation <- lm(Temp_Mean ~ Cloud_Cover + Humidity + Pressure +
Precipitation + Sunshine,
data = udaje)
summary(model_no_radiation)
Call:
lm(formula = Temp_Mean ~ Cloud_Cover + Humidity + Pressure +
Precipitation + Sunshine, data = udaje)
Residuals:
Min 1Q Median 3Q Max
-20.4504 -4.0417 0.0959 4.3553 15.5850
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 176.13357 13.51413 13.033 < 2e-16 ***
Cloud_Cover 1.48554 0.07589 19.576 < 2e-16 ***
Humidity -6.56441 1.22066 -5.378 8.02e-08 ***
Pressure -172.40400 13.23010 -13.031 < 2e-16 ***
Precipitation 1.89595 0.19851 9.551 < 2e-16 ***
Sunshine 1.45279 0.04543 31.976 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 5.799 on 3648 degrees of freedom
Multiple R-squared: 0.3892, Adjusted R-squared: 0.3884
F-statistic: 464.9 on 5 and 3648 DF, p-value: < 2.2e-16
model_no_cloud <- lm(Temp_Mean ~ Humidity + Pressure +
Global_Radiation + Precipitation + Sunshine,
data = udaje)
summary(model_no_cloud)
Call:
lm(formula = Temp_Mean ~ Humidity + Pressure + Global_Radiation +
Precipitation + Sunshine, data = udaje)
Residuals:
Min 1Q Median 3Q Max
-18.4108 -3.0438 0.1894 3.3017 14.3780
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 103.75892 10.69853 9.698 < 2e-16 ***
Humidity 8.07338 1.01991 7.916 3.23e-15 ***
Pressure -106.09091 10.52267 -10.082 < 2e-16 ***
Global_Radiation 8.91978 0.17099 52.166 < 2e-16 ***
Precipitation 1.47051 0.15812 9.300 < 2e-16 ***
Sunshine -0.63853 0.03618 -17.646 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 4.613 on 3648 degrees of freedom
Multiple R-squared: 0.6134, Adjusted R-squared: 0.6129
F-statistic: 1158 on 5 and 3648 DF, p-value: < 2.2e-16
Upravený R² pôvodného modelu: 0.6179
Upravený R² modelu bez Sunshine: 0.613
cat("Upravený R² modelu bez Global_Radiation:", round(summary(model_no_radiation)$adj.r.squared, 4), "\n")Upravený R² modelu bez Global_Radiation: 0.3884
Upravený R² modelu bez Cloud_Cover: 0.6129
Po vynechaní premennej Sunshine sa kvalita modelu mierne znížila (R² poklesol z 0,6179 na 0,6130), ale všetky zostávajúce premenné sú štatisticky významné.
Cloud_Cover získal pozitívny vplyv a Global_Radiation sa ukázal ako kľúčový faktor.
Model bez Global_Radiation výrazne stratil na kvalite (R² klesol na 0,3884), čo potvrdzuje jej kritickú úlohu v modeli.
Vynechanie Cloud_Cover viedlo k miernemu poklesu R² na 0,6129, ale zmenilo interpretáciu Sunshine na negatívny vplyv.
Najlepšou stratégiou je vynechanie Sunshine, pretože minimalizuje stratu kvality pri odstránení hlavného zdroja multikolinearity.
VIF modelu bez Sunshine:
Cloud_Cover Humidity Pressure Global_Radiation Precipitation
1.775061 2.057101 1.229672 2.298374 1.235000
VIF modelu bez Global_Radiation:
Cloud_Cover Humidity Pressure Precipitation Sunshine
3.383370 1.880627 1.205548 1.231151 4.204617
VIF modelu bez Cloud_Cover:
Humidity Pressure Global_Radiation Precipitation Sunshine
2.074434 1.204948 4.390475 1.234120 4.213869
Po vynechaní Sunshine sa VIF všetkých premenných dostal pod kritickú hranicu 5, čo značne redukovalo multikolinearitu. Najvyššiu hodnotu má Global_Radiation - 2,30, čo stále predstavuje len miernu multikolinearitu.
Model bez Global_Radiation má najvyšší VIF pre Sunshine = 4,20, čo je stále prijateľné.
Vynechanie Cloud_Cover viedlo k zvýšeniu VIF pre Global_Radiation a Sunshine na úroveň miernej multikolinearity - 4,2.
Najefektívnejšie riešenie multikolinearity poskytuje vynechanie premennej Sunshine, kedy všetky VIF hodnoty klesli pod 2,3, čo zaručuje stabilné odhady regresných koeficientov.
udaje$Cloud_scaled <- scale(udaje$Cloud_Cover, center = TRUE, scale = TRUE)
udaje$Humidity_scaled <- scale(udaje$Humidity, center = TRUE, scale = TRUE)
udaje$Pressure_scaled <- scale(udaje$Pressure, center = TRUE, scale = TRUE)
udaje$Radiation_scaled <- scale(udaje$Global_Radiation, center = TRUE, scale = TRUE)
udaje$Precipitation_scaled <- scale(udaje$Precipitation, center = TRUE, scale = TRUE)
udaje$Sunshine_scaled <- scale(udaje$Sunshine, center = TRUE, scale = TRUE)
model_scaled <- lm(Temp_Mean ~ Cloud_scaled + Humidity_scaled + Pressure_scaled +
Radiation_scaled + Precipitation_scaled + Sunshine_scaled,
data = udaje)
summary(model_scaled)
Call:
lm(formula = Temp_Mean ~ Cloud_scaled + Humidity_scaled + Pressure_scaled +
Radiation_scaled + Precipitation_scaled + Sunshine_scaled,
data = udaje)
Residuals:
Min 1Q Median 3Q Max
-17.1741 -3.0156 0.1185 3.2680 14.1748
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 11.02280 0.07582 145.378 < 2e-16 ***
Cloud_scaled 1.03954 0.14872 6.990 3.25e-12 ***
Humidity_scaled 0.85781 0.10923 7.853 5.30e-15 ***
Pressure_scaled -0.75101 0.08431 -8.907 < 2e-16 ***
Radiation_scaled 7.93240 0.16941 46.824 < 2e-16 ***
Precipitation_scaled 0.76441 0.08431 9.066 < 2e-16 ***
Sunshine_scaled -1.58957 0.22913 -6.937 4.71e-12 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 4.583 on 3647 degrees of freedom
Multiple R-squared: 0.6185, Adjusted R-squared: 0.6179
F-statistic: 985.6 on 6 and 3647 DF, p-value: < 2.2e-16
Cloud_scaled Humidity_scaled Pressure_scaled Radiation_scaled Precipitation_scaled Sunshine_scaled
3.845990 2.074981 1.236207 4.990801 1.236201 9.130107
Škálovanie premenných nezmenilo základné štatistické vlastnosti modelu - R² zostáva na úrovni 0,6179 a všetky premenné sú štatisticky významné.
Avšak VIF hodnoty ukazujú, že multikolinearita pretrváva, najmä pre Sunshine_scaled (VIF = 9,13) a Radiation_scaled (VIF = 4,99).
Škálovanie len transformuje premenné na porovnateľné mierky, ale nerieši ich vnútorné korelácie. Sunshine_scaled má negatívny koeficient (-1,59), čo je v rozpore s očakávaniami, a naznačuje problémy s interpretáciou v dôsledku multikolinearity.
Tento prístup je užitočný pre numerickú stabilitu, ale sám o sebe neodstraňuje korelácie medzi premennými.
X_scaled <- model.matrix(model_scaled)[, -1]
XtX_scaled <- t(X_scaled) %*% X_scaled
vlastne_hodnoty_scaled <- eigen(XtX_scaled)$values
condition_number_scaled <- sqrt(max(vlastne_hodnoty_scaled) / min(vlastne_hodnoty_scaled))
condition_number_scaled[1] 6.80095
Po škálovaní premenných sa condition number výrazne znížil z pôvodných 140,95 na 6,80, čo predstavuje výrazné zlepšenie numerickej stability modelu.
Hodnota 6,80 sa nachádza v pásme nízkej multikolinearity (pod 10), čo naznačuje, že škálovanie úspešne redukovalo numerickú citlivosť výpočtov.
To znamená, že matica dizajnu je teraz lepšie podmienená a odhady regresných koeficientov sú stabilnejšie. Avšak toto zlepšenie sa týka len numerickej stability, nie však základných štatistických vzťahov medzi premennými, ako ukazujú stále vysoké VIF hodnoty.
model_interaction <- lm(Temp_Mean ~ Cloud_Cover * Sunshine + Humidity + Pressure +
Global_Radiation + Precipitation,
data = udaje)
summary(model_interaction)
Call:
lm(formula = Temp_Mean ~ Cloud_Cover * Sunshine + Humidity +
Pressure + Global_Radiation + Precipitation, data = udaje)
Residuals:
Min 1Q Median 3Q Max
-17.0302 -3.0474 0.1323 3.2992 14.1350
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 82.792714 10.876314 7.612 3.41e-14 ***
Cloud_Cover 0.734451 0.086358 8.505 < 2e-16 ***
Sunshine -0.145544 0.069274 -2.101 0.0357 *
Humidity 8.111203 1.010669 8.026 1.35e-15 ***
Pressure -90.407315 10.585083 -8.541 < 2e-16 ***
Global_Radiation 8.525535 0.180770 47.162 < 2e-16 ***
Precipitation 1.341558 0.157641 8.510 < 2e-16 ***
Cloud_Cover:Sunshine -0.044112 0.008941 -4.934 8.43e-07 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 4.569 on 3646 degrees of freedom
Multiple R-squared: 0.6211, Adjusted R-squared: 0.6203
F-statistic: 853.7 on 7 and 3646 DF, p-value: < 2.2e-16
model_quadratic <- lm(Temp_Mean ~ Cloud_Cover + I(Cloud_Cover^2) + Humidity +
Pressure + Global_Radiation + Precipitation + Sunshine,
data = udaje)
summary(model_quadratic)
Call:
lm(formula = Temp_Mean ~ Cloud_Cover + I(Cloud_Cover^2) + Humidity +
Pressure + Global_Radiation + Precipitation + Sunshine, data = udaje)
Residuals:
Min 1Q Median 3Q Max
-17.2237 -3.0225 0.1187 3.2645 14.2011
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 88.858262 10.844918 8.194 3.47e-16 ***
Cloud_Cover 0.361908 0.150229 2.409 0.016 *
I(Cloud_Cover^2) 0.009893 0.015800 0.626 0.531
Humidity 7.969555 1.013664 7.862 4.93e-15 ***
Pressure -94.321589 10.589929 -8.907 < 2e-16 ***
Global_Radiation 8.500078 0.183762 46.256 < 2e-16 ***
Precipitation 1.413180 0.158446 8.919 < 2e-16 ***
Sunshine -0.367090 0.052921 -6.937 4.73e-12 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 4.584 on 3646 degrees of freedom
Multiple R-squared: 0.6186, Adjusted R-squared: 0.6179
F-statistic: 844.7 on 7 and 3646 DF, p-value: < 2.2e-16
Model s interakciou medzi Cloud_Cover a Sunshine dosiahol najvyšší upravený R² = 0,6203 a ukázal štatisticky významný interakčný člen (p = 8,43e-07).
To naznačuje, že vplyv slnečného svitu na teplotu závisí od úrovne oblačnosti – komplexný vzťah, ktorý jednoduchý lineárny model nezachytáva.
Naproti tomu kvadratický model s Cloud_Cover² nepriniesol zlepšenie – kvadratický člen nie je štatisticky významný (p = 0,531) a R² je nižší.
Model s interakciou tak ponúka najlepšie riešenie, ktoré zachováva vysokú prediktívnu silu a zároveň adekvátne modeluje komplexné vzťahy medzi meteorologickými premennými.
models <- list("Pôvodný model" = model,
"Bez Sunshine" = model_no_sunshine,
"Bez Global_Radiation" = model_no_radiation,
"Bez Cloud_Cover" = model_no_cloud,
"S interakciou" = model_interaction,
"Škálovaný model" = model_scaled)
comparison <- data.frame(
Model = names(models),
R2 = sapply(models, function(m) round(summary(m)$r.squared, 4)),
Adj_R2 = sapply(models, function(m) round(summary(m)$adj.r.squared, 4)),
AIC = round(sapply(models, AIC), 2),
BIC = round(sapply(models, BIC), 2)
)
print(comparison)Model s interakciou medzi Cloud_Cover a Sunshine je najlepší podľa všetkých kritérií – má najvyšší upravený R² = 0,6203, najnižšie AIC = 21482,09 a BIC = 21537,92.
Model bez Global_Radiation výrazne zaostáva s R² = 0,3884.
Pôvodný a škálovaný model sú štatisticky ekvivalentné.
Najlepšou stratégiou na riešenie multikolinearity je pridanie interakčného člena medzi Cloud_Cover a Sunshine, čo zlepšuje prediktívnu silu a adekvátne zachytáva komplexné meteorologické vzťahy.
Analýza multikolinearity v meteorologickom modeli pre mesto Bazilej potvrdila prítomnosť výraznej multikolinearity medzi kľúčovými premennými, najmä medzi Sunshine, Global_Radiation a Cloud_Cover. Tento jav je spôsobený prirodzenými fyzikálnymi vzťahmi v atmosfére – vyššia oblačnosť prirodzene redukuje slnečný svit a globálne žiarenie.
Diagnostické nástroje konzistentne identifikovali problém:
Testované riešenia multikolinearity ukázali, že najefektívnejšou stratégiou je pridanie interakčného členu medzi Cloud_Cover a Sunshine. Tento model dosiahol najvyššiu explanačnú silu (R² = 0,6203) a najnižšie informačné kritériá (AIC = 21482,09), pričom adekvátne zachytil komplexný vzťah medzi týmito premennými. Interakčný člen bol štatisticky významný (p = 8,43e-07), čo potvrdzuje, že vplyv slnečného svitu na teplotu závisí od úrovne oblačnosti.
Alternatívne riešenie – vynechanie premennej Sunshine – síce redukovalo multikolinearitu (VIF všetkých premenných pod 2,3), ale viedlo k miernemu poklesu prediktívnej sily. Vynechanie Global_Radiation sa ukázalo ako neprijateľné, keďže spôsobilo výraznú stratu kvality modelu (R² poklesol na 0,3884).