Anova dla prób zależnych

Wprowadzenie

ANOVA z powtarzanymi środkami przyjmuje następujące założenia dotyczące danych:

  • Brak znaczących wartości odstających w jakiejkolwiek komórce projektu. Można to sprawdzić wizualizując dane za pomocą metody box plot oraz za pomocą funkcji identify_outliers() [pakiet rstatix].

  • Normalność: zmienna wynikowa (lub zależna) powinna być w przybliżeniu normalnie rozłożona w każdej komórce projektu. Może to być sprawdzone przy użyciu testu normalności Shapiro-Wilka (shapiro_test() [rstatix]) lub przez wizualną inspekcję przy użyciu QQ plot (gggqqplot() [pakiet ggpubr]).

  • Założenie o sferyczności: wariancja różnic między grupami powinna być równa. Można to sprawdzić za pomocą testu sferyczności Mauchly’ego, który jest automatycznie podawany przy użyciu funkcji R anova_test() [pakiet rstatix].

Zauważ, że jeśli powyższe założenia nie są spełnione istnieje nieparametryczna alternatywa (test Friedmana) dla jednokierunkowej ANOVY powtarzanych pomiarów!

Niestety, nie istnieją nieparametryczne alternatywy dla dwukierunkowej i trójkierunkowej ANOVY powtarzanych pomiarów! Tak więc, w sytuacji, gdy założenia nie są spełnione, można rozważyć przeprowadzenie dwukierunkowego/trzykierunkowego testu ANOVA dla danych przekształconych i nieprzekształconych, aby sprawdzić, czy istnieją jakieś znaczące różnice (np. za pomocą logarytmu).

Jeśli oba testy prowadzą do tych samych wniosków, można nie decydować się na przekształcenie zmiennej wynikowej i kontynuować dwu-/trzy-kierunkową ANOVA dla danych oryginalnych.

Możliwe jest również wykonanie odpornego testu ANOVA przy użyciu pakietu WRS2 w R.

RM Anova in R

Kluczowe funkcje:

  • anova_test()[pakiet rstatix], wrapper wokółcar::Anova()` dla ułatwienia obliczeń ANOVA z powtarzanymi miarami. Kluczowe argumenty do wykonania ANOVA z powtarzanymi miarami:

    • data: ramka danych

    • dv: (numeryczna) badana zmienna zależna

    • wid: identyfikator rekordu

    • within: within-subjects czynnik, zmienna grupująca

  • get_anova_table() [rstatix package]. Wyodrębnia tabelę ANOVA z funkcji anova_test(). Zwraca ona tabelę ANOVA, która jest automatycznie skorygowana o ewentualne odchylenia od założenia o sferyczności. Domyślnie automatycznie stosowana jest korekta sferyczności Greenhouse’a-Geissera tylko do czynników wewnątrzprzedmiotowych naruszających założenie sferyczności (tzn. wartość p testu Mauchly’ego jest istotna, p <= 0.05).

Anova 1-czynnikowa dla prób zależnych

W zbiorze “selfesteem” zawarto wyniki samooceny 10 osób w trzech punktach czasowych podczas stosowania określonej diety w celu określenia, czy ich samoocena uległa poprawie.

data("selfesteem", package = "datarium")
head(selfesteem, 3)
## # A tibble: 3 x 4
##      id    t1    t2    t3
##   <int> <dbl> <dbl> <dbl>
## 1     1  4.01  5.18  7.11
## 2     2  2.56  6.91  6.31
## 3     3  3.24  4.44  9.78

Jednoczynnikowa ANOVA może być użyta do określenia, czy średnie wyniki samooceny różnią się znacząco pomiędzy trzema punktami czasowymi. Przekształćmy więc tę ramkę danych na długi format:

selfesteem <- selfesteem %>%
  gather(key = "time", value = "score", t1, t2, t3) %>%
  convert_as_factor(id, time)
head(selfesteem, 3)
## # A tibble: 3 x 3
##   id    time  score
##   <fct> <fct> <dbl>
## 1 1     t1     4.01
## 2 2     t1     2.56
## 3 3     t1     3.24

Założenia

Sprawdzamy czy wystepuje normalność.

selfesteem %>%
  group_by(time) %>%
  shapiro_test(score)
## # A tibble: 3 x 4
##   time  variable statistic     p
##   <fct> <chr>        <dbl> <dbl>
## 1 t1    score        0.967 0.859
## 2 t2    score        0.876 0.117
## 3 t3    score        0.923 0.380

Próby wkazują normalność.( 1 = normalność doskonała)

Anova

Przeprowadzamy badnie testem Anova dla 1-czynnikowej próby zależnej.

wyniki <- anova_test(data=selfesteem,
                     dv=score,within=time,wid=id)
get_anova_table(wyniki)
## ANOVA Table (type III tests)
## 
##   Effect DFn DFd      F        p p<.05   ges
## 1   time   2  18 55.469 2.01e-08     * 0.829

Testy post-hoc

model <- aov(score~time,data=selfesteem)
post_hoc<-TukeyHSD(model,"time",ordered=TRUE)  
print(post_hoc)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
##     factor levels have been ordered
## 
## Fit: aov(formula = score ~ time, data = selfesteem)
## 
## $time
##          diff       lwr      upr     p adj
## t2-t1 1.79382 0.8114139 2.776226 0.0003104
## t3-t1 4.49622 3.5138136 5.478626 0.0000000
## t3-t2 2.70240 1.7199935 3.684806 0.0000007

Wariancja

selfesteem %>%
  levene_test(score~time)
## # A tibble: 1 x 4
##     df1   df2 statistic      p
##   <int> <int>     <dbl>  <dbl>
## 1     2    27      2.71 0.0845

Wnioski i podsumowanie

ggbetweenstats(
  data=selfesteem,
  x=time, 
  y=score,  
  type="p",  
  conf.level= 0.95,  
  var.equal=FALSE, # 
  pairwise.display = "significant",  
  bf.message = FALSE )  

Czynnik istotnie wpływa na samoocenę. :)