1. Východiskový model a údaje

udaje <- read.csv("Temperature_2020.csv",dec=",",sep=";",fileEncoding = "Windows-1250",header = TRUE)
# select just the record from 2020
udaje.2020 <- udaje[udaje$Year==2020,c("Temperature...C.","Air.Pressure..hPa.","Wind.Speed..m.s.")]

# data imputation
 
# Compute column medians
#column_medians <- sapply(udaje.2020, median, na.rm = TRUE)
 
# Impute missing values with column medians
# Compute column medians
column_medians <- sapply(udaje.2020, median, na.rm = TRUE)
 
# Impute missing values with column medians
udaje_imputed <- udaje.2020
for (col in names(udaje.2020)) {
  udaje_imputed[[col]][is.na(udaje_imputed[[col]])] <- column_medians[col]
}
 
udaje.2020 <- udaje_imputed
udaje <- udaje.2020

2. Odhad základného regresného modelu

model <- lm(Temperature...C. ~ Air.Pressure..hPa. + Wind.Speed..m.s.,
            data = udaje)
summary(model)
## 
## Call:
## lm(formula = Temperature...C. ~ Air.Pressure..hPa. + Wind.Speed..m.s., 
##     data = udaje)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.7467 -3.6719  0.3266  4.0500  8.9692 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)
## (Intercept)        231.5798   441.9871   0.524    0.613
## Air.Pressure..hPa.  -0.2169     0.4470  -0.485    0.639
## Wind.Speed..m.s.    -3.0605     4.5620  -0.671    0.519
## 
## Residual standard error: 6.55 on 9 degrees of freedom
## Multiple R-squared:  0.07576,    Adjusted R-squared:  -0.1296 
## F-statistic: 0.3689 on 2 and 9 DF,  p-value: 0.7015

Vo výsledkoch vidíme výrazné rozdiely vo veľkosti koeficientov, spôsobené odlišnými mierkami premenných (hPa, m/s). Ide o prirodzený jav, ktorý neovplyvňuje správnosť modelu, iba znemožňuje porovnanie koeficientov.


3. Korelačná matica

xvars <- udaje[, c("Temperature...C.", "Air.Pressure..hPa.", "Wind.Speed..m.s.")]
round(cor(xvars), 3)
##                    Temperature...C. Air.Pressure..hPa. Wind.Speed..m.s.
## Temperature...C.              1.000             -0.172           -0.227
## Air.Pressure..hPa.           -0.172              1.000            0.074
## Wind.Speed..m.s.             -0.227              0.074            1.000

V našom prípade nevidíme dve premenné, ktoré by boli silne korelované.


pairs(xvars,
      main = "Scatterplotová matica – premenné Temperature, Air Pressure, Wind Speed")

Scatterplotová matica ukazuje, že medzi premennými Temperature, Air Pressure a Wind Speed neexistujú žiadne jasné lineárne vzťahy. Body sú rozptýlené náhodne, bez viditeľného smerovania nahor alebo nadol. To potvrdzuje, že premenné nie sú silne korelované a každá z nich prináša do modelu odlišnú informáciu.


4. VIF

library(car)
vif(model)
## Air.Pressure..hPa.   Wind.Speed..m.s. 
##           1.005536           1.005536

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.


5. Condition Number

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] 2385.004

Keďže u nás tento indikátor presahuje významne hodnotu 100, signalizuje prítomnosť závažnej multikolinearity.


6. Riešenia multikolinearity

Vynechanie premennej

Pokúsme sa vynechať postupne dve premenné, ktoré majú najvyšší VIF a porovnajme následne upravené koeficienty determinácie oboch nových modelov

model_noPressure <- lm(Temperature...C. ~ Wind.Speed..m.s., data = udaje)
summary(model_noPressure)
## 
## Call:
## lm(formula = Temperature...C. ~ Wind.Speed..m.s., data = udaje)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.1658 -5.2290  0.2581  4.0795  9.4446 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)  
## (Intercept)        17.223      8.886   1.938   0.0813 .
## Wind.Speed..m.s.   -3.225      4.372  -0.738   0.4777  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6.295 on 10 degrees of freedom
## Multiple R-squared:  0.0516, Adjusted R-squared:  -0.04324 
## F-statistic: 0.544 on 1 and 10 DF,  p-value: 0.4777
model_noWind <- lm(Temperature...C. ~ Air.Pressure..hPa., data = udaje)
summary(model_noWind)
## 
## Call:
## lm(formula = Temperature...C. ~ Air.Pressure..hPa., data = udaje)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -9.3590 -5.3141 -0.4673  5.0012  9.3962 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)
## (Intercept)        247.5206   429.0411   0.577    0.577
## Air.Pressure..hPa.  -0.2391     0.4334  -0.552    0.593
## 
## Residual standard error: 6.368 on 10 degrees of freedom
## Multiple R-squared:  0.02954,    Adjusted R-squared:  -0.0675 
## F-statistic: 0.3044 on 1 and 10 DF,  p-value: 0.5932

Nie je možné povedať, že vynechanie premennej Air.Pressure..hPa. alebo Wind.Speed..m.s. je výhodnejšie, pretože oba jednopremenné modely poskytujú rovnako slabé výsledky.

Škálovanie premenných

udaje$Pressure_c       <- scale(udaje$Air.Pressure..hPa., center=TRUE, scale=TRUE)
udaje$Wind_c       <- scale(udaje$Wind.Speed..m.s., center=TRUE, scale=TRUE)

model_centered <- lm(Temperature...C. ~ Pressure_c + Wind_c,
                     data = udaje)
summary(model_centered)
## 
## Call:
## lm(formula = Temperature...C. ~ Pressure_c + Wind_c, data = udaje)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.7467 -3.6719  0.3266  4.0500  8.9692 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  10.8075     1.8909   5.715 0.000289 ***
## Pressure_c   -0.9607     1.9804  -0.485 0.639202    
## Wind_c       -1.3286     1.9804  -0.671 0.519140    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6.55 on 9 degrees of freedom
## Multiple R-squared:  0.07576,    Adjusted R-squared:  -0.1296 
## F-statistic: 0.3689 on 2 and 9 DF,  p-value: 0.7015
vif(model_centered)
## Pressure_c     Wind_c 
##   1.005536   1.005536

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] 1.077168

Z výsledkov vidíme, že ukazovateľ Condition number sa po preškálovaní výrazne zlepšil – jeho hodnota (≈ 1.08) už vôbec nesignalizuje prítomnosť multikolinearity. Rovnako aj ukazovatele VIF ostali veľmi nízke (≈ 1.005), čo potvrdzuje, že preškálovanie premenných viedlo k stabilnému modelu bez multikolineárnych problémov.

Iná úprava premennej, ktorá zachová interpretovateľnosť

V našom prípade má Air Pressure (hPa) výrazne vyššie číselné hodnoty ako Temperature (°C) či Wind Speed (m/s), preto ju jednoduchým vydelením 10 prevedieme na menší rád. Tým zabezpečíme, že všetky premenné budú mať porovnateľné mierky a model bude numericky stabilnejší bez straty interpretovateľnosti.

udaje$Pressure10 = udaje$Air.Pressure..hPa./10
head(udaje)
##   Temperature...C. Air.Pressure..hPa. Wind.Speed..m.s. Pressure_c      Wind_c
## 1           3.4651           996.4417           2.1784  1.4565935  0.43488189
## 2           5.7578           986.5782           1.0233 -0.7698615 -2.22589271
## 3           5.3865           991.1122           2.7927  0.2535832  1.84992287
## 4          10.3925           991.4854           2.0595  0.3378244  0.16099556
## 5          11.8822           993.4664           1.8752  0.7849890 -0.26353977
## 6          17.3650           986.7865           1.9601 -0.7228426 -0.06797249
##   Pressure10
## 1   99.64417
## 2   98.65782
## 3   99.11122
## 4   99.14854
## 5   99.34664
## 6   98.67865
model_Pressure10 <- lm(Temperature...C. ~ Wind.Speed..m.s. + Pressure10,
                     data = udaje)
summary(model_Pressure10)
## 
## Call:
## lm(formula = Temperature...C. ~ Wind.Speed..m.s. + Pressure10, 
##     data = udaje)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.7467 -3.6719  0.3266  4.0500  8.9692 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)
## (Intercept)       231.580    441.987   0.524    0.613
## Wind.Speed..m.s.   -3.061      4.562  -0.671    0.519
## Pressure10         -2.169      4.470  -0.485    0.639
## 
## Residual standard error: 6.55 on 9 degrees of freedom
## Multiple R-squared:  0.07576,    Adjusted R-squared:  -0.1296 
## F-statistic: 0.3689 on 2 and 9 DF,  p-value: 0.7015
vif(model_Pressure10)
## Wind.Speed..m.s.       Pressure10 
##         1.005536         1.005536
X <- model.matrix(model_Pressure10)[, -1]
XtX <- t(X) %*% X
eig <- eigen(XtX)

condition_number <- sqrt(max(eig$values) / min(eig$values))
condition_number
## [1] 238.5958

Po prevedení premennej Air Pressure na jednotky Pressure10 sa síce hodnoty VIF nemenia a ostávajú veľmi nízke (≈1), čo znamená, že multikolinearita podľa VIF nie je prítomná, avšak Conditional number ≈ 238 jasne naznačuje silnú multikolinearitu v modeli. Koeficienty síce zostali interpretovateľné, ale model je numericky nestabilný – malé zmeny v dátach by mohli výrazne zmeniť odhady regresných koeficientov.

###   ocistenie databazy od nadbytocnych - pracovnych stlpcov
library(dplyr)

udaje <- udaje %>%
  dplyr::select(-Pressure_c, -Wind_c, Pressure10)

10. Zhrnutie

Analýza sa zamerala na vzťah medzi teplotou, tlakom vzduchu a rýchlosťou vetra. Regresné modely ukázali veľmi slabú schopnosť vysvetliť zmeny teploty. Multikolinearita, ktorá síce nezavádza bias, ale zvyšuje štandardné odchýlky koeficientov, bola overená pomocou VIF a Condition Number. Obe metriky potvrdili, že v týchto údajoch multikolinearita nepredstavuje problém.