S využitím databázy WDI – Education, Health & Employment
(2011–2021)
(súbor data/wdi_data.csv v podpriečinku
data).
Pri ďalšej práci budeme používať knižnice:
library(zoo)
library(tseries)
library(lmtest)
library(sandwich)
library(car)
library(ggplot2)
library(patchwork) # na zloženie grafov vedľa seba
library(dplyr)
library(tidyr)
rm(list = ls())
Rozhodla som sa modelovať výdavky na zdravotníctvo
health_exp – Current health expenditure (% of
GDP)v závislosti od vysvetľujúcich premenných:
educ_prim – výdavky na primárne vzdelávanieeduc_sec – výdavky na sekundárne vzdelávanieeduc_ter – výdavky na terciárne vzdelávanie# načítanie CSV súboru z priečinka data
udaje <- read.csv(
"data/wdi_data.csv",
dec = ".",
sep = ",",
header = TRUE,
check.names = FALSE # aby sa zachovali originálne názvy stĺpcov
)
# vyberiem len rok 2015
udaje_2015_all <- udaje[udaje$Time == 2015, ]
# názvy stĺpcov, ktoré potrebujem (podľa hlavičky WDI súboru)
health_col <- "Current health expenditure (% of GDP) [SH.XPD.CHEX.GD.ZS]"
prim_col <- "Current education expenditure, primary (% of total expenditure in primary public institutions) [SE.XPD.CPRM.ZS]"
sec_col <- "Current education expenditure, secondary (% of total expenditure in secondary public institutions) [SE.XPD.CSEC.ZS]"
ter_col <- "Current education expenditure, tertiary (% of total expenditure in tertiary public institutions) [SE.XPD.CTER.ZS]"
# vytiahnem len tieto štyri stĺpce
udaje.2015 <- udaje_2015_all[, c(health_col, prim_col, sec_col, ter_col)]
# premenujem ich na kratšie názvy
names(udaje.2015) <- c("health_exp",
"educ_prim",
"educ_sec",
"educ_ter")
# rýchly popis
summary(udaje.2015)
## health_exp educ_prim educ_sec educ_ter
## Min. : 3.466 Min. :85.55 Min. :86.52 Min. :87.06
## 1st Qu.: 9.724 1st Qu.:87.69 1st Qu.:89.63 1st Qu.:89.13
## Median :10.340 Median :94.13 Median :93.58 Median :90.35
## Mean :10.093 Mean :91.86 Mean :93.13 Mean :90.97
## 3rd Qu.:10.788 3rd Qu.:94.45 3rd Qu.:96.77 3rd Qu.:91.69
## Max. :16.491 Max. :97.51 Max. :97.59 Max. :96.40
## NA's :6 NA's :6 NA's :5
# mediány jednotlivých premenných (bez NA)
column_medians <- sapply(udaje.2015, median, na.rm = TRUE)
column_medians
## health_exp educ_prim educ_sec educ_ter
## 10.34000 94.12962 93.58111 90.35175
# nahradím NA mediánom danej premennej
udaje_imputed <- udaje.2015
for (col in names(udaje.2015)) {
udaje_imputed[[col]][is.na(udaje_imputed[[col]])] <- column_medians[col]
}
udaje.2015 <- udaje_imputed
# kontrola po imputácii
summary(udaje.2015)
## health_exp educ_prim educ_sec educ_ter
## Min. : 3.466 Min. :85.55 Min. :86.52 Min. :87.06
## 1st Qu.: 9.724 1st Qu.:90.26 1st Qu.:92.08 1st Qu.:90.09
## Median :10.340 Median :94.13 Median :93.58 Median :90.35
## Mean :10.093 Mean :92.58 Mean :93.27 Mean :90.81
## 3rd Qu.:10.788 3rd Qu.:94.26 3rd Qu.:95.46 3rd Qu.:91.05
## Max. :16.491 Max. :97.51 Max. :97.59 Max. :96.40
Teraz sa pozriem na rozdelenie jednotlivých premenných pomocou boxplotov.
box_data <- udaje.2015 %>%
mutate(id = dplyr::row_number()) %>%
pivot_longer(
cols = c(health_exp, educ_prim, educ_sec, educ_ter),
names_to = "variable",
values_to = "value"
)
ggplot(box_data, aes(x = variable, y = value)) +
geom_boxplot(fill = "lightblue") +
facet_wrap(~ variable, scales = "free_y") +
labs(
title = "Boxploty jednotlivých premenných",
x = "Premenná",
y = "Hodnota"
) +
theme_minimal()
Boxploty jednotlivých premenných
Celkovo boxploty ukazujú, že údaje sú pomerne stabilné, ale existuje niekoľko odľahlých krajín, s ktorými treba pri regresii počítať.
Model odhadujem príkazom lm():
\[ \text{health\_exp}_i = \beta_0 + \beta_1 \text{educ\_prim}_i + \beta_2 \text{educ\_sec}_i + \beta_3 \text{educ\_ter}_i + u_i \]
model <- lm(health_exp ~ +1 + educ_prim + educ_sec + educ_ter,
data = udaje.2015)
summary(model)
##
## Call:
## lm(formula = health_exp ~ +1 + educ_prim + educ_sec + educ_ter,
## data = udaje.2015)
##
## Residuals:
## Min 1Q Median 3Q Max
## -6.3302 -0.3082 0.1696 0.4648 6.4845
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.01846 27.38203 0.220 0.829
## educ_prim -0.15982 0.40800 -0.392 0.701
## educ_sec 0.05971 0.46031 0.130 0.899
## educ_ter 0.14647 0.24278 0.603 0.555
##
## Residual standard error: 2.576 on 15 degrees of freedom
## Multiple R-squared: 0.05594, Adjusted R-squared: -0.1329
## F-statistic: 0.2963 on 3 and 15 DF, p-value: 0.8275
par(mfrow = c(2, 2))
plot(model)
Diagnostické grafy – prvý model
par(mfrow = c(1, 1))
residuals1 <- residuals(model)
jb_test1 <- jarque.bera.test(residuals1)
outlier_test1 <- outlierTest(model)
list(
jarque_bera_model1 = jb_test1,
outlier_test_model1 = outlier_test1
)
## $jarque_bera_model1
##
## Jarque Bera Test
##
## data: residuals1
## X-squared = 10.358, df = 2, p-value = 0.005634
##
##
## $outlier_test_model1
## No Studentized residuals with Bonferroni p < 0.05
## Largest |rstudent|:
## rstudent unadjusted p-value Bonferroni p
## 95 3.440047 0.0039827 0.075671
Jarque–Bera test potvrdzuje, že reziduá nie sú dokonale normálne, a
outlierTest označí niekoľko krajín ako štatisticky výrazné
odľahlé pozorovania.
Podobne ako na cvičení upravím model:
educ_prim,educ_ter, ktorá môže byť kolineárna s
ostatnými.\[ \text{health\_exp}_i = \beta_0 + \beta_1 \log(\text{educ\_prim}_i) + \beta_2 \text{educ\_sec}_i + u_i \]
model2 <- lm(health_exp ~ +1 + I(log(educ_prim)) + educ_sec,
data = udaje.2015)
summary(model2)
##
## Call:
## lm(formula = health_exp ~ +1 + I(log(educ_prim)) + educ_sec,
## data = udaje.2015)
##
## Residuals:
## Min 1Q Median 3Q Max
## -6.3663 -0.6028 0.1653 0.8434 6.4103
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 76.73464 125.70854 0.610 0.550
## I(log(educ_prim)) -16.49006 35.86152 -0.460 0.652
## educ_sec 0.08591 0.44427 0.193 0.849
##
## Residual standard error: 2.526 on 16 degrees of freedom
## Multiple R-squared: 0.03124, Adjusted R-squared: -0.08986
## F-statistic: 0.258 on 2 and 16 DF, p-value: 0.7758
par(mfrow = c(2, 2))
plot(model2)
Diagnostické grafy – druhý model
par(mfrow = c(1, 1))
Celkovo diagnostické grafy ukazujú, že druhý model sa správa lepšie než prvý.
residuals2 <- residuals(model2)
jb_test2 <- jarque.bera.test(residuals2)
outlier_test2 <- outlierTest(model2)
list(
jarque_bera_model2 = jb_test2,
outlier_test_model2 = outlier_test2
)
## $jarque_bera_model2
##
## Jarque Bera Test
##
## data: residuals2
## X-squared = 8.6256, df = 2, p-value = 0.0134
##
##
## $outlier_test_model2
## No Studentized residuals with Bonferroni p < 0.05
## Largest |rstudent|:
## rstudent unadjusted p-value Bonferroni p
## 93 -3.412601 0.0038568 0.073278
Teraz sa pozriem, či rozptyl rezíduí závisí od vysvetľujúcich premenných.
resid_sq1 <- residuals(model)^2
p1 <- ggplot(udaje.2015, aes(x = educ_prim, y = resid_sq1)) +
geom_point(alpha = 0.6) +
geom_smooth(method = "loess", se = FALSE, color = "red") +
labs(x = "educ_prim",
y = "Štvorce rezíduí",
title = "Squared residuals vs educ_prim") +
theme_minimal()
p2 <- ggplot(udaje.2015, aes(x = educ_sec, y = resid_sq1)) +
geom_point(alpha = 0.6) +
geom_smooth(method = "loess", se = FALSE, color = "red") +
labs(x = "educ_sec",
y = "Štvorce rezíduí",
title = "Squared residuals vs educ_sec") +
theme_minimal()
p1 + p2
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
Skúmanie heteroskedasticity – prvý model
educ_prim sú štvorce rezíduí väčšie než pri nižších a
vyšších hodnotách. Rozptyl chýb teda závisí od úrovne výdavkov na
primárne vzdelávanie.educ_sec.Oba grafy naznačujú, že v prvom modeli je prítomná heteroskedasticita – variancia rezíduí nie je konštantná.
resid_sq2 <- residuals(model2)^2
p3 <- ggplot(udaje.2015, aes(x = log(educ_prim), y = resid_sq2)) +
geom_point(alpha = 0.6) +
geom_smooth(method = "loess", se = FALSE, color = "red") +
labs(x = "log(educ_prim)",
y = "Štvorce rezíduí",
title = "Squared residuals vs log(educ_prim)") +
theme_minimal()
p4 <- ggplot(udaje.2015, aes(x = educ_sec, y = resid_sq2)) +
geom_point(alpha = 0.6) +
geom_smooth(method = "loess", se = FALSE, color = "red") +
labs(x = "educ_sec",
y = "Štvorce rezíduí",
title = "Squared residuals vs educ_sec (model2)") +
theme_minimal()
p3 + p4
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
Skúmanie heteroskedasticity – druhý model
educ_prim.To ukazuje, že po logaritmickej transformácii educ_prim
je heteroskedasticita slabšia a druhý model lepšie
spĺňa predpoklad konštantného rozptylu.
bp1 <- bptest(model)
bp2 <- bptest(model2)
list(
breusch_pagan_model1 = bp1,
breusch_pagan_model2 = bp2
)
## $breusch_pagan_model1
##
## studentized Breusch-Pagan test
##
## data: model
## BP = 1.4632, df = 3, p-value = 0.6908
##
##
## $breusch_pagan_model2
##
## studentized Breusch-Pagan test
##
## data: model2
## BP = 1.6778, df = 2, p-value = 0.4322
Ak má prvý model nízku p-hodnotu a druhý model vyššiu, podporuje to
záver, že log-transformácia educ_prim pomohla problém
heteroskedasticity znížiť.
# robustné (White) štandardné chyby pre prvý model
coeftest(model, vcov = vcovHC(model))
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.01846 14.31319 0.4205 0.6801
## educ_prim -0.15982 0.26712 -0.5983 0.5586
## educ_sec 0.05971 0.28826 0.2071 0.8387
## educ_ter 0.14647 0.16401 0.8931 0.3859
# robustné (White) štandardné chyby pre druhý model
coeftest(model2, vcov = vcovHC(model2))
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 76.734642 91.866855 0.8353 0.4159
## I(log(educ_prim)) -16.490062 26.815821 -0.6149 0.5472
## educ_sec 0.085911 0.321963 0.2668 0.7930
V práci som použila údaje z databázy WDI pre rok 2015 a analyzovala som, ako rôzne typy výdavkov na vzdelávanie súvisia s výdavkami na zdravotníctvo:
educ_prim, educ_sec,
educ_ter,educ_prim a vypustila educ_ter, čím som
zmenšila vplyv extrémnych hodnôt a zjednodušila špecifikáciu
modelu.Boxploty ukázali, že údaje obsahujú niekoľko odľahlých krajín, ale žiadne úplne šialené hodnoty. Porovnanie heteroskedasticity (štvorcov rezíduí a Breusch–Pagan testu) aj diagnostické grafy ukazujú, že druhý model má:
Pri interpretácii sa opieram o:
Na základe týchto výsledkov považujem druhý model za vhodnejší opis vzťahu medzi výdavkami na vzdelávanie a výdavkami na zdravotníctvo v krajinách zahrnutých v databáze WDI pre rok 2015.