V tejto úlohe analyzujeme mieru nezamestnanosti v Nemecku, Česku a na Slovensku na ročnej báze (2014–2024) a špecifikujeme jednoduchý lineárny regresný model.
# Balíky
library(zoo)
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
library(tseries)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(lmtest)
library(sandwich)
library(car)
## Loading required package: carData
# Načítanie dát (súbor musí byť v rovnakom priečinku ako tento .Rmd)
udaje_raw <- read.csv("une_rt_a__custom_18708117_linear.csv",
stringsAsFactors = FALSE)
str(udaje_raw)
## 'data.frame': 33 obs. of 11 variables:
## $ DATAFLOW : chr "ESTAT:UNE_RT_A(1.0)" "ESTAT:UNE_RT_A(1.0)" "ESTAT:UNE_RT_A(1.0)" "ESTAT:UNE_RT_A(1.0)" ...
## $ LAST.UPDATE: chr "11/09/25 23:00:00" "11/09/25 23:00:00" "11/09/25 23:00:00" "11/09/25 23:00:00" ...
## $ freq : chr "Annual" "Annual" "Annual" "Annual" ...
## $ age : chr "From 15 to 74 years" "From 15 to 74 years" "From 15 to 74 years" "From 15 to 74 years" ...
## $ unit : chr "Percentage of population in the labour force" "Percentage of population in the labour force" "Percentage of population in the labour force" "Percentage of population in the labour force" ...
## $ sex : chr "Total" "Total" "Total" "Total" ...
## $ geo : chr "Czechia" "Czechia" "Czechia" "Czechia" ...
## $ TIME_PERIOD: int 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 ...
## $ OBS_VALUE : num 6.1 5.1 4 2.9 2.2 2 2.6 2.8 2.2 2.6 ...
## $ OBS_FLAG : chr "" "" "" "" ...
## $ CONF_STATUS: logi NA NA NA NA NA NA ...
head(udaje_raw)
## DATAFLOW LAST.UPDATE freq age
## 1 ESTAT:UNE_RT_A(1.0) 11/09/25 23:00:00 Annual From 15 to 74 years
## 2 ESTAT:UNE_RT_A(1.0) 11/09/25 23:00:00 Annual From 15 to 74 years
## 3 ESTAT:UNE_RT_A(1.0) 11/09/25 23:00:00 Annual From 15 to 74 years
## 4 ESTAT:UNE_RT_A(1.0) 11/09/25 23:00:00 Annual From 15 to 74 years
## 5 ESTAT:UNE_RT_A(1.0) 11/09/25 23:00:00 Annual From 15 to 74 years
## 6 ESTAT:UNE_RT_A(1.0) 11/09/25 23:00:00 Annual From 15 to 74 years
## unit sex geo TIME_PERIOD
## 1 Percentage of population in the labour force Total Czechia 2014
## 2 Percentage of population in the labour force Total Czechia 2015
## 3 Percentage of population in the labour force Total Czechia 2016
## 4 Percentage of population in the labour force Total Czechia 2017
## 5 Percentage of population in the labour force Total Czechia 2018
## 6 Percentage of population in the labour force Total Czechia 2019
## OBS_VALUE OBS_FLAG CONF_STATUS
## 1 6.1 NA
## 2 5.1 NA
## 3 4.0 NA
## 4 2.9 NA
## 5 2.2 NA
## 6 2.0 NA
V dátach máme mieru nezamestnanosti (v %) podľa krajiny, roku a ďalších charakteristík.
Budeme pracovať s:
udaje <- subset(udaje_raw,
age == "From 15 to 74 years" &
sex == "Total" &
geo %in% c("Czechia","Germany","Slovakia"))
table(udaje$geo)
##
## Czechia Germany Slovakia
## 11 11 11
sort(unique(udaje$TIME_PERIOD))
## [1] 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024
# pre istotu: OBS_VALUE ako číslo
udaje$OBS_VALUE <- as.numeric(udaje$OBS_VALUE)
Chceme mať 1 riadok = 1 rok, stĺpce = miera nezamestnanosti v krajinách.
udaje_wide <- reshape(udaje[, c("TIME_PERIOD","geo","OBS_VALUE")],
idvar = "TIME_PERIOD",
timevar = "geo",
direction = "wide")
# Premenovanie stĺpcov
names(udaje_wide) <- c("year","u_CZ","u_DE","u_SK")
# Zoradenie podľa roku
udaje_wide <- udaje_wide[order(udaje_wide$year), ]
udaje_wide
## year u_CZ u_DE u_SK
## 1 2014 6.1 4.7 13.1
## 2 2015 5.1 4.4 11.5
## 3 2016 4.0 3.9 9.6
## 4 2017 2.9 3.5 8.1
## 5 2018 2.2 3.2 6.5
## 6 2019 2.0 2.9 5.7
## 7 2020 2.6 3.6 6.7
## 8 2021 2.8 3.6 6.8
## 9 2022 2.2 3.1 6.1
## 10 2023 2.6 3.1 5.8
## 11 2024 2.6 3.4 5.3
summary(udaje_wide)
## year u_CZ u_DE u_SK
## Min. :2014 Min. :2.000 Min. :2.900 Min. : 5.300
## 1st Qu.:2016 1st Qu.:2.400 1st Qu.:3.150 1st Qu.: 5.950
## Median :2019 Median :2.600 Median :3.500 Median : 6.700
## Mean :2019 Mean :3.191 Mean :3.582 Mean : 7.745
## 3rd Qu.:2022 3rd Qu.:3.450 3rd Qu.:3.750 3rd Qu.: 8.850
## Max. :2024 Max. :6.100 Max. :4.700 Max. :13.100
Z deskriptívnych štatistík a tabuľky vidno, že:
plot(udaje_wide$year, udaje_wide$u_SK, type = "b",
xlab = "Rok", ylab = "Miera nezamestnanosti (%)",
main = "Nezamestnanosť – Slovensko")
grid()
plot(udaje_wide$year, udaje_wide$u_DE, type = "b",
xlab = "Rok", ylab = "Miera nezamestnanosti (%)",
main = "Nezamestnanosť – Nemecko")
grid()
plot(udaje_wide$year, udaje_wide$u_CZ, type = "b",
xlab = "Rok", ylab = "Miera nezamestnanosti (%)",
main = "Nezamestnanosť – Česko")
grid()
Z grafov vidíme:
plot(udaje_wide$u_DE, udaje_wide$u_SK,
xlab = "Nezamestnanosť Nemecko (%)",
ylab = "Nezamestnanosť Slovensko (%)",
main = "Vzťah nezamestnanosti SK a DE")
abline(lm(u_SK ~ u_DE, data = udaje_wide), lwd = 2)
grid()
Bodový graf naznačuje, že medzi nezamestnanosťou na Slovensku a v Nemecku neexistuje úplne jednoznačná silná lineárna závislosť – Slovensko má vo všetkých rokoch vyššiu nezamestnanosť a pohyb bodov naznačuje skôr spoločný dlhodobý trend (pokles po roku 2014), než priamu kauzálnu väzbu.
Zvolíme si:
u_SK – miera nezamestnanosti na
Slovenskuu_DE – miera nezamestnanosti v Nemeckuu_CZ – miera nezamestnanosti v Českutrend (1 pre prvý rok, 2 pre druhý rok,
…)udaje_wide$trend <- udaje_wide$year - min(udaje_wide$year) + 1
# Základný model (bez trendu)
model1 <- lm(u_SK ~ u_DE + u_CZ, data = udaje_wide)
summary(model1)
##
## Call:
## lm(formula = u_SK ~ u_DE + u_CZ, data = udaje_wide)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.3551 -0.2067 0.1195 0.3168 0.8876
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.5911 3.4910 0.169 0.8697
## u_DE 0.4871 1.5137 0.322 0.7558
## u_CZ 1.6953 0.6421 2.640 0.0297 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.6984 on 8 degrees of freedom
## Multiple R-squared: 0.9413, Adjusted R-squared: 0.9267
## F-statistic: 64.2 on 2 and 8 DF, p-value: 1.183e-05
# Rozšírený model s trendom
model2 <- lm(u_SK ~ u_DE + u_CZ + trend, data = udaje_wide)
summary(model2)
##
## Call:
## lm(formula = u_SK ~ u_DE + u_CZ + trend, data = udaje_wide)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.33118 -0.09185 -0.01199 0.03886 0.55699
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.02080 1.54998 2.594 0.035731 *
## u_DE 0.35526 0.62921 0.565 0.589966
## u_CZ 1.25944 0.27566 4.569 0.002578 **
## trend -0.26109 0.04162 -6.273 0.000415 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2901 on 7 degrees of freedom
## Multiple R-squared: 0.9911, Adjusted R-squared: 0.9873
## F-statistic: 261.1 on 3 and 7 DF, p-value: 1.518e-07
# Porovnanie modelov pomocou ANOVA
anova(model1, model2)
## Analysis of Variance Table
##
## Model 1: u_SK ~ u_DE + u_CZ
## Model 2: u_SK ~ u_DE + u_CZ + trend
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 8 3.9020
## 2 7 0.5893 1 3.3127 39.35 0.0004148 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Interpretácia:
par(mfrow = c(1,2))
plot(model1, which = 1,
main = "Model 1: Rezíduá vs. fitted")
plot(model2, which = 1,
main = "Model 2: Rezíduá vs. fitted")
par(mfrow = c(1,1))
Interpretácia:
resettest(model1)
##
## RESET test
##
## data: model1
## RESET = 0.45698, df1 = 2, df2 = 6, p-value = 0.6535
resettest(model2)
##
## RESET test
##
## data: model2
## RESET = 0.022628, df1 = 2, df2 = 5, p-value = 0.9777
Interpretácia:
Ramsey RESET test testuje hypotézu
V našom prípade sú p-hodnoty RESET testu pri oboch
modeloch pomerne vysoké (okolo 0,93 a 0,97), takže
nezamietame H₀. To znamená, že z hľadiska RESET testu
nevidíme dôkaz o vážnej nesprávnej špecifikácii modelu (t. j. nie je
jasný signál, že by chýbali nelineárne členy).
V kombinácii s grafom rezíduí to podporuje použitie lineárnej špecifikácie.
car::crPlots(model2)
Interpretácia:
Skúsime overiť, či by transformácia u_SK mohla zlepšiť
vlastnosti modelu.
boxcox_model <- powerTransform(udaje_wide$u_SK)
boxcox_model
## Estimated transformation parameter
## udaje_wide$u_SK
## -1.88556
lambda <- boxcox_model$lambda
lambda
## udaje_wide$u_SK
## -1.88556
Odhadnutý parameter \(\lambda\) vychádza približne -1,9, teda Box–Cox transformácia odporúča pomerne silnú nelineárnu transformáciu mier nezamestnanosti na Slovensku.
Vytvoríme Box–Cox transformovanú premennú a odhadneme model:
udaje_wide$u_SK_bc <- if (abs(lambda) < 1e-6) {
log(udaje_wide$u_SK)
} else {
(udaje_wide$u_SK^lambda - 1) / lambda
}
model_bc <- lm(u_SK_bc ~ u_DE + u_CZ + trend, data = udaje_wide)
summary(model_bc)
##
## Call:
## lm(formula = u_SK_bc ~ u_DE + u_CZ + trend, data = udaje_wide)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.794e-03 -1.141e-03 3.064e-05 1.530e-03 1.996e-03
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.5019101 0.0110763 45.314 6.66e-10 ***
## u_DE 0.0066309 0.0044964 1.475 0.18379
## u_CZ -0.0007560 0.0019699 -0.384 0.71255
## trend -0.0011091 0.0002974 -3.729 0.00737 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.002073 on 7 degrees of freedom
## Multiple R-squared: 0.9219, Adjusted R-squared: 0.8885
## F-statistic: 27.55 on 3 and 7 DF, p-value: 0.0003001
resettest(model_bc)
##
## RESET test
##
## data: model_bc
## RESET = 1.0643, df1 = 2, df2 = 5, p-value = 0.412
plot(model_bc, which = 1,
main = "Model s Box-Cox transformáciou")
Interpretácia:
Preto napriek tomu, že Box–Cox transformácia je formálne možná, z hľadiska praktickej interpretácie a vysokej kvality pôvodného lineárneho modelu ju nepovažujeme za potrebnú.
Na základe analýzy môžeme zhrnúť: