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