Základná diagnostika modelu

Author

Karen Paštrnáková

Econometrics in R – Cvičenie 5:Základná diagnostika modelu

Tento dokument nadväzuje na prácu s databázou WHO Life Expectancy Data. Hlavným cieľom tohto cvičenia je zvládnuť správu pracovného prostredia (workspace), interpretovať výsledky OLS regresie (\(t\)-testy, \(F\)-test, \(R^2\)), vykonať grafickú a štatistickú diagnostiku modelu (normalita rezíduí, odľahlé hodnoty) a pochopiť vplyv logaritmických transformácií.

1. Príprava balíkov a načítanie údajov

V prvom kroku načítame potrebné knižnice a spracujeme tvoj dataset dataset ekonometria.csv.

install.packages("kableExtra")
Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.6'
(as 'lib' is unspecified)
install.packages("dplyr")
Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.6'
(as 'lib' is unspecified)
install.packages("broom")
Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.6'
(as 'lib' is unspecified)
library(kableExtra)
library(knitr)
library(kableExtra)
library(dplyr)

Attaching package: 'dplyr'
The following object is masked from 'package:kableExtra':

    group_rows
The following objects are masked from 'package:stats':

    filter, lag
The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union
library(broom)
# Načítanie datasetu so stredníkom ako oddeľovačom
udaje <- read.csv("dataset ekonometria.csv", sep = ";", dec = ".", header = TRUE, stringsAsFactors = FALSE)

# Úprava názvov stĺpcov
names(udaje) <- make.names(trimws(names(udaje)), unique = TRUE)

# Očistenie numerických premenných od medzier v tisícoch
udaje$Asset_Mil <- as.numeric(gsub(" ", "", udaje$Approx..Asset..Millions.))
udaje$Deposit_Mil <- as.numeric(gsub(" ", "", udaje$Approx..Deposit..Millions.))

# Výber potrebných stĺpcov a odstránenie chýbajúcich hodnôt
udaje.vyber <- udaje[, c("Bank.Name", "Year", "Asset_Mil", "Deposit_Mil")]
udaje.vyber <- na.omit(udaje.vyber)

# Ukážka prvých 6 riadkov databázy
head(udaje.vyber) |>
  kable(
    digits = 2,
    col.names = c("Názov banky", "Rok", "Aktíva (mil. $)", "Vklady (mil. $)"),
    caption = "Prvých šesť bánk vo vybraných údajoch"
  ) |>
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Prvých šesť bánk vo vybraných údajoch
Názov banky Rok Aktíva (mil. $) Vklady (mil. $)
Washington Mutual Bank 2008 307000 188000
First Republic Bank 2023 229100 103900
Silicon Valley Bank 2023 209000 175400
Signature Bank 2023 110400 88600
IndyMac Bank 2008 32010 19060
Colonial Bank 2009 25000 20000

Opis a vysvetlenie výstupu:

Vstupy: Súbor dataset ekonometria.csv, funkcie read.csv() a čistiace príkazy gsub() a as.numeric().

Tabuľka 1 (Prvých šesť bánk vo vybraných údajoch): Zobrazuje prvých 6 riadkov vyčistenej vzorky. Vidíme tu názov banky, rok jej zlyhania, prekonvertované celkové aktíva (Asset_Mil) v miliónoch dolárov a celkové vklady (Deposit_Mil). Slúži na overenie, že dáta sú správne naimportované a pripravené na modelovanie.

2. Odhad regresného modelu a štatistická významnosť

V tomto kroku odhadneme viacnásobný lineárny regresný model, kde vysvetľovanou premennou sú vklady bánk v závislosti od ich aktív a roku zlyhania.

# Odhad viacnásobného lineárneho modelu
model <- lm(Deposit_Mil ~ Asset_Mil + Year, data = udaje.vyber)

# Prehľadná tabuľka odhadnutých koeficientov
tidy(model) |>
  mutate(
    Significance = case_when(
      p.value < 0.001 ~ "***",
      p.value < 0.01  ~ "**",
      p.value < 0.05  ~ "*",
      p.value < 0.10  ~ ".",
      TRUE ~ ""
    )
  ) |>
  kable(
    digits = 4,
    col.names = c("Variable", "Estimate", "Std. Error", "t value", "p-value", "Significance"),
    caption = "Regresné koeficienty modelu"
  ) |>
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Regresné koeficienty modelu
Variable Estimate Std. Error t value p-value Significance
(Intercept) -104933.9150 78333.1853 -1.3396 0.1809
Asset_Mil 0.6305 0.0060 105.0856 0.0000 ***
Year 52.2734 38.9644 1.3416 0.1803

Opis a vysvetlenie výstupu:

Vstupy: Model metódy najmenších štvorcov (lm()), funkcia tidy() z balíka broom a formátovacie príkazy kable(). Tabuľka 2 (Regresné koeficienty modelu) - obsahuje výsledky pre jednotlivé premenné: Estimate: Bodový odhad vyjadrujúci o koľko miliónov USD sa zmenia vklady banky pri zmene aktív o 1 milión USD (ceteris paribus). Std. Error: Štandardná chyba merajúca neistotu odhadu. t value a p-value: Slúžia na testovanie štatistickej významnosti koeficientov (\(H_0: \beta_j = 0\)). Nízka \(p\)-hodnota (\(< 0.05\)) potvrdzuje štatistickú významnosť. Significance: Hviezdičkové označenie úrovne významnosti pre rýchlu orientáciu.

3. Celková kvalita vyrovnania modelu

Analyzujeme celkovú úspešnosť modelu ako celku prostredníctvom koeficientu determinácie a informačných kritérií.

# Súhrnné charakteristiky modelu
glance(model) |>
  select(-deviance) |>
  kable(
    digits = 4,
    col.names = c("R.squared", "Adj.R.squared", "Sigma", "F Stat.", "p.value", "df", "logLik", "AIC", "BIC", "df.residual", "N"),
    caption = "Súhrnné charakteristiky modelu"
  ) |>
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Súhrnné charakteristiky modelu
R.squared Adj.R.squared Sigma F Stat. p.value df logLik AIC BIC df.residual N
0.9533 0.9531 2655.034 5750.548 0 2 -5273.383 10554.77 10572.13 564 567

Opis a vysvetlenie výstupu:

Vstupy: Funkcia glance() z balíka broom na agregáciu globálnych štatistík modelu. Tabuľka 3 (Súhrnné charakteristiky modelu) - zhrňuje celkové vlastnosti: R.squared: Podiel celkovej variability vkladov vysvetlenej týmto modelom. Adj.R.squared: Upravený koeficient determinácie zohľadňujúci počet premenných. Sigma: Reziduálna štandardná odchýlka (priemerná chyba modelu). F Stat. a p.value: Globálny \(F\)-test testujúci platnosť celého modelu naraz. AIC a BIC: Informačné kritériá vhodné na vzájomné porovnávanie modelov (nižšie číslo znamená lepší model). N: Celkový počet bánk (pozorovaní) použitých vo výpočte.

4. Grafická analýza rezíduí

Vizuálne overujeme predpoklady lineárnej regresie prostredníctvom štvorice diagnostických grafov.

# Rozdelenie okna na mriežku 2x2
par(mfrow = c(2, 2))
plot(model)

par(mfrow = c(1, 1))

Opis a vysvetlenie výstupu:

Vstupy: Príkaz plot(model) aplikovaný na odhadnutý regresný model. Obrázok (Diagnostické grafy regresného modelu): Generuje 4 grafy: Residuals vs Fitted: Overuje linearitu a konštantný rozptyl (homoscedasticitu). Normal Q-Q: Overuje normálne rozdelenie rezíduí (body by mali ležať na priamke). Scale-Location: Ďalší vizuálny test homoscedasticity rozptylu chýb. Residuals vs Leverage: Pomáha identifikovať vplyvné pozorovania a extrémne odľahlé hodnoty na základe Cookovej vzdialenosti.

5. Test normality rezíduí a odľahlých hodnôt

Overujeme normalitu rezíduí pomocou Jarque-Bera testu a detegujeme štatisticky významné odľahlé pozorovania.

# Jarque-Bera test normality rezíduí
res <- residuals(model)
jb_test <- tseries::jarque.bera.test(res)
Registered S3 method overwritten by 'quantmod':
  method            from
  as.zoo.data.frame zoo 
broom::tidy(jb_test) |>
  dplyr::select(statistic, p.value, method) |>
  knitr::kable(
    digits = 4,
    col.names = c("JB statistic", "p-value", "Test"),
    caption = "Jarque-Bera test normality rezíduí"
  ) |>
  kableExtra::kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Jarque-Bera test normality rezíduí
JB statistic p-value Test
1211741 0 Jarque Bera Test
# Test odľahlých pozorovaní s Bonferroniho korekciou
outlier_test <- car::outlierTest(model)

if (!is.null(outlier_test)) {
  outlier_table <- data.frame(
    Observation = names(outlier_test$rstud),
    rstudent = unname(outlier_test$rstud),
    unadjusted.p = unname(outlier_test$p),
    bonf.p = unname(outlier_test$bonf.p)
  )

  outlier_table |>
    knitr::kable(
      digits = 4,
      col.names = c("Observation", "Studentized residual", "Unadjusted p-value", "Bonferroni p-value"),
      caption = "Test odľahlých pozorovaní"
    ) |>
    kableExtra::kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
}
Test odľahlých pozorovaní
Observation Studentized residual Unadjusted p-value Bonferroni p-value
3 28.6109 0 0
2 -28.1002 0 0
4 7.4726 0 0

Opis a vysvetlenie výstupu:

Vstupy: Funkcia tseries::jarque.bera.test() na testovanie normality rezíduí a car::outlierTest() na detekciu odľahlých hodnôt. Tabuľka 4 (Jarque-Bera test normality rezíduí): Ukazuje štatistiku testu a \(p\)-hodnotu. Ak je \(p\)-hodnota menšia ako \(0.05\), predpoklad normality rezíduí je zamietnutý. Tabuľka 5 (Test odľahlých pozorovaní): Zobrazuje prípadné banky s extrémnymi študentizovanými rezíduami. Kľúčový je stĺpec Bonferroni p-value – ak je menšia ako \(0.05\), pozorovanie je štatisticky významne odľahlé na 5% hladine významnosti.