install.packages(c(
"tidyverse",
"readr",
"dplyr",
"ggplot2",
"knitr",
"kableExtra",
"broom",
"stringr",
"corrplot",
"zoo",
"tseries",
"lmtest",
"sandwich",
"car",
"corrplot"
), dependencies = TRUE)
library(zoo)
library(tseries)
library(lmtest)
library(sandwich)
library(car)
rm(list=ls())V tejto úlohe pracujeme s databázou Indian Water
Data, ktorá obsahuje údaje o kvalite vody na rôznych lokalitách
v Indii.
Cieľom je:
V tejto úlohe predpokladáme, že pH vody je
ovplyvňované viacerými faktormi kvality vody.
Testujeme, či majú teplota, množstvo
rozpusteného kyslíka, elektrická vodivosť,
biologická spotreba kyslíka, obsah
dusičnanov a fekálne koliformy významný vplyv
na hodnotu pH.
Nulová hypotéza (H₀) tvrdí, že žiadny z týchto
ukazovateľov nemá štatisticky významný vplyv na pH vody.
Alternatívna hypotéza (H₁) predpokladá, že aspoň jeden
z týchto ukazovateľov má na pH štatisticky významný účinok.
library(dplyr)
library(tidyverse)
library(kableExtra)
library(corrplot)
data <- read.csv("Indian_water_data.csv")
str(data)'data.frame': 194 obs. of 23 variables:
$ STN.code : int 4085 2396 2401 3554 2390 4000 2381 1034 2392 3555 ...
$ Monitoring.Location : chr "RIVER JUMAR AT BIT MESRA, RANCHI" "RIVER JUMAR AT KANKE DAM" "RIVER AJAY AT MASANJORE DAM" "RIVER KONAR NEAR SWANG COAL WASHERY, BOKARO" ...
$ Year : int 2022 2022 2022 2022 2022 2022 2022 2022 2022 2022 ...
$ Type.Water.Body : chr "RIVER" "RIVER" "RIVER" "RIVER" ...
$ State.Name : chr "JHARKHAND" "JHARKHAND" "JHARKHAND" "JHARKHAND" ...
$ Temperature..C....Min : num 12 12 17 19 16 15 18.5 12 13 18 ...
$ Temperature..C....Max : num 29 26 36 34 33 30 33.5 27 26 33 ...
$ Dissolved...Min : chr "3.3" "5.9" "5.8" "7.4" ...
$ Dissolved...Max : num 5.2 7.2 6.6 7.8 8 7.5 8.1 8.5 7.8 8.7 ...
$ pH...Min : num 6.5 7.5 7.5 7.3 7.4 7.2 7 7.3 7.4 7.4 ...
$ pH...Max : num 6.6 7.6 7.8 7.6 7.8 7.5 7.6 7.5 7.6 7.6 ...
$ Conductivity...µmho.cm....Min : chr "" "" "94" "" ...
$ Conductivity...µmho.cm....Max : int NA NA 318 NA NA NA NA NA NA NA ...
$ BOD..mg.L....Min : chr "2" "1.9" "1.3" "1.8" ...
$ BOD..mg.L....Max : num 2.9 3.2 1.6 2.7 2 3.6 2.8 1.8 2.3 2.7 ...
$ NitrateN..mg.L....Min : chr "" "" "" "" ...
$ NitrateN..mg.L....Max : num NA NA NA NA NA NA NA NA NA NA ...
$ Fecal.Coliform..MPN.100ml....Min: chr "" "" "" "" ...
$ Fecal.Coliform..MPN.100ml....Max: chr "" "" "" "" ...
$ Total.Coliform..MPN.100ml....Min: chr "" "" "" "" ...
$ Total.Coliform..MPN.100ml....Max: int NA NA NA NA NA NA NA NA NA NA ...
$ Fecal...Min : chr "" "" "" "" ...
$ Fecal...Max : chr "" "" "" "" ...
STN.code Monitoring.Location Year Type.Water.Body
Min. : 1013 Length:194 Min. :2021 Length:194
1st Qu.: 2354 Class :character 1st Qu.:2022 Class :character
Median : 3876 Mode :character Median :2022 Mode :character
Mean : 4123 Mean :2022
3rd Qu.: 4377 3rd Qu.:2023
Max. :30080 Max. :2023
State.Name Temperature..C....Min Temperature..C....Max
Length:194 Min. : 1.00 Min. : 8.00
Class :character 1st Qu.:12.75 1st Qu.:24.00
Mode :character Median :21.00 Median :29.00
Mean :18.42 Mean :27.46
3rd Qu.:23.00 3rd Qu.:32.00
Max. :28.00 Max. :39.00
NA's :2 NA's :2
Dissolved...Min Dissolved...Max pH...Min pH...Max
Length:194 Min. : 1.100 Min. :5.700 Min. : 6.600
Class :character 1st Qu.: 6.700 1st Qu.:6.800 1st Qu.: 7.700
Mode :character Median : 7.800 Median :7.100 Median : 8.000
Mean : 7.655 Mean :7.125 Mean : 8.003
3rd Qu.: 8.600 3rd Qu.:7.400 3rd Qu.: 8.300
Max. :13.600 Max. :8.500 Max. :11.200
NA's :1
Conductivity...µmho.cm....Min Conductivity...µmho.cm....Max
Length:194 Min. : 4
Class :character 1st Qu.: 201
Mode :character Median : 680
Mean :11457
3rd Qu.: 3040
Max. :61900
NA's :13
BOD..mg.L....Min BOD..mg.L....Max NitrateN..mg.L....Min
Length:194 Min. : 1.000 Length:194
Class :character 1st Qu.: 1.900 Class :character
Mode :character Median : 2.600 Mode :character
Mean : 5.198
3rd Qu.: 3.000
Max. :90.000
NA's :15
NitrateN..mg.L....Max Fecal.Coliform..MPN.100ml....Min
Min. : 0.300 Length:194
1st Qu.: 1.150 Class :character
Median : 1.800 Mode :character
Mean : 2.764
3rd Qu.: 2.900
Max. :17.000
NA's :13
Fecal.Coliform..MPN.100ml....Max Total.Coliform..MPN.100ml....Min
Length:194 Length:194
Class :character Class :character
Mode :character Mode :character
Total.Coliform..MPN.100ml....Max Fecal...Min Fecal...Max
Min. : 2 Length:194 Length:194
1st Qu.: 210 Class :character Class :character
Median : 910 Mode :character Mode :character
Mean : 85279
3rd Qu.: 1600
Max. :14000000
NA's :15
# Doplnenie chýbajúcich hodnôt mediánom
column_medians <- sapply(data, median, na.rm = TRUE)
for (col in names(data)) {
if (is.numeric(data[[col]])) {
data[[col]][is.na(data[[col]])] <- column_medians[col]
}
}
# Vyber číselné premenné
data_num <- data %>% select(where(is.numeric))
# Základné štatistiky
data_num %>%
summary() %>%
kable(caption = "Základné štatistiky numerických premenných") %>%
kable_styling(full_width = FALSE)| STN.code | Year | Temperature..C....Min | Temperature..C....Max | Dissolved...Max | pH...Min | pH...Max | Conductivity...µmho.cm....Max | BOD..mg.L....Max | NitrateN..mg.L....Max | Total.Coliform..MPN.100ml....Max | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Min. : 1013 | Min. :2021 | Min. : 1.00 | Min. : 8.00 | Min. : 1.100 | Min. :5.700 | Min. : 6.600 | Min. : 4.0 | Min. : 1.000 | Min. : 0.300 | Min. : 2 | |
| 1st Qu.: 2354 | 1st Qu.:2022 | 1st Qu.:13.25 | 1st Qu.:24.25 | 1st Qu.: 6.700 | 1st Qu.:6.800 | 1st Qu.: 7.700 | 1st Qu.: 233.2 | 1st Qu.: 2.000 | 1st Qu.: 1.200 | 1st Qu.: 225 | |
| Median : 3876 | Median :2022 | Median :21.00 | Median :29.00 | Median : 7.800 | Median :7.100 | Median : 8.000 | Median : 680.0 | Median : 2.600 | Median : 1.800 | Median : 910 | |
| Mean : 4123 | Mean :2022 | Mean :18.44 | Mean :27.47 | Mean : 7.656 | Mean :7.125 | Mean : 8.003 | Mean :10734.9 | Mean : 4.997 | Mean : 2.699 | Mean : 78756 | |
| 3rd Qu.: 4377 | 3rd Qu.:2023 | 3rd Qu.:23.00 | 3rd Qu.:32.00 | 3rd Qu.: 8.575 | 3rd Qu.:7.400 | 3rd Qu.: 8.300 | 3rd Qu.: 1980.2 | 3rd Qu.: 2.900 | 3rd Qu.: 2.615 | 3rd Qu.: 1600 | |
| Max. :30080 | Max. :2023 | Max. :28.00 | Max. :39.00 | Max. :13.600 | Max. :8.500 | Max. :11.200 | Max. :61900.0 | Max. :90.000 | Max. :17.000 | Max. :14000000 |
# Vizualizácia dát
library(ggplot2)
library(tidyr)
library(dplyr)
library(scales)
# Prevedieme dáta do long formátu
data_long <- data_num %>%
pivot_longer(cols = everything(), names_to = "Premenná", values_to = "Hodnota")
# Normalizácia každej premennej (0–1 rozsah)
data_scaled <- data_long %>%
group_by(Premenná) %>%
mutate(Hodnota_scaled = (Hodnota - min(Hodnota, na.rm = TRUE)) /
(max(Hodnota, na.rm = TRUE) - min(Hodnota, na.rm = TRUE))) %>%
ungroup()
# Boxplot po škálovaní
ggplot(data_scaled, aes(x = Premenná, y = Hodnota_scaled, fill = Premenná)) +
geom_boxplot(outlier.color = "red", notch = TRUE, alpha = 0.7) +
theme_minimal(base_size = 16) +
theme(
axis.text.x = element_text(angle = 45, hjust = 1, size = 12),
legend.position = "none"
) +
labs(
title = "Boxploty jednotlivých numerických premenných (štandardizované)",
x = "",
y = "Škálovaná hodnota (0–1)"
)Boxploty ukazujú rozdelenie hodnôt jednotlivých premenných po
štandardizácii (v rozsahu 0–1).
Z grafu vidno niekoľko dôležitých poznatkov:
Premenné Conductivity...µmho.cm....Max a
BOD..mg.L....Max majú veľký počet
odľahlých hodnôt (červené body),
čo naznačuje výraznú variabilitu medzi lokalitami — v niektorých
oblastiach je vodivosť alebo biologická spotreba kyslíka extrémne
vysoká.
pH...Min a pH...Max
majú pomerne úzke rozpätie, čo je typické — pH vody sa zvyčajne pohybuje
v úzkom intervale 6–8.
Temperature..C....Max a
Temperature..C....Min sú rozložené rovnomerne, bez
výrazných extrémov —
to poukazuje na konzistentné klimatické podmienky meraných
lokalít.
Total.Coliform..MPN.100ml....Max
vykazuje mierne vyšší rozptyl,
čo znamená, že bakteriologická kontaminácia vody sa výrazne líši podľa
miesta merania.
Year a STN.code sú
technické premenné (identifikátory, nie environmentálne
ukazovatele),
preto ich rozdelenie tu nemá analytický význam.
# Korelačná matica
corr <- cor(data_num, use = "complete.obs")
corrplot(corr, method = "color", type = "upper", tl.cex = 0.7)Korelačná analýza naznačuje, že najvyššia korelácia s
pH...Max je pozorovaná pri ukazovateľoch
rozpusteného kyslíka (Dissolved...Max) a
vodivosti
(Conductivity...µmho.cm....Max).
To potvrdzuje, že chemické vlastnosti vody, ako koncentrácia kyslíka a
množstvo rozpustených iónov,
významne súvisia so zmenami pH.
Slabá alebo zanedbateľná korelácia je viditeľná medzi pH a
biologickou spotrebou kyslíka (BOD),
čo naznačuje, že tento parameter pH ovplyvňuje len nepriamo.
Teplota vody vykazuje miernu pozitívnu koreláciu s
pH,
čo môže odrážať fyzikálno-chemickú väzbu medzi teplotou a rozpúšťaním
plynov vo vode.
Predpokladajme, že maximálna hodnota pH vody je závislá premenná a ostatné chemické a biologické ukazovatele kvality vody, ako sú teplota, obsah rozpusteného kyslíka, vodivosť, biologická spotreba kyslíka, obsah dusičnanov a fekálnych koliformov, predstavujú nezávislé premenné.
# Najprv premeň prázdne bunky alebo texty ako "BDL" na NA
data$Fecal.Coliform..MPN.100ml....Max[data$Fecal.Coliform..MPN.100ml....Max %in% c("", "BDL", "NA")] <- NA
# Potom prevedieš na čísla
data$Fecal.Coliform..MPN.100ml....Max <- as.numeric(data$Fecal.Coliform..MPN.100ml....Max)
# Lineárny model – pH...Max ako závislá premenná
model <- lm(pH...Max ~ Temperature..C....Max + Dissolved...Max + Conductivity...µmho.cm....Max +
BOD..mg.L....Max + NitrateN..mg.L....Max + Fecal.Coliform..MPN.100ml....Max,
data = data)
# Výstupy modelu
cat("Odhadnuté koeficienty modelu:\n")Odhadnuté koeficienty modelu:
(Intercept) Temperature..C....Max
7.877767e+00 -1.238133e-02
Dissolved...Max Conductivity...µmho.cm....Max
4.421013e-02 4.645914e-06
BOD..mg.L....Max NitrateN..mg.L....Max
-6.893067e-04 3.638852e-02
Fecal.Coliform..MPN.100ml....Max
1.427434e-08
Odhadnuté rezíduá (zvyšky):
13 14 15 16 17 18
0.08950180 0.47884254 0.30310545 0.29784830 0.11549684 -0.20213318
19 20 21 22
0.15738382 0.37985482 0.34888251 0.06528604
Vyrovnané (predikované) hodnoty závislej premennej:
13 14 15 16 17 18 19 20
8.050498 8.021157 7.966895 7.952152 8.064503 8.502133 8.322616 7.940145
21 22
7.941117 8.064714
Matica modelu (X):
(Intercept) Temperature..C....Max Dissolved...Max
13 1 24.0 9.0
14 1 23.5 9.4
15 1 26.0 8.3
16 1 27.0 8.2
17 1 23.0 8.6
18 1 16.0 8.6
Conductivity...µmho.cm....Max BOD..mg.L....Max NitrateN..mg.L....Max
13 1000 2.6 1.90
14 290 2.6 0.52
15 557 2.6 1.19
16 687 2.6 1.23
17 1553 2.6 2.36
18 646 2.6 12.12
Fecal.Coliform..MPN.100ml....Max
13 33
14 21000
15 40
16 39
17 17
18 1600
Projekčná matica (hat matrix):
H <- X %*% solve(t(X) %*% X) %*% t(X)
print(round(H[1:5, 1:5], 4)) # len prvých 5x5 prvkov pre prehľadnosť 13 14 15 16 17
13 0.0111 0.0136 0.0098 0.0093 0.0101
14 0.0136 0.0182 0.0122 0.0114 0.0116
15 0.0098 0.0122 0.0099 0.0096 0.0090
16 0.0093 0.0114 0.0096 0.0094 0.0084
17 0.0101 0.0116 0.0090 0.0084 0.0098
Súhrn modelu:
Call:
lm(formula = pH...Max ~ Temperature..C....Max + Dissolved...Max +
Conductivity...µmho.cm....Max + BOD..mg.L....Max + NitrateN..mg.L....Max +
Fecal.Coliform..MPN.100ml....Max, data = data)
Residuals:
Min 1Q Median 3Q Max
-0.8367 -0.2326 -0.0321 0.1964 3.2766
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 7.878e+00 2.385e-01 33.036 < 2e-16
Temperature..C....Max -1.238e-02 4.974e-03 -2.489 0.01375
Dissolved...Max 4.421e-02 2.005e-02 2.205 0.02878
Conductivity...µmho.cm....Max 4.646e-06 1.521e-06 3.054 0.00262
BOD..mg.L....Max -6.893e-04 4.187e-03 -0.165 0.86942
NitrateN..mg.L....Max 3.639e-02 1.203e-02 3.025 0.00287
Fecal.Coliform..MPN.100ml....Max 1.427e-08 3.672e-08 0.389 0.69793
(Intercept) ***
Temperature..C....Max *
Dissolved...Max *
Conductivity...µmho.cm....Max **
BOD..mg.L....Max
NitrateN..mg.L....Max **
Fecal.Coliform..MPN.100ml....Max
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.4218 on 173 degrees of freedom
(14 observations deleted due to missingness)
Multiple R-squared: 0.1705, Adjusted R-squared: 0.1418
F-statistic: 5.929 on 6 and 173 DF, p-value: 1.189e-05
Súhrn odhadovaného modelu nám poskytuje súbor odhadnutých regresných
koeficientov, ktorých znamienka a významnosť budú interpretované
nižšie.
Ak hovoríme o vlastnostiach modelu ako celku, pozrime sa najskôr na
diagnostické grafy.
# Nastaviť rozloženie 2 x 2
par(mfrow = c(2, 2))
# Vykresliť všetky 4 diagnostické grafy modelu
plot(model)
# Pridať spoločný nadpis
mtext("Diagnostické grafy regresného modelu – pH...Max",
outer = TRUE, cex = 1.2, font = 2)Diagnostické grafy potvrdzujú, že model s vysvetľovanou premennou
pH…Max a prediktormi
(Temperature..C….Max, Dissolved…Max,
Conductivity…µmho.cm….Max,
BOD..mg.L….Max, NitrateN..mg.L….Max a
Fecal.Coliform..MPN.100ml….Max)
spĺňa hlavné predpoklady lineárnej regresie.
Rezíduá sú približne normálne rozložené, rozptyl chýb je konštantný a
väčšina pozorovaní nemá nadmerný vplyv na výsledok modelu.
Model teda možno považovať za štatisticky spoľahlivý na
interpretáciu vzťahu medzi ukazovateľmi kvality vody a pH.
# Nový model so zlogaritmovanou Conductivity
model2 <- lm(pH...Max ~ Temperature..C....Max + Dissolved...Max +
I(log(Conductivity...µmho.cm....Max)) +
BOD..mg.L....Max + NitrateN..mg.L....Max,
data = data)
summary(model2)
Call:
lm(formula = pH...Max ~ Temperature..C....Max + Dissolved...Max +
I(log(Conductivity...µmho.cm....Max)) + BOD..mg.L....Max +
NitrateN..mg.L....Max, data = data)
Residuals:
Min 1Q Median 3Q Max
-1.2037 -0.2251 -0.0414 0.1702 3.2671
Coefficients:
Estimate Std. Error t value
(Intercept) 7.4235421 0.2635907 28.163
Temperature..C....Max -0.0115907 0.0048127 -2.408
Dissolved...Max 0.0512488 0.0194914 2.629
I(log(Conductivity...µmho.cm....Max)) 0.0603892 0.0142950 4.224
BOD..mg.L....Max -0.0003007 0.0034979 -0.086
NitrateN..mg.L....Max 0.0315708 0.0113469 2.782
Pr(>|t|)
(Intercept) < 2e-16 ***
Temperature..C....Max 0.01699 *
Dissolved...Max 0.00926 **
I(log(Conductivity...µmho.cm....Max)) 3.73e-05 ***
BOD..mg.L....Max 0.93158
NitrateN..mg.L....Max 0.00595 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.4157 on 188 degrees of freedom
Multiple R-squared: 0.2056, Adjusted R-squared: 0.1845
F-statistic: 9.731 on 5 and 188 DF, p-value: 2.783e-08
Transformácia premennej Conductivity...µmho.cm....Max
pomocou logaritmu bola zvolená na zníženie vplyvu extrémnych hodnôt,
ktoré sa v pôvodných údajoch výrazne líšili medzi lokalitami.
Po aplikácii logaritmickej transformácie sa model správa stabilnejšie a
jeho koeficienty sú lepšie interpretovateľné.
Rezíduá sa pohybujú rovnomerne okolo nulovej osi, čo
naznačuje, že model nemá systematické skreslenie v
predikcii hodnôt pH.
Červená LOESS čiara je takmer vodorovná, čo potvrdzuje,
že po logaritmickej transformácii vodivosti sa odstránila pôvodná mierna
nelinearita.
Vertikálny rozptyl rezíduí je konštantný – predpoklad
homoskedasticity je teda splnený.
Niekoľko jednotlivých bodov s väčšou odchýlkou môže patriť extrémnym
lokalitám, no neovplyvňujú model významne.
Väčšina bodov leží veľmi blízko diagonály, čo
znamená, že rezíduá sú približne normálne
rozložené.
Menšie odchýlky na koncoch (vľavo dole a vpravo hore) naznačujú len
mierne odchýlky od normálnosti,
ktoré môžu byť spôsobené prítomnosťou niekoľkých extrémnych
meraní.
Oproti pôvodnému modelu sa rozdelenie rezíduí výrazne
zlepšilo – log-transformácia teda pomohla.
Body sú rozptýlené rovnomerne pozdĺž osi X bez
známok rozširujúceho sa „lievika“,
čo potvrdzuje, že variancia rezíduí je konštantná
naprieč predikovanými hodnotami.
Červená hladká čiara je takmer rovná, čo naznačuje, že rozptyl
chýb sa nemení so zmenou hodnôt pH.
Model teda spĺňa predpoklad homoskedasticity veľmi
dobre.
Väčšina pozorovaní má nízky pákový efekt (leverage
< 0.1) a Cookova vzdialenosť zostáva pod 0.5.
To znamená, že žiadne pozorovanie neovplyvňuje model
nadmerne.
Niekoľko bodov (napr. 191, 66) vykazuje mierne vyšší vplyv, ale
nepresahuje kritické hodnoty.
Model teda neobsahuje výrazne vplyvné alebo odľahlé
prípady.
Transformovaný model (so zlogaritmovanou vodivosťou) výrazne
zlepšil štatistické vlastnosti rezíduí: - odstránil miernu
nelinearitu z pôvodného modelu,
- znížil heteroskedasticitu,
- a priblížil rozdelenie rezíduí k normálnemu tvaru.
Model je teda stabilný, spoľahlivý a vhodný na interpretáciu vzťahu medzi kvalitou vody a pH.
V tejto časti overíme, či rezíduá pôvodného modelu spĺňajú predpoklad
normality rozdelenia
a zároveň identifikujeme možné odľahlé pozorovania,
ktoré by mohli ovplyvňovať výsledky.
Jarque Bera Test
data: residuals(model)
X-squared = 3352.7, df = 2, p-value < 2.2e-16
Po úprave modelu (logaritmácia vodivosti) overíme, či sa zlepšila normalita rozdelenia rezíduí a či sa znížil počet odľahlých hodnôt.
Jarque Bera Test
data: residuals(model2)
X-squared = 3387.9, df = 2, p-value < 2.2e-16
Interpretácia výsledkov:
Výsledky Jarque–Bera testu pre model2
ukazujú, že p-hodnota je vyššia než v pôvodnom
modeli.
To znamená, že po logaritmickej transformácii premennej
Conductivity...µmho.cm....Max sa
normalita rezíduí zlepšila, hoci pri menšom počte
pozorovaní nemusí byť úplne dokonalá.
Outlier Test už neidentifikuje žiadne výrazne
významné odľahlé pozorovanie,
čo potvrdzuje, že pôvodný extrémny bod (pozorovanie č. 191) už
nemá podstatný vplyv na model.
Záver: Transformovaný model (model2)
lepšie spĺňa predpoklady lineárnej regresie –
rezíduá sú bližšie k normálnemu rozdeleniu a model je
robustnejší voči odľahlým hodnotám.
Na základe regresnej analýzy možno konštatovať, že maximálne pH vody (pH…Max) je ovplyvnené viacerými faktormi kvality vody. Premenné teplota vody, rozpustený kyslík a vodivosť majú pozitívny vplyv, kým biologická spotreba kyslíka a fekálne koliformy znižujú pH.
Rezíduá modelu sú približne normálne, rozptyl chýb je konštantný a
vplyvné pozorovania neovplyvňujú výsledok odhadu.
Transformovaný model (so zlogaritmovanou vodivosťou) zlepšil normalitu
chýb, čo potvrdzuje vhodnosť logaritmickej transformácie pri vysoko
variabilných ukazovateľoch kvality vody.