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 danychdv: (numeryczna) badana zmienna zależnawid: identyfikator rekorduwithin: within-subjects czynnik, zmienna grupująca
get_anova_table()[rstatix package]. Wyodrębnia tabelę ANOVA z funkcjianova_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ę. :)