Statistika - Zadaća 2

Z2: Analize numeričkih podataka

library(readxl)
library(ggplot2)
library(rstatix)

Attaching package: 'rstatix'
The following object is masked from 'package:stats':

    filter
library(coin)
Loading required package: survival

Attaching package: 'coin'
The following objects are masked from 'package:rstatix':

    chisq_test, friedman_test, kruskal_test, sign_test, wilcox_test
library(car)
Loading required package: carData
library(ggpubr)

# ================================================================
# UČITAVANJE PODATAKA
# ================================================================

# Učitaj novu bazu
df1 <- read_excel("/Users/lucijalibric/Desktop/Statistika/VJEZBE_BAZA_2019.xlsx")

# Preimenuj stupce
colnames(df1) <- c("sifra", "Spol", "Dob", "Skupina", "Stupanj", "Dijabetes",
                   "SE", "Eritrociti", "Hgb", "Htc", "MCV", "MCHC", 
                   "Leukocit", "Trombocit", "Glukoza", "Ureja", "Kreatinin", "Kalij",
                   "BMD1_G1", "BMD2_G1", "BMD1_G2", "BMD2_G2", "BMD1_G3", "BMD2_G3",
                   "Osteo1_G1", "Osteo2_G1", "Osteo1_G2", "Osteo2_G2", "Osteo1_G3", "Osteo2_G3",
                   "Beta1_G1", "Beta2_G1", "Beta1_G2", "Beta2_G2", "Beta1_G3", "Beta2_G3",
                   "SubjOc_G1", "SubjOc_G2", "SubjOc_G3",
                   "VAS1_G1", "VAS2_G1", "VAS1_G2", "VAS2_G2", "VAS1_G3", "VAS2_G3",
                   "Pb_G1", "Hg_G1", "Cd_G1", "As_G1", "CrB_G1", "CrS_G1",
                   "Ni_G1", "Al_G1", "Mg_G1", "Ca_G1", "Se_G1", "Zn_G1",
                   "Pb_G2", "Hg_G2", "Cd_G2", "As_G2", "CrB_G2", "CrS_G2",
                   "Ni_G2", "Al_G2", "Mg_G2", "Ca_G2", "Se_G2", "Zn_G2",
                   "Pb_G3", "Hg_G3", "Cd_G3", "As_G3", "CrB_G3", "CrS_G3",
                   "Ni_G3", "Al_G3", "Mg_G3", "Ca_G3", "Se_G3", "Zn_G3")

 

Odgovorite na postavljene zadatke, interpretirajte sve rezultate i odgovarajuće veličine efekata. 

1. Odaberite varijablu čije vrijednosti možete sučeliti s poznatom ili poželjnom vrijednošću pa napravite usporedbu uzorka s danom mjerom u populaciji (one sample t-test) ili odabranom konstantom. 

Odabrana varijabla: Hemoglobin (Hgb)

Istraživačko pitanje:

Razlikuje li se razina hemoglobina u ispitivanih bolesnika od referentne vrijednosti od 130 g/L?

H₀: Srednja razina hemoglobina u ispitivanih bolesnika ne razlikuje se od referentne vrijednosti (μ = 130 g/L)

H₁: Srednja razina hemoglobina u ispitivanih bolesnika razlikuje se od referentne vrijednosti (μ = 130 g/L)

# Deskriptivna statistika
cat("n =", length(df1$Hgb), "\n")
n = 120 
cat("Mean =", round(mean(df1$Hgb, na.rm = TRUE), 3), "\n")
Mean = 135.658 
cat("SD =", round(sd(df1$Hgb, na.rm = TRUE), 3), "\n")
SD = 14.435 
cat("Median =", round(median(df1$Hgb, na.rm = TRUE), 3), "\n")
Median = 137.5 
# Provjera normalnosti
sw <- shapiro.test(df1$Hgb)
cat("W =", round(sw$statistic, 3), "| p =", round(sw$p.value, 3), "\n")
W = 0.988 | p = 0.401 
# Histogram
ggplot(df1, aes(x = Hgb)) +
  geom_histogram(bins = 20, fill = "#2E86C1",
                 color = "white", alpha = 0.8) +
  geom_vline(xintercept = 130, linetype = "dashed",
             color = "#E74C3C", linewidth = 1) +
  annotate("text", x = 133, y = 15,
           label = "Ref = 130", color = "#E74C3C", size = 4) +
  labs(title = "Distribucija hemoglobina",
       subtitle = "Crvena linija = referentna vrijednost (130 g/L)",
       x = "Hemoglobin (g/L)", y = "Frekvencija") +
  theme_minimal(base_size = 12)

# One sample t-test
t.test(df1$Hgb, mu = 130)

    One Sample t-test

data:  df1$Hgb
t = 4.2939, df = 119, p-value = 3.602e-05
alternative hypothesis: true mean is not equal to 130
95 percent confidence interval:
 133.0490 138.2676
sample estimates:
mean of x 
 135.6583 
# Veličina efekta (Cohen's d)
d <- (mean(df1$Hgb, na.rm = TRUE) - 130) / sd(df1$Hgb, na.rm = TRUE)
cat("Cohen's d =", round(d, 3), "\n")
Cohen's d = 0.392 

Provjera uvjeta:

Shapiro-Wilk test pokazao je da je hemoglobin normalno distribuiran (p = 0,401, ne odbacujemo H₀ da su podaci normalno distribuirani) → uvjet za primjenu t-testa je zadovoljen

Deskriptivna statistika:

  • n = 120

  • Mean = 135,658 g/L

  • SD = 14,435 g/L

  • Median = 137,500 g/L

Rezultati:

Studentov t-test za jedan uzorak (one sample t-test), s kriterijem statističke značajnosti α=0,05 (5%); ako je p>α, H0 se prihvaća

Mjera Vrijednost
t 4,294
df 119
p < 0,001
95% CI 133,049 – 138,268 g/L

Veličina efekta:

Cohen’s d = 0,392 → mali do srednji efekt

Zaključak:

One sample t-test pokazao je statistički značajnu razliku između srednje razine hemoglobina u ispitivanih bolesnika (M = 135,658 g/L; SD = 14,435) i referentne vrijednosti od 130 g/L (t(119) = 4,294; p < 0,001). Interval pouzdanosti (133,049 – 138,268 g/L) ne uključuje referentnu vrijednost od 130 g/L, što dodatno potvrđuje statističku značajnost. Veličina efekta je mala do srednja (Cohen’s d = 0,392). Odbacujemo H₀ i prihvaćamo alternativnu hipotezu — razina hemoglobina u ispitivanih bolesnika uključenih u ovo istraživanje statistički se značajno razlikuje od referentne vrijednosti.


2. Usporedite dva nezavisna uzorka pomoću t-testa (odaberite jednu odgovarajuću numeričku kontinuiranu varijablu i jednu kategoričku koja će služiti za grupiranje u dva uzorka).

Odabrana kategorička varijabla: Skupina (Lijek/Placebo)

Odabrana numerička varijabla: Dob

Istraživačko pitanje:

Postoji li statistički značajna razlika u dobi ispitanika između skupine koja prima lijek i placebo skupine?

H₀: Ne postoji razlika u dobi između skupine koja je primila lijek i one koje je primila placebo (μ₁ = μ₂)

H₁: Postoji razlika u dobi između skupine koja je primila lijek i one koje je primila placebo (μ₁ ≠ μ₂)

# Deskriptivna statistika po skupinama
cat("Lijek: n =", length(df1$Dob[df1$Skupina == "Lijek"]),
    "| Mean =", round(mean(df1$Dob[df1$Skupina == "Lijek"], na.rm = TRUE), 3),
    "| SD =", round(sd(df1$Dob[df1$Skupina == "Lijek"], na.rm = TRUE), 3), "\n")
Lijek: n = 57 | Mean = 66.812 | SD = 7.737 
cat("Placebo: n =", length(df1$Dob[df1$Skupina == "Placebo"]),
    "| Mean =", round(mean(df1$Dob[df1$Skupina == "Placebo"], na.rm = TRUE), 3),
    "| SD =", round(sd(df1$Dob[df1$Skupina == "Placebo"], na.rm = TRUE), 3), "\n")
Placebo: n = 63 | Mean = 67.021 | SD = 9.964 
# Provjera normalnosti
sw_dob <- shapiro.test(df1$Dob)
sw_l <- shapiro.test(df1$Dob[df1$Skupina == "Lijek"])
sw_p <- shapiro.test(df1$Dob[df1$Skupina == "Placebo"])
cat("Dob:   W =", round(sw_dob$statistic, 3), "| p =", round(sw_dob$p.value, 3), "\n")
Dob:   W = 0.982 | p = 0.102 
cat("Lijek:   W =", round(sw_l$statistic, 3), "| p =", round(sw_l$p.value, 3), "\n")
Lijek:   W = 0.991 | p = 0.947 
cat("Placebo: W =", round(sw_p$statistic, 3), "| p =", round(sw_p$p.value, 3), "\n")
Placebo: W = 0.966 | p = 0.076 
# Leveneov test
leveneTest(Dob ~ Skupina, data = df1)
Warning in leveneTest.default(y = y, group = group, ...): group coerced to
factor.
Levene's Test for Homogeneity of Variance (center = median)
       Df F value  Pr(>F)  
group   1  3.7674 0.05465 .
      118                  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Boxplot
ggplot(df1, aes(x = Skupina, y = Dob, fill = Skupina)) +
  geom_boxplot(alpha = 0.7) +
  geom_jitter(width = 0.1, alpha = 0.3, size = 1.5) +
  scale_fill_manual(values = c("Lijek" = "#2E86C1", "Placebo" = "#E74C3C")) +
  labs(title = "Dob prema skupini",
       subtitle = "Usporedba Lijek i Placebo grupe",
       x = "Skupina", y = "Dob (godine)",
       fill = "Skupina") +
  theme_minimal(base_size = 12)

# Independent samples t-test
t.test(Dob ~ Skupina, data = df1, var.equal = TRUE)

    Two Sample t-test

data:  Dob by Skupina
t = -0.12712, df = 118, p-value = 0.8991
alternative hypothesis: true difference in means between group Lijek and group Placebo is not equal to 0
95 percent confidence interval:
 -3.457900  3.040718
sample estimates:
  mean in group Lijek mean in group Placebo 
             66.81219              67.02078 
# Veličina efekta (Cohen's d)
m1 <- mean(df1$Dob[df1$Skupina == "Lijek"], na.rm = TRUE)
m2 <- mean(df1$Dob[df1$Skupina == "Placebo"], na.rm = TRUE)
sd1 <- sd(df1$Dob[df1$Skupina == "Lijek"], na.rm = TRUE)
sd2 <- sd(df1$Dob[df1$Skupina == "Placebo"], na.rm = TRUE)
n1 <- length(df1$Dob[df1$Skupina == "Lijek"])
n2 <- length(df1$Dob[df1$Skupina == "Placebo"])
sp <- sqrt(((n1-1)*sd1^2 + (n2-1)*sd2^2) / (n1+n2-2))
d <- (m1 - m2) / sp
cat("Cohen's d =", round(d, 3), "\n")
Cohen's d = -0.023 
cat("Interpretacija: ")
Interpretacija: 
if (abs(d) < 0.2) cat("zanemariv efekt\n")
zanemariv efekt
if (abs(d) >= 0.2 & abs(d) < 0.5) cat("mali efekt\n")
if (abs(d) >= 0.5 & abs(d) < 0.8) cat("srednji efekt\n")
if (abs(d) >= 0.8) cat("veliki efekt\n")

Provjera uvjeta:

Normalnost (Shapiro-Wilk):

  • Dob: W = 0,982, p = 0,102 → normalna

  • Lijek: W = 0,991 p = 0,947 → normalna

  • Placebo: W = 0,966; p = 0,076 → normalna

    Normalna distribucija varijable “Dob” (i cijele varijable i po skupinama) dokazana je koristeći Shapiro-Wilk test kojim smo prihvatili nul hipotezu da su podaci normalno distribuirani.

Homogenost varijanci (Leveneov test):

  • p = 0,055→ varijance su homogene (ne odbacujemo H₀ da su varijance homogene)

Koristimo standardni t-test (var.equal = TRUE)

Deskriptivna statistika:

Skupina n Mean SD
Lijek 57 66,812 godina 7,737
Placebo 63 67,021 godina 9,964

Rezultati:

Studentov t-test za dva uzorka s kriterijem statističke značajnosti α=0,05 (5%); ako je p>α, H0 se prihvaća

Mjera Vrijednost
t -0,127
df 118
p 0,899
95% CI razlike -3,458-3,041 godina

Veličina efekta:

Cohen’s d = -0,023 (gledamo apsolutnu vrijednost)

Zaključak:

Independent samples t-test nije pokazao statistički značajnu razliku u dobi između Lijek grupe (M = 66,812 godina; SD = 7,737) i Placebo grupe (M = 67,021 godina; SD = 9,964) (t(118) = -0,127; p = 0,899). Veličina efekta je mala/zanemariva (|Cohen’s d| = 0,023). Ne odbacujemo H₀ što znači da ne postoji statistički značajna razlika u dobi između skupina, i potvrđuje da su grupe ujednačene po dobi te da je randomizacija u tom pogledu bila uspješna. Veličina efekta je izračunata, ali budući da je nul-hipoteza prihvaćena i da ne postoji statistički značajna razlika, nije ju potrebno interpretirati.


3. Usporedite dva nezavisna uzorka pomoću neparametrijske inačice t-testa: MannWhitney U-test (isto kao pod 2).

Kategorička varjabla: Skupina (Lijek/Placebo)

Numerička varijabla: Glukoza

Istraživačko pitanje:

Razlikuje li se razina glukoze između Lijek i Placebo grupe?

H₀: Ne postoji razlika u razini glukoze između Lijek i Placebo grupe

H₁: Postoji razlika u razini glukoze između Lijek i Placebo grupe

# Deskriptivna statistika
cat("Lijek: n =", length(df1$Glukoza[df1$Skupina == "Lijek"]),
    "| Median =", round(median(df1$Glukoza[df1$Skupina == "Lijek"], na.rm = TRUE), 3),
    "| IQR =", round(IQR(df1$Glukoza[df1$Skupina == "Lijek"], na.rm = TRUE), 3), "\n")
Lijek: n = 57 | Median = 5.8 | IQR = 1.5 
cat("Placebo: n =", length(df1$Glukoza[df1$Skupina == "Placebo"]),
    "| Median =", round(median(df1$Glukoza[df1$Skupina == "Placebo"], na.rm = TRUE), 3),
    "| IQR =", round(IQR(df1$Glukoza[df1$Skupina == "Placebo"], na.rm = TRUE), 3), "\n")
Placebo: n = 63 | Median = 5.8 | IQR = 1.5 
# Provjera normalnosti
sw_l <- shapiro.test(df1$Glukoza[df1$Skupina == "Lijek"])
sw_p <- shapiro.test(df1$Glukoza[df1$Skupina == "Placebo"])
cat("Lijek:   W =", round(sw_l$statistic, 3), "| p =", round(sw_l$p.value, 4), "\n")
Lijek:   W = 0.957 | p = 0.0404 
cat("Placebo: W =", round(sw_p$statistic, 3), "| p =", round(sw_p$p.value, 4), "\n")
Placebo: W = 0.617 | p = 0 
cat("→ distribucija nije normalna → Mann-Whitney U-test\n")
→ distribucija nije normalna → Mann-Whitney U-test
# Boxplot
ggplot(df1, aes(x = Skupina, y = Glukoza, fill = Skupina)) +
  geom_boxplot(alpha = 0.7) +
  geom_jitter(width = 0.1, alpha = 0.3, size = 1.5) +
  scale_fill_manual(values = c("Lijek" = "#2E86C1", "Placebo" = "#E74C3C")) +
  labs(title = "Glukoza prema skupini",
       x = "Skupina", y = "Glukoza (mmol/L)",
       fill = "Skupina") +
  theme_minimal(base_size = 12)

# Mann-Whitney U-test
wilcox.test(Glukoza ~ Skupina, data = df1, exact = FALSE)

    Wilcoxon rank sum test with continuity correction

data:  Glukoza by Skupina
W = 1814.5, p-value = 0.9225
alternative hypothesis: true location shift is not equal to 0
# Veličina efekta (r)
eff <- wilcox_effsize(df1, Glukoza ~ Skupina)
print(eff)
# A tibble: 1 × 7
  .y.     group1 group2  effsize    n1    n2 magnitude
* <chr>   <chr>  <chr>     <dbl> <int> <int> <ord>    
1 Glukoza Lijek  Placebo 0.00912    57    63 small    
cat("r =", round(eff$effsize, 3), "\n")
r = 0.009 
cat("Interpretacija: ")
Interpretacija: 
r <- abs(eff$effsize)
if (r < 0.1) cat("zanemariv efekt\n")
zanemariv efekt
if (r >= 0.1 & r < 0.3) cat("mali efekt\n")
if (r >= 0.3 & r < 0.5) cat("srednji efekt\n")
if (r >= 0.5) cat("veliki efekt\n")

Provjera uvjeta:

Normalnost (Shapiro-Wilk):

  • Lijek: W = 0,957; p = 0,040 → nije normalna 

  • Placebo: W = 0,617; p < 0,001 → nije normalna 

Budući da distribucija nije normalna u obje grupe → primjenjujemo Mann-Whitney U-test.

Teoretski nismo trebali provjeravati normalnost jer neparametrijski testovi nemaju preduvjete.

Deskriptivna statistika:

Skupina n Median IQR
Lijek 57 5,800 mmol/L 1,500
Placebo 63 5,800 mmol/L 1,500

Rezultati:

Mann Whitney U-test s kriterijem statističke značajnosti α=0,05 (5%); ako je p>α, H0 se prihvaća.

Mjera Vrijednost
W 1814,5
p 0,923

Veličina efekta:

r = 0,009 → zanemariv efekt

Zaključak:

Mann-Whitney U-test nije pokazao statistički značajnu razliku u razini glukoze između grupe ispitanika koja je primila lijek (Median = 5,800 mmol/L; IQR = 1,500) i grupe koja je primila placebo (Median = 5,800 mmol/L; IQR = 1,500) (W = 1814,5; p = 0,923). Već je prema grafičkom prikazu jasno da nema razlike u medijalnim vrijednostima između skupina. Veličina efekta je zanemariva (r = 0,009). Ne odbacujemo H₀ što znači da ne postoji statistički značajna razlika u razini glukoze između skupina.


4. Usporedite t-testom za zavisne uzorke dva prikladna uzorka (dvije kontinuirane numeričke varijable koje predstavljaju zavisne uzorke). 

Tražim prikladne uzorke - provjera normalnosti razlika za parove:

parovi <- list(
  c("BMD1_G1", "BMD1_G2"), c("BMD1_G1", "BMD1_G3"),
  c("BMD2_G1", "BMD2_G2"), c("BMD2_G1", "BMD2_G3"),
  c("Osteo1_G1", "Osteo1_G2"), c("Osteo1_G1", "Osteo1_G3"),
  c("Beta1_G1", "Beta1_G2"), c("Beta1_G1", "Beta1_G3"),
  c("VAS1_G1", "VAS1_G2"), c("VAS1_G1", "VAS1_G3"),
  c("Mg_G1", "Mg_G2"), c("Mg_G1", "Mg_G3"),
  c("Ca_G1", "Ca_G2"), c("Ca_G1", "Ca_G3")
)

cat("--- Normalno distribuirane razlike (p > 0.05) ---\n")
--- Normalno distribuirane razlike (p > 0.05) ---
for (p in parovi) {
  x1 <- suppressWarnings(as.numeric(df1[[p[1]]]))
  x2 <- suppressWarnings(as.numeric(df1[[p[2]]]))
  diff <- x1 - x2
  diff <- diff[!is.na(diff)]
  if (length(diff) > 3) {
    sw <- suppressWarnings(shapiro.test(diff))
    if (sw$p.value > 0.05) {
      cat(p[1], "vs", p[2],
          "| W =", round(sw$statistic, 3),
          "| p =", round(sw$p.value, 3), "→ NORMALNA ✓\n")
    }
  }
}
Mg_G1 vs Mg_G2 | W = 0.984 | p = 0.159 → NORMALNA ✓

Odabrane varijable: Mg_G1 i Mg_G2

Istraživačko pitanje:

Razlikuje li se razina magnezija između prve i druge godine mjerenja u ispitivanih bolesnika?

H₀: Ne postoji razlika u razini magnezija između G1 i G2 (μ_razlike = 0)

H₁: Postoji razlika u razini magnezija između G1 i G2 (μ_razlike ≠ 0)

# Pretvori u numeričke
df1$Mg_G1_num <- suppressWarnings(as.numeric(df1$Mg_G1))
df1$Mg_G2_num <- suppressWarnings(as.numeric(df1$Mg_G2))
df1$Mg_diff <- df1$Mg_G1_num - df1$Mg_G2_num

# Deskriptivna statistika
cat("Mg_G1: Mean =", round(mean(df1$Mg_G1_num, na.rm = TRUE), 3),
    "| SD =", round(sd(df1$Mg_G1_num, na.rm = TRUE), 3),
    "| Median =", round(median(df1$Mg_G1_num, na.rm = TRUE), 3), "\n")
Mg_G1: Mean = 18.938 | SD = 1.514 | Median = 19.04 
cat("Mg_G2: Mean =", round(mean(df1$Mg_G2_num, na.rm = TRUE), 3),
    "| SD =", round(sd(df1$Mg_G2_num, na.rm = TRUE), 3),
    "| Median =", round(median(df1$Mg_G2_num, na.rm = TRUE), 3), "\n")
Mg_G2: Mean = 18.426 | SD = 1.656 | Median = 18.437 
cat("Razlika: Mean =", round(mean(df1$Mg_diff, na.rm = TRUE), 3),
    "| SD =", round(sd(df1$Mg_diff, na.rm = TRUE), 3), "\n")
Razlika: Mean = 0.512 | SD = 1.698 
# Provjera normalnosti razlike
sw <- shapiro.test(df1$Mg_diff[!is.na(df1$Mg_diff)])
cat("W =", round(sw$statistic, 3), "| p =", round(sw$p.value, 3), "\n")
W = 0.984 | p = 0.159 
# Vizualizacija
df_long <- data.frame(
  vrijednost = c(df1$Mg_G1_num, df1$Mg_G2_num),
  mjerenje = factor(rep(c("Mg_G1", "Mg_G2"), each = nrow(df1)),
                    levels = c("Mg_G1", "Mg_G2"))
)

ggplot(df_long, aes(x = mjerenje, y = vrijednost, fill = mjerenje)) +
  geom_boxplot(alpha = 0.7) +
  geom_jitter(width = 0.1, alpha = 0.3, size = 1.5) +
  scale_fill_manual(values = c("Mg_G1" = "#2E86C1", "Mg_G2" = "#E74C3C")) +
  labs(title = "Magnezij - Godina 1 vs Godina 2",
       subtitle = "Paired t-test",
       x = "Mjerenje", y = "Mg (mg/L)",
       fill = "Mjerenje") +
  theme_minimal(base_size = 12)

# Paired t-test
t.test(df1$Mg_G1_num, df1$Mg_G2_num, paired = TRUE)

    Paired t-test

data:  df1$Mg_G1_num and df1$Mg_G2_num
t = 3.3042, df = 119, p-value = 0.001259
alternative hypothesis: true mean difference is not equal to 0
95 percent confidence interval:
 0.2052250 0.8190132
sample estimates:
mean difference 
      0.5121191 
# Veličina efekta (η²)
t_val <- t.test(df1$Mg_G1_num, df1$Mg_G2_num, paired = TRUE)$statistic
df_val <- t.test(df1$Mg_G1_num, df1$Mg_G2_num, paired = TRUE)$parameter
eta2 <- t_val^2 / (t_val^2 + df_val)
cat("η² =", round(eta2, 3), "\n")
η² = 0.084 
cat("Interpretacija: ")
Interpretacija: 
if (eta2 < 0.01) cat("zanemariv efekt\n")
if (eta2 >= 0.01 & eta2 < 0.06) cat("mali efekt\n")
if (eta2 >= 0.06 & eta2 < 0.14) cat("srednji efekt\n")
srednji efekt
if (eta2 >= 0.14) cat("veliki efekt\n")

Provjera uvjeta:

  • Slučajni uzorak

  • Dovoljno velik uzorak — n = 120 > 30

  • Normalnost razlike — Shapiro-Wilk: W = 0,984; p = 0,159 → razlika je normalno distribuirana 

Deskriptivna statistika:

Mjerenje Mean SD Median
Mg_G1 18,938 mg/L 1,514 19,040
Mg_G2 18,426 mg/L 1,656 18,437
Razlika 0,512 1,698

Rezultati:

Studentov t-test za dva zavisna uzorka s kriterijem statističke značajnosti α=0,05 (5%); ako je p>α, H0 se prihvaća

Mjera Vrijednost
t 3,304
df 119
p 0,001
95% CI razlike 0,205 – 0,819 mg/L

Veličina efekta:

η² = 0,084 → srednji efekt

Zaključak:

Paired t-test pokazao je statistički značajnu razliku između razine magnezija u prvoj (M = 18,938 mg/L; SD = 1,514) i drugoj godini mjerenja (M = 18,426 mg/L; SD = 1,656) (t(119) = 3,304; p = 0,001). Veličina efekta je srednja (η² = 0,084), što znači da vremenska točka mjerenja objašnjava 8,4% varijance razine magnezija. Odbacujemo H₀; postoji statistički značajna razlika u razini magnezija između prve i druge godine mjerenja, ali je mala.


5. Usporedite Wilcoxon testom dva prikladna uzorka (isto kao pod 4). 

Odabrane varijable: Zn_G1 i Zn_G2

Istraživačko pitanje:

Razlikuje li se razina cinka između prve i druge godine mjerenja u ispitivanih bolesnika?

H₀: Ne postoji razlika u razini cinka između G1 i G2

H₁: Postoji razlika u razini cinka između G1 i G2

# Pretvori u numeričke
df1$Zn_G1_num <- suppressWarnings(as.numeric(df1$Zn_G1))
df1$Zn_G2_num <- suppressWarnings(as.numeric(df1$Zn_G2))
df1$Zn_diff <- df1$Zn_G1_num - df1$Zn_G2_num

# Deskriptivna statistika
cat("Zn_G1: Median =", round(median(df1$Zn_G1_num, na.rm = TRUE), 3),
    "| IQR =", round(IQR(df1$Zn_G1_num, na.rm = TRUE), 3), "\n")
Zn_G1: Median = 678.65 | IQR = 128.987 
cat("Zn_G2: Median =", round(median(df1$Zn_G2_num, na.rm = TRUE), 3),
    "| IQR =", round(IQR(df1$Zn_G2_num, na.rm = TRUE), 3), "\n")
Zn_G2: Median = 686.999 | IQR = 122.282 
# Provjera normalnosti razlike
sw <- shapiro.test(df1$Zn_diff[!is.na(df1$Zn_diff)])
cat("W =", round(sw$statistic, 3), "| p =", round(sw$p.value, 4), "\n")
W = 0.971 | p = 0.0111 
cat("→ razlika nije normalno distribuirana → Wilcoxon signed-rank test\n")
→ razlika nije normalno distribuirana → Wilcoxon signed-rank test
# Vizualizacija
df_long <- data.frame(
  vrijednost = c(df1$Zn_G1_num, df1$Zn_G2_num),
  mjerenje = factor(rep(c("Zn_G1", "Zn_G2"), each = nrow(df1)),
                    levels = c("Zn_G1", "Zn_G2"))
)

ggplot(df_long, aes(x = mjerenje, y = vrijednost, fill = mjerenje)) +
  geom_boxplot(alpha = 0.7) +
  geom_jitter(width = 0.1, alpha = 0.3, size = 1.5) +
  scale_fill_manual(values = c("Zn_G1" = "#2E86C1",
                                "Zn_G2" = "#E74C3C")) +
  labs(title = "Cink - Godina 1 vs Godina 2",
       subtitle = "Wilcoxon signed-rank test",
       x = "Mjerenje", y = "Zn (mg/L)",
       fill = "Mjerenje") +
  theme_minimal(base_size = 12)

# Wilcoxon signed-rank test
wilcox.test(df1$Zn_G1_num, df1$Zn_G2_num,
            paired = TRUE, exact = FALSE)

    Wilcoxon signed rank test with continuity correction

data:  df1$Zn_G1_num and df1$Zn_G2_num
V = 3220, p-value = 0.6346
alternative hypothesis: true location shift is not equal to 0
# Veličina efekta (r)
df_long_clean <- df_long[!is.na(df_long$vrijednost), ]
eff <- wilcox_effsize(df_long_clean, vrijednost ~ mjerenje, paired = TRUE)
print(eff)
# A tibble: 1 × 7
  .y.        group1 group2 effsize    n1    n2 magnitude
* <chr>      <chr>  <chr>    <dbl> <int> <int> <ord>    
1 vrijednost Zn_G1  Zn_G2   0.0394   120   120 small    
cat("r =", round(eff$effsize, 3), "\n")
r = 0.039 
cat("Interpretacija: ")
Interpretacija: 
r <- abs(eff$effsize)
if (r < 0.1) cat("zanemariv efekt\n")
zanemariv efekt
if (r >= 0.1 & r < 0.3) cat("mali efekt\n")
if (r >= 0.3 & r < 0.5) cat("srednji efekt\n")
if (r >= 0.5) cat("veliki efekt\n")

Provjera uvjeta:

Shapiro-Wilk test pokazao je da razlika nije normalno distribuirana (W = 0,971; p = 0,011) → primjenjujemo Wilcoxon signed-rank test.

Deskriptivna statistika:

Mjerenje Median IQR
Zn_G1 678,650 mg/L 128,987
Zn_G2 686,999 mg/L 122,282

Rezultati:

Wilcoxon test s kriterijem statističke značajnosti α=0,05 (5%); ako je p>α, H0 se prihvaća

Mjera Vrijednost
V 3220
p 0,635

Veličina efekta:

r = 0,039 → zanemariv efekt

Zaključak:

Wilcoxon signed-rank test nije pokazao statistički značajnu razliku između razine cinka u prvoj (Median = 678,650 mg/L; IQR = 128,987) i drugoj godini mjerenja (Median = 686,999 mg/L; IQR = 122,282) (V = 3220; p = 0,635). Veličina efekta je zanemariva (r = 0,039). Ne odbacujemo H₀; ne postoji statistički značajna razlika u razini cinka između prve i druge godine mjerenja, što upućuje da se razina cinka nije značajno promijenila kroz promatrano razdoblje.


6. Usporedite određeno odgovarajuće obilježje među skupinama parametrijskim ANOVA testom i napravite odgovarajuću post hoc analizu.

Odabrana numerička varijabla: Mg_G2

Odabrana kategorička varijabla: Stupanj

Istraživačko pitanje:

Razlikuje li se razina magnezija (Godina 2) kod ispitanika s različitim stupnjevima bolesti?

H₀: Ne postoji razlika u razini magnezija između stupnjeva bolesti (μ₁ = μ₂ = μ₃ = μ₄)

H₁: Postoji razlika u razini magnezija između barem dva stupnja bolesti

# Pretvori u numeričku
df1$Mg_G2_num <- suppressWarnings(as.numeric(df1$Mg_G2))
df1$Stupanj <- as.factor(df1$Stupanj)

# Deskriptivna statistika po stupnjevima
for (s in levels(df1$Stupanj)) {
  x <- df1$Mg_G2_num[df1$Stupanj == s]
  cat("Stupanj", s, "| n =", sum(!is.na(x)),
      "| Mean =", round(mean(x, na.rm = TRUE), 3),
      "| SD =", round(sd(x, na.rm = TRUE), 3),
      "| Median =", round(median(x, na.rm = TRUE), 3), "\n")
}
Stupanj 1 | n = 28 | Mean = 18.527 | SD = 1.142 | Median = 18.588 
Stupanj 2 | n = 35 | Mean = 18.254 | SD = 1.862 | Median = 17.9 
Stupanj 3 | n = 38 | Mean = 18.428 | SD = 1.894 | Median = 18.27 
Stupanj 4 | n = 19 | Mean = 18.588 | SD = 1.468 | Median = 18.637 
# Provjera normalnosti Mg_G2 - cijeli uzorak
sw_ukupno <- shapiro.test(df1$Mg_G2_num)
cat("W =", round(sw_ukupno$statistic, 3),
    "| p =", round(sw_ukupno$p.value, 3), "\n")
W = 0.99 | p = 0.547 
# Histogram
ggplot(df1, aes(x = Mg_G2_num)) +
  geom_histogram(bins = 20, fill = "#2E86C1",
                 color = "white", alpha = 0.8) +
  labs(title = "Distribucija magnezija (Godina 2)",
       x = "Mg (mg/L)", y = "Frekvencija") +
  theme_minimal(base_size = 12)

# Q-Q plot
ggplot(df1, aes(sample = Mg_G2_num)) +
  stat_qq(color = "#2E86C1") +
  stat_qq_line(color = "#E74C3C") +
  labs(title = "Q-Q plot Mg (Godina 2)",
       x = "Teoretski kvantili",
       y = "Uzorak kvantili") +
  theme_minimal(base_size = 12)

# Provjera normalnosti po grupama
for (s in levels(df1$Stupanj)) {
  x <- df1$Mg_G2_num[df1$Stupanj == s]
  sw <- shapiro.test(x[!is.na(x)])
  cat("Stupanj", s, "| W =", round(sw$statistic, 3),
      "| p =", round(sw$p.value, 3), "\n")
}
Stupanj 1 | W = 0.978 | p = 0.798 
Stupanj 2 | W = 0.98 | p = 0.744 
Stupanj 3 | W = 0.985 | p = 0.889 
Stupanj 4 | W = 0.944 | p = 0.314 
# Leveneov test
leveneTest(Mg_G2_num ~ Stupanj, data = df1)
Levene's Test for Homogeneity of Variance (center = median)
       Df F value  Pr(>F)  
group   3   2.575 0.05729 .
      116                  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Boxplot
ggplot(df1, aes(x = Stupanj, y = Mg_G2_num, fill = Stupanj)) +
  geom_boxplot(alpha = 0.7) +
  geom_jitter(width = 0.1, alpha = 0.3, size = 1.5) +
  scale_fill_manual(values = c("1" = "#2E86C1", "2" = "#E74C3C",
                                "3" = "#2ECC71", "4" = "#F39C12")) +
  labs(title = "Magnezij (Godina 2) prema stupnju bolesti",
       x = "Stupanj bolesti", y = "Mg (mg/L)",
       fill = "Stupanj") +
  theme_minimal(base_size = 12)

# One-way ANOVA
model_anova <- aov(Mg_G2_num ~ Stupanj, data = df1)
summary(model_anova)
             Df Sum Sq Mean Sq F value Pr(>F)
Stupanj       3    1.8  0.6048   0.216  0.885
Residuals   116  324.7  2.7989               
# Veličina efekta (η²)
ss_between <- summary(model_anova)[[1]][1, 2]
ss_total <- sum(summary(model_anova)[[1]][, 2])
eta2 <- ss_between / ss_total
cat("η² =", round(eta2, 3), "\n")
η² = 0.006 
cat("Interpretacija: ")
Interpretacija: 
if (eta2 < 0.01) cat("zanemariv efekt\n")
zanemariv efekt
if (eta2 >= 0.01 & eta2 < 0.06) cat("mali efekt\n")
if (eta2 >= 0.06 & eta2 < 0.14) cat("srednji efekt\n")
if (eta2 >= 0.14) cat("veliki efekt\n")

# Post hoc analiza (Tukey HSD)
TukeyHSD(model_anova)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = Mg_G2_num ~ Stupanj, data = df1)

$Stupanj
           diff        lwr       upr     p adj
2-1 -0.27206906 -1.3777702 0.8336321 0.9183383
3-1 -0.09884882 -1.1849785 0.9872809 0.9952767
4-1  0.06191955 -1.2342853 1.3581244 0.9993062
3-2  0.17322024 -0.8484627 1.1949032 0.9710362
4-2  0.33398861 -0.9087122 1.5766895 0.8966620
4-3  0.16076837 -1.0645512 1.3860879 0.9861717

Provjera uvjeta:

Slučajan uzorak, skupine su nezavisne

Normalnost (Shapiro-Wilk):

  • Cijeli uzorak: W = 0,990; p = 0,547 → normalna distribucija

  • Stupanj 1: W = 0,978; p = 0,798 → normalna distribucija

  • Stupanj 2: W = 0,980; p = 0,744 → normalna distribucija

  • Stupanj 3: W = 0,985; p = 0,889 → normalna distribucija

  • Stupanj 4: W = 0,944; p = 0,314 → normalna distribucija

Normalna distribucija varijable “Mg_G2” (i cijele varijable i po skupinama) dokazana je koristeći Shapiro-Wilk test kojim smo prihvatili nul hipotezu da su podaci noramlno distribuirani.

Homogenost varijanci (Leveneov test):

  • F(3, 116) = 2,575; p = 0,057 → varijance su homogene (p > 0,05, prihvaćamo nul hipotezu da su varijance homogene)

Deskriptivna statistika:

Stupanj n Mean SD Median
1 28 18,527 mg/L 1,142 18,588
2 35 18,254 mg/L 1,862 17,900
3 38 18,428 mg/L 1,894 18,270
4 19 18,588 mg/L 1,468 18,637

Rezultati:

One-way ANOVA test s kriterijem statističke značajnosti α=0,05 (5%)

Mjera Vrijednost
F(3, 116) 0,216
p 0,885

Veličina efekta:

η² = 0,006 → zanemariv efekt

Post hoc analiza (Tukey HSD):

Obično se provodi u slučaju odbacivanja nul-hipoteze (potrebno je provjeriti među kojim skupinama postoje statistički značajna odstupanja)

Usporedba Razlika 95% CI p
2 vs 1 -0,272 -1,378 – 0,834 0,918
3 vs 1 -0,099 -1,185 – 0,987 0,995
4 vs 1 0,062 -1,234 – 1,358 0,999
3 vs 2 0,173 -0,848 – 1,195 0,971
4 vs 2 0,334 -0,909 – 1,577 0,897
4 vs 3 0,161 -1,065 – 1,386 0,986

Zaključak:

One-way ANOVA nije pokazala statistički značajnu razliku u razini magnezija između četiri stupnja bolesti (F(3, 116) = 0,216; p = 0,885). Veličina efekta je zanemariva (η² = 0,006) — stupanj bolesti objašnjava samo 0,6% varijance razine magnezija.

Logično je da onda i post hoc analiza (Tukey HSD) potvrđuje da niti jedan par stupnjeva nije statistički značajno različit (sve p > 0,05). Srednje vrijednosti magnezija su vrlo slične između svih stupnjeva (raspon 18,254 – 18,588 mg/L).

Ne odbacujemo H₀ što znači da ne postoji statistički značajna razlika u razini magnezija između stupnjeva bolesti.


7. Odaberite prikladnu varijablu i napravite analizu neparametrijskom inačicom ANOVA testa (Kruskal-Wallis), uz odgovarajuću post hoc analizu.

Odabrana numerička varijabla: Beta1_G1

Odabrana kategorička varijabla: Skupina

Istraživačko pitanje:

Razlikuje li se razina markera koštane razgradnje (Betacross laps 1) u 1. godini kod ispitanika s različitim stupnjevima bolesti?

H₀: Ne postoji razlika u razini Beta1_G1 između stupnjeva bolesti

H₁: Postoji razlika u razini Beta1_G1 između barem dva stupnja bolesti

# Stupanj kao faktor
df1$Stupanj <- as.factor(df1$Stupanj)

# Pretvori u numeričku
df1$Beta1_G1_num <- suppressWarnings(as.numeric(df1$Beta1_G1))

# Deskriptivna statistika po stupnjevima
for (s in levels(df1$Stupanj)) {
  x <- df1$Beta1_G1_num[df1$Stupanj == s]
  cat("Stupanj", s, "| n =", sum(!is.na(x)),
      "| Median =", round(median(x, na.rm = TRUE), 3),
      "| IQR =", round(IQR(x, na.rm = TRUE), 3), "\n")
}
Stupanj 1 | n = 28 | Median = 0.23 | IQR = 0.152 
Stupanj 2 | n = 35 | Median = 0.35 | IQR = 0.135 
Stupanj 3 | n = 38 | Median = 0.24 | IQR = 0.18 
Stupanj 4 | n = 19 | Median = 0.26 | IQR = 0.275 
# Provjera normalnosti
sw <- shapiro.test(df1$Beta1_G1_num)
cat("W =", round(sw$statistic, 3), "| p =", round(sw$p.value, 4), "\n")
W = 0.874 | p = 0 
cat("→ distribucija nije normalna → Kruskal-Wallis test\n")
→ distribucija nije normalna → Kruskal-Wallis test
# Kruskal-Wallis test
kruskal.test(Beta1_G1_num ~ Stupanj, data = df1)

    Kruskal-Wallis rank sum test

data:  Beta1_G1_num by Stupanj
Kruskal-Wallis chi-squared = 10.118, df = 3, p-value = 0.01759
# Veličina efekta
eff <- kruskal_effsize(df1, Beta1_G1_num ~ Stupanj)
cat("η² =", round(eff$effsize, 3), "\n")
η² = 0.061 
cat("Interpretacija: ")
Interpretacija: 
e <- abs(eff$effsize)
if (e < 0.01) cat("zanemariv efekt\n")
if (e >= 0.01 & e < 0.06) cat("mali efekt\n")
if (e >= 0.06 & e < 0.14) cat("srednji efekt\n")
srednji efekt
if (e >= 0.14) cat("veliki efekt\n")

# Post hoc analiza
dunn_rezultat <- dunn_test(df1, Beta1_G1_num ~ Stupanj,
                            p.adjust.method = "bonferroni")
print(dunn_rezultat[, c("group1", "group2", "statistic", "p", "p.adj")])
# A tibble: 6 × 5
  group1 group2 statistic       p  p.adj
  <chr>  <chr>      <dbl>   <dbl>  <dbl>
1 1      2          3.01  0.00263 0.0158
2 1      3          0.877 0.380   1     
3 1      4          1.39  0.165   0.988 
4 2      3         -2.32  0.0202  0.121 
5 2      4         -1.23  0.220   1     
6 3      4          0.692 0.489   1     
# Boxplot s označenim značajnim razlikama
stat_test <- dunn_rezultat %>%
  filter(p.adj < 0.05) %>%
  mutate(y.position = max(df1$Beta1_G1_num, na.rm = TRUE) * 1.05)

ggplot(df1, aes(x = Stupanj, y = Beta1_G1_num, fill = Stupanj)) +
  geom_boxplot(alpha = 0.7) +
  geom_jitter(width = 0.1, alpha = 0.3, size = 1.5) +
  stat_pvalue_manual(stat_test, 
                     label = "p.adj.signif",
                     tip.length = 0.01,
                     step.increase = 0.08) +
  scale_fill_manual(values = c("1" = "#2E86C1", "2" = "#E74C3C",
                                "3" = "#2ECC71", "4" = "#F39C12")) +
  labs(title = "Beta1 (Godina 1) prema stupnju bolesti",
       subtitle = "* p.adj < 0.05 (Dunn test, Bonferroni korekcija)",
       x = "Stupanj bolesti", y = "Beta1_G1",
       fill = "Stupanj") +
  theme_minimal(base_size = 12)

Iako nije potrebna za neparametrijski test:

Provjera uvjeta:

Shapiro-Wilk test pokazao je da Beta1_G1 nije normalno distribuiran (W = 0,874; p < 0,001) → primjenjujemo Kruskal-Wallis test.

Deskriptivna statistika:

Stupanj n Median IQR
1 28 0,230 0,152
2 35 0,350 0,135
3 38 0,240 0,180
4 19 0,260 0,275

Rezultati:

Kruskal-Wallis test s kriterijem statističke značajnosti α=0,05 (5%)

Mjera Vrijednost
χ² 10,118
df 3
p 0,018

Veličina efekta:

η² = 0,061 → srednji efekt

Post hoc analiza (Dunn test s Bonferroni korekcijom):

Usporedba Statistika p p.adj
1 vs 2 3,008 0,003 0,016
1 vs 3 0,877 0,380 1,000
1 vs 4 1,390 0,165 0,988
2 vs 3 -2,323 0,020 0,121
2 vs 4 -1,227 0,220 1,000
3 vs 4 0,692 0,489 1,000

Zaključak:

Kruskal-Wallis test pokazao je statistički značajnu razliku u razini markera koštane razgradnje (Beta1_G1) između četiri stupnja bolesti (χ²(3) = 10,118; p = 0,018). Veličina efekta je srednja (η² = 0,061).

Post hoc analiza (Dunn test s Bonferroni korekcijom) pokazala je da se jedino Stupanj 1 i Stupanj 2 statistički značajno razlikuju (p.adj = 0,016) — Stupanj 2 ima višu razinu markera koštane razgradnje (Median = 0,350) od Stupnja 1 (Median = 0,230) (na grafu označeno zvjezdicom). Ostali parovi nisu statistički značajno različiti.

Odbacujemo H₀ što znači da postoji statistički značajna razlika u razini markera koštane razgradnje između barem dva stupnja bolesti, i to kod Stupnja 1 i Stupnja 2.


8. Usporedite odgovarajuće obilježje na zavisnim uzorcima parametrijskim ANOVA testom (ANOVA za ponavljana mjerenja).

Odabrane varijable: BMD1_G1, BMD1_G2 i BMD1_G3

Istraživačko pitanje:

Razlikuje li se gustoća kostiju (BMD1) između tri godine mjerenja u ispitivanih bolesnika?

H₀: Ne postoji razlika u BMD1 između godina mjerenja (μG1 = μG2 = μG3)

H₁: Postoji razlika u BMD1 između barem dvije godine mjerenja

# Pretvori u numeričke
df1$BMD1_G1_num <- suppressWarnings(as.numeric(df1$BMD1_G1))
df1$BMD1_G2_num <- suppressWarnings(as.numeric(df1$BMD1_G2))
df1$BMD1_G3_num <- suppressWarnings(as.numeric(df1$BMD1_G3))

# Deskriptivna statistika
cat("--- Deskriptivna statistika ---\n")
--- Deskriptivna statistika ---
cat("BMD1_G1: Mean =", round(mean(df1$BMD1_G1_num, na.rm = TRUE), 3),
    "| SD =", round(sd(df1$BMD1_G1_num, na.rm = TRUE), 3), "\n")
BMD1_G1: Mean = 0.663 | SD = 0.116 
cat("BMD1_G2: Mean =", round(mean(df1$BMD1_G2_num, na.rm = TRUE), 3),
    "| SD =", round(sd(df1$BMD1_G2_num, na.rm = TRUE), 3), "\n")
BMD1_G2: Mean = 0.687 | SD = 0.116 
cat("BMD1_G3: Mean =", round(mean(df1$BMD1_G3_num, na.rm = TRUE), 3),
    "| SD =", round(sd(df1$BMD1_G3_num, na.rm = TRUE), 3), "\n")
BMD1_G3: Mean = 0.656 | SD = 0.111 
# Provjera normalnosti
cat("\n--- Shapiro-Wilk test ---\n")

--- Shapiro-Wilk test ---
cat("BMD1_G1: W =", round(shapiro.test(df1$BMD1_G1_num)$statistic, 3),
    "| p =", round(shapiro.test(df1$BMD1_G1_num)$p.value, 3), "\n")
BMD1_G1: W = 0.992 | p = 0.755 
cat("BMD1_G2: W =", round(shapiro.test(df1$BMD1_G2_num)$statistic, 3),
    "| p =", round(shapiro.test(df1$BMD1_G2_num)$p.value, 3), "\n")
BMD1_G2: W = 0.958 | p = 0.001 
cat("BMD1_G3: W =", round(shapiro.test(df1$BMD1_G3_num)$statistic, 3),
    "| p =", round(shapiro.test(df1$BMD1_G3_num)$p.value, 3), "\n")
BMD1_G3: W = 0.984 | p = 0.179 
# Wide format - samo kompletni slučajevi
df_wide <- data.frame(
  id = 1:nrow(df1),
  G1 = df1$BMD1_G1_num,
  G2 = df1$BMD1_G2_num,
  G3 = df1$BMD1_G3_num
)
df_wide <- df_wide[complete.cases(df_wide), ]
cat("\nn kompletnih slučajeva:", nrow(df_wide), "\n")

n kompletnih slučajeva: 120 
# Long format od kompletnih slučajeva
df_long <- tidyr::pivot_longer(df_wide, 
                                cols = c(G1, G2, G3),
                                names_to = "godina",
                                values_to = "BMD1")
df_long$godina <- factor(df_long$godina, levels = c("G1", "G2", "G3"))

# Vizualizacija
stat_test <- data.frame(
  group1 = "G2",
  group2 = "G3",
  p.adj = 0.000411,
  p.adj.signif = "***",
  y.position = max(df_long$BMD1, na.rm = TRUE) * 1.05
)

ggplot(df_long, aes(x = godina, y = BMD1, fill = godina)) +
  geom_boxplot(alpha = 0.7) +
  geom_jitter(width = 0.1, alpha = 0.3, size = 1.5) +
  stat_pvalue_manual(stat_test,
                     label = "p.adj.signif",
                     tip.length = 0.01) +
  scale_fill_manual(values = c("G1" = "#2E86C1",
                                "G2" = "#E74C3C",
                                "G3" = "#2ECC71")) +
  labs(title = "BMD1 kroz tri godine mjerenja",
       subtitle = "*** p.adj < 0.001 (paired t-test, Bonferroni korekcija)",
       x = "Godina mjerenja", y = "BMD1 (g/cm²)",
       fill = "Godina") +
  theme_minimal(base_size = 12)

# ANOVA za ponavljana mjerenja
cat("\n--- ANOVA za ponavljana mjerenja ---\n")

--- ANOVA za ponavljana mjerenja ---
eff <- anova_test(data = df_long, dv = BMD1, wid = id, within = godina)
print(eff)
ANOVA Table (type III tests)

$ANOVA
  Effect DFn DFd     F     p p<.05   ges
1 godina   2 238 4.977 0.008     * 0.013

$`Mauchly's Test for Sphericity`
  Effect    W        p p<.05
1 godina 0.75 4.22e-08     *

$`Sphericity Corrections`
  Effect GGe      DF[GG] p[GG] p[GG]<.05   HFe       DF[HF] p[HF] p[HF]<.05
1 godina 0.8 1.6, 190.38 0.013         * 0.809 1.62, 192.57 0.012         *
# Post hoc analiza
cat("\n--- Post hoc analiza (paired t-test s Bonferroni korekcijom) ---\n")

--- Post hoc analiza (paired t-test s Bonferroni korekcijom) ---
pwc <- pairwise_t_test(df_long, BMD1 ~ godina,
                        paired = TRUE,
                        p.adjust.method = "bonferroni")
print(pwc)
# A tibble: 3 × 10
  .y.   group1 group2    n1    n2 statistic    df        p    p.adj p.adj.signif
* <chr> <chr>  <chr>  <int> <int>     <dbl> <dbl>    <dbl>    <dbl> <chr>       
1 BMD1  G1     G2       120   120    -1.95    119 0.053    0.159    ns          
2 BMD1  G1     G3       120   120     0.659   119 0.511    1        ns          
3 BMD1  G2     G3       120   120     3.94    119 0.000137 0.000411 ***         

Provjera uvjeta:

Normalnost (Shapiro-Wilk):

  • BMD1_G1: W = 0,992; p = 0,755 → normalna distribucija

  • BMD1_G2: W = 0,958; p = 0,001 → nenormalna distribucija

  • BMD1_G3: W = 0,984; p = 0,179 → normalna distribucija

BMD1_G2 nije normalno distribuiran — međutim ANOVA je robusna za n = 120

Deskriptivna statistika:

Mjerenje Mean SD
BMD1_G1 0,663 g/cm² 0,116
BMD1_G2 0,687 g/cm² 0,116
BMD1_G3 0,656 g/cm² 0,111

Rezultati:

ANOVA test za ponovljena mjerenja s kriterijem statističke značajnosti α=0,05 (5%)

Mjera Vrijednost
F(2, 238) 4,977
p (bez korekcije) 0,008
p (GG korekcija) 0,013
ges 0,013

Veličina efekta:

ges (generalized eta squared)* = 0,013 → mali efekt

*output funkcije anova_test() za ponavljana mjerenja; ges je konzervativniji od parcijalnog η² jer u nazivnik dodaje i varijabilnost između ispitanika

Post hoc analiza (paired t-test s Bonferroni korekcijom):

Usporedba t df p p.adj
G1 vs G2 -1,954 119 0,053 0,159
G1 vs G3 0,659 119 0,511 1,000
G2 vs G3 3,941 119 < 0,001 < 0,001

Zaključak:

ANOVA za ponavljana mjerenja pokazala je statistički značajnu razliku u gustoći kostiju (BMD1) između godina mjerenja (F(2, 238) = 4,977; p = 0,013). Veličina efekta je mala (ges = 0,013).

Post hoc analiza pokazala je da se jedino G2 i G3 statistički značajno razlikuju (t(119) = 3,941; p.adj < 0,001) — BMD1 pada između druge i treće godine mjerenja. Razlike između G1 i G2 (p.adj = 0,159) te G1 i G3 (p.adj = 1,000) nisu statistički značajne.

Odbacujemo H₀ — postoji statistički značajna razlika u BMD1 između godina mjerenja, pad gustoće kostiju između druge i treće godine statistički značajan.