Cvičenie 5 – Základná diagnostika modelu

Autor

Yan Biliavskyi

1 Príprava databázy a pamäte (Workspace)

Na začiatku si načítame knižnice. Oproti minulému cvičeniu pridávame knižnice dplyr pre úpravu tabuliek, tseries pre test normality a car pre test odľahlých hodnôt.

library(broom)
library(knitr)
library(kableExtra)
library(ggplot2)
library(dplyr)
library(tseries)
library(car)   
udaje <- read.csv("Dataset ESG and Firm Performance.csv", sep = ";", dec = ".",
                  na.strings = c("", "NA"), check.names = FALSE, stringsAsFactors = FALSE)

names(udaje) <- make.names(trimws(names(udaje)), unique = TRUE)

udaje.2021 <- udaje[!is.na(udaje$YEARS) & udaje$YEARS == 2021,
                    c("COMPANIES", "RETURN.ON.ASSETS", "ESG.INDEX", "FIRM.SIZE", "DEBT.TO.ASSET")]

premenne_num <- c("RETURN.ON.ASSETS", "ESG.INDEX", "FIRM.SIZE", "DEBT.TO.ASSET")
udaje.2021[premenne_num] <- lapply(udaje.2021[premenne_num], as.numeric)
udaje.2021 <- na.omit(udaje.2021)
save.image("pamat_esg.Rdata")

pomocna_premenna <- "text"
rm(pomocna_premenna)

# Takto by sme mohli načítať uloženú pamäť v budúcnosti:
# load("pamat_esg.Rdata")
model <- lm(RETURN.ON.ASSETS ~ ESG.INDEX + FIRM.SIZE + DEBT.TO.ASSET, data = udaje.2021)
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("Premenná", "Odhad (Estimate)", "Štand. chyba", "t-hodnota", "p-hodnota", "Významnosť"),
    caption = "Regresné koeficienty a ich štatistická významnosť",
    escape = TRUE
  ) |>
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Regresné koeficienty a ich štatistická významnosť
Premenná Odhad (Estimate) Štand. chyba t-hodnota p-hodnota Významnosť
(Intercept) -148.1738 147.5418 -1.0043 0.3186
ESG.INDEX 73.4415 108.2526 0.6784 0.4997
FIRM.SIZE 17.2677 21.2007 0.8145 0.4181
DEBT.TO.ASSET -0.3173 0.3712 -0.8549 0.3954
glance(model) |>
  select(-deviance) |>
  kable(
    digits = 4,
    col.names = c("R-kvadrát", "Upravený R²", "Sigma", "F-štatistika", "p-hodnota (F)", "df", "logLik", "AIC", "BIC", "df.residual", "N"),
    caption = "Súhrnné charakteristiky kvality modelu"
  ) |>
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Súhrnné charakteristiky kvality modelu
R-kvadrát Upravený R² Sigma F-štatistika p-hodnota (F) df logLik AIC BIC df.residual N
0.0502 0.0106 148.1717 1.2685 0.2917 3 -485.661 981.3221 992.9758 72 76
par(mfrow = c(2, 2))
plot(model)

Diagnostické grafy regresného modelu
par(mfrow = c(1, 1))
res <- residuals(model)
jb_test <- jarque.bera.test(res)

tidy(jb_test) |>
  select(statistic, p.value, method) |>
  kable(digits = 4, col.names = c("JB štatistika", "p-hodnota", "Názov testu"), caption = "Test normality rezíduí") |>
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Test normality rezíduí
JB štatistika p-hodnota Názov testu
4377.745 0 Jarque Bera Test
outlier_test <- outlierTest(model)

if (is.null(outlier_test)) {
  cat("Nenašli sa žiadne odľahlé hodnoty.")
} else {
  outlier_table <- data.frame(
    Pozorovanie = names(outlier_test$rstud),
    Student_reziduum = unname(outlier_test$rstud),
    Bonferroni_p_hodnota = unname(outlier_test$bonf.p)
  )

  outlier_table |>
    kable(digits = 4, col.names = c("Číslo firmy (riadok)", "Študentizované rezíduum", "Bonferroni p-hodnota"),
          caption = "Identifikácia odľahlých hodnôt") |>
    kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
}
Identifikácia odľahlých hodnôt
Číslo firmy (riadok) Študentizované rezíduum Bonferroni p-hodnota
429 -13.5433 0
model2 <- lm(RETURN.ON.ASSETS ~ ESG.INDEX + log(FIRM.SIZE) + DEBT.TO.ASSET, data = udaje.2021)

tidy(model2) |>
  kable(digits = 4, col.names = c("Premenná", "Odhad", "Štand. chyba", "t-hodnota", "p-hodnota"),
        caption = "Výsledky upraveného (logaritmického) modelu") |>
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Výsledky upraveného (logaritmického) modelu
Premenná Odhad Štand. chyba t-hodnota p-hodnota
(Intercept) -251.5197 285.5787 -0.8807 0.3814
ESG.INDEX 77.4955 107.1972 0.7229 0.4721
log(FIRM.SIZE) 115.1423 149.3354 0.7710 0.4432
DEBT.TO.ASSET -0.3154 0.3719 -0.8480 0.3992
glance(model2) |>
  select(-deviance) |>
  kable(
    digits = 4,
    col.names = c("R-kvadrát", "Upravený R²", "Sigma", "F-štatistika", "p-hodnota (F)", "df", "logLik", "AIC", "BIC", "df.residual", "N"),
    caption = "Súhrnné charakteristiky upraveného modelu (Model 2)"
  ) |>
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Súhrnné charakteristiky upraveného modelu (Model 2)
R-kvadrát Upravený R² Sigma F-štatistika p-hodnota (F) df logLik AIC BIC df.residual N
0.0493 0.0097 148.242 1.2446 0.3 3 -485.6971 981.3942 993.0479 72 76
par(mfrow = c(2, 2))
plot(model2)

Diagnostické grafy upraveného modelu
par(mfrow = c(1, 1))
jb_test2 <- jarque.bera.test(residuals(model2))

tidy(jb_test2) |>
  select(statistic, p.value, method) |>
  kable(digits = 4, col.names = c("JB štatistika", "p-hodnota", "Názov testu"), caption = "Test normality rezíduí (upravený model)") |>
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Test normality rezíduí (upravený model)
JB štatistika p-hodnota Názov testu
4376.343 0 Jarque Bera Test
outlier_test2 <- car::outlierTest(model2)

if (is.null(outlier_test2)) {
  cat("Nenašli sa žiadne odľahlé hodnoty v upravenom modeli.")
} else {
  outlier_table2 <- data.frame(
    Pozorovanie = names(outlier_test2$rstud),
    Student_reziduum = unname(outlier_test2$rstud),
    Bonferroni_p_hodnota = unname(outlier_test2$bonf.p)
  )

  outlier_table2 |>
    kable(digits = 4, col.names = c("Číslo firmy (riadok)", "Študentizované rezíduum", "Bonferroni p-hodnota"),
          caption = "Identifikácia odľahlých hodnôt (upravený model)") |>
    kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
}
Identifikácia odľahlých hodnôt (upravený model)
Číslo firmy (riadok) Študentizované rezíduum Bonferroni p-hodnota
429 -13.5621 0
save.image("pamat_esg.Rdata")
rm(list = ls())