ANOVA w R: Test jednokierunkowy i dwukierunkowy z przykładami
⚡ Inteligentne podsumowanie
Analiza wariancji (ANOVA) w R porównuje średnie z trzech lub więcej grup, dzieląc całkowitą zmienność na składowe międzygrupowe i wewnątrzgrupowe. W tym przewodniku przeprowadzane są testy jednokierunkowe i dwukierunkowe na zbiorze danych dotyczących trucizn, sprawdzane są założenia i izolowane są różne pary za pomocą testu Tukeya HSD.

Co to jest ANOVA?
Analiza wariancji (ANOVA) to technika statystyczna służąca do porównywania średnich dwóch lub więcej grup. Test działa poprzez podzielenie całkowitej zmienności pomiaru na część wyjaśnioną przynależnością do grupy oraz część pozostałą jako szum losowy. ANOVA w R informuje zatem, czy przynajmniej jedna średnia grupy różni się od pozostałych, a nie która. Jest to bezpośrednie rozszerzenie test t do sytuacji, w których zmienna czynnikowa ma więcej niż dwa poziomy.
Przed uruchomieniem testu warto dowiedzieć się, który członek rodziny ANOVA pasuje do Twojego projektu.
Rodzaje testów ANOVA w R
„ANOVA” to rodzina testów, a nie pojedyncza procedura. Wybór odpowiedniego członka zależy od liczby czynników i sposobu zebrania danych.
| Testowanie | Kiedy go używać | Wywołanie R |
|---|---|---|
| ANOVA w jedną stronę | Jeden czynnik z trzema lub więcej poziomami | aov(y ~ x, dane = df) |
| Dwukierunkowa ANOVA | Dwa niezależne czynniki | aov(y ~ x1 + x2, dane = df) |
| Dwukierunkowy z interakcją | Wpływ jednego czynnika zależy od drugiego | aov(y ~ x1 * x2, dane = df) |
| Powtarzane pomiary ANOVA | Te same osoby mierzone więcej niż jeden raz | aov(y ~ x + Błąd(temat/x)) |
| ANKOVA | Należy kontrolować ciągłą zmienną współzmienną | aov(y ~ x + kowariancja, dane = df) |
| MANOWA | Dwie lub więcej zmiennych odpowiedzi jednocześnie | manova(cbind(y1, y2) ~ x) |
Ten samouczek obejmuje pierwsze trzy. Pozostałe warianty korzystają z tego samego interfejsu aov(), więc po odczytaniu jednej tabeli wyjściowej możesz odczytać je wszystkie.
ANOVA a test t w R: kluczowe różnice
Oba testy porównują średnie, warto więc precyzyjnie określić, gdzie jeden test zastępuje drugi.
| kryteria | Test T | ANOVA |
|---|---|---|
| Liczba grup | Dokładnie dwa | Dwa lub więcej |
| Statystyka testowa | t | F, równe t do kwadratu, gdy są dwie grupy |
| Wynik | Nazywa kierunek różnicy | Raportuje tylko, że istnieje różnica |
| Potrzebne dalsze działania | żaden | Test post hoc, taki jak Tukey HSD |
| Funkcja R | t.test() | aov() |
W przypadku trzech grup istnieje pokusa przeprowadzenia trzech oddzielnych testów t. Należy się jej oprzeć. Każdy test ma swój własny 5-procentowy współczynnik błędu, więc trzy porównania zwiększają prawdopodobieństwo fałszywie dodatniego wyniku do około 14 procent. Analiza wariancji (ANOVA) odpowiada na to samo pytanie za pomocą jednego testu, a analiza Tukey HSD analizuje następnie szczegóły par, utrzymując współczynnik błędu pod kontrolą. W przypadku dwóch grup, patrz samouczek testu t.
ANOVA w jedną stronę
Istnieje wiele sytuacji, w których trzeba porównać średnią między wieloma grupami. Na przykład dział marketingu chce wiedzieć, czy trzy zespoły mają takie same wyniki sprzedaży.
- Zespół: współczynnik 3 poziomów: A, B i C
- Sprzedaż: Miara wydajności
Test ANOVA pozwala stwierdzić, czy wyniki wszystkich trzech grup są podobne.
Aby wyjaśnić, czy dane pochodzą z tej samej populacji, możesz wykonać a jednokierunkowa analiza wariancji (dalej jednokierunkowa ANOVA). Jak każdy inny test statystyczny, dostarcza on dowodów na to, czy hipotezę H0 można odrzucić. Należy pamiętać, że nieodrzucenie hipotezy H0 nie jest równoznaczne z jej prawdziwością.
Hipoteza w teście ANOVA jednokierunkowej
- H0: Średnie pomiędzy grupami są identyczne
- H1: Przynajmniej średnia w jednej grupie jest inna
Innymi słowy, nieodrzucenie hipotezy H0 oznacza, że nie ma wystarczających dowodów, aby wyciągnąć wniosek, że średnia jakiejkolwiek grupy różni się od średniej pozostałych.
Ten test jest podobny do testu t, ale w przypadku więcej niż dwóch grup prawidłowym wyborem jest analiza wariancji (ANOVA). Przy dokładnie dwóch grupach oba testy są równoważne, a statystyka F równa się kwadratowi statystyki t.
Założenia
Jednokierunkowa analiza wariancji (ANOVA) opiera się na trzech warunkach: obserwacje są losowo dobierane i niezależne od siebie, reszty w każdej grupie mają rozkład w przybliżeniu normalny, a wariancja jest taka sama w każdej grupie (jednorodność wariancji). Poniższa sekcja dotycząca sprawdzania założeń pokazuje, jak przetestować każde z nich w R.
Zinterpretuj test ANOVA
Statystyka F służy do sprawdzania, czy dane pochodzą z znacząco różnych populacji, tj. z różnych średnich próbek.
Aby obliczyć statystykę F, należy podzielić zmienność międzygrupowa ponad zmienność wewnątrzgrupowa.
międzygrupowe Zmienność odzwierciedla, jak bardzo średnia każdej grupy różni się od średniej ogólnej. Porównaj dwa poniższe wykresy, aby zrozumieć tę ideę.
Lewy wykres pokazuje bardzo małe różnice między trzema grupami, więc wszystkie średnie trzech grup są zbliżone ogólny oznaczać.
Prawy wykres przedstawia trzy rozkłady oddalone od siebie o wiele kilometrów i niepokrywające się, więc różnica między średnią ogólną a średnią każdej grupy jest duża.
wewnątrzgrupowy Zmienność mierzy, jak bardzo poszczególne obserwacje odbiegają od średniej własnej grupy. Niektóre punkty znajdują się daleko od średniej swojej grupy, a zmienność wewnątrzgrupowa odzwierciedla dokładnie ten rozrzut, czyli błąd próby.
Aby wizualnie zrozumieć koncepcję zmienności wewnątrzgrupowej, spójrz na poniższy wykres.
Lewa część przedstawia rozkład trzech różnych grup. Zwiększyłeś rozrzut każdej próby i widać wyraźnie, że wariancja indywidualna jest duża. Statystyka F spada, więc nie odrzuciłbyś hipotezy zerowej.
Prawa część pokazuje próbki o tych samych średnich, ale znacznie mniejszym rozrzucie. To podnosi statystykę F i wskazuje na hipotezę alternatywną.
Obie miary można wykorzystać do skonstruowania statystyki F. Zrozumienie statystyki F jest bardzo intuicyjne. Jeśli licznik rośnie, oznacza to, że zmienność międzygrupowa jest duża i jest prawdopodobne, że grupy w próbie pochodzą z zupełnie różnych rozkładów.
Innymi słowy, niski wskaźnik F wskazuje na niewielką lub żadną znaczącą różnicę pomiędzy średnimi grupowymi.
Przykład jednokierunkowego testu ANOVA
Użyjesz zestawu danych poison, aby zaimplementować jednokierunkowy test ANOVA. Zestaw danych zawiera 48 wierszy i 3 zmienne:
- Czas: Czas przeżycia zwierzęcia
- trucizna: Rodzaj użytej trucizny: poziom współczynnika: 1,2 i 3
- leczyć: Rodzaj zastosowanego leczenia: poziom czynnika: 1,2 i 3
Zanim zaczniesz obliczać test ANOVA, musisz przygotować dane w następujący sposób:
- Krok 1: Zaimportuj dane
- Krok 2: Usuń niepotrzebną zmienną
- Krok 3: Konwertuj zmienną truciznę na uporządkowany poziom
library(dplyr) PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/poisons.csv" df <- read.csv(PATH) %>% select(-X) %>% mutate(poison = factor(poison, ordered = TRUE)) glimpse(df)
Wyjście:
## Observations: 48 ## Variables: 3 ## $ time <dbl> 0.31, 0.45, 0.46, 0.43, 0.36, 0.29, 0.40, 0.23, 0.22, 0... ## $ poison <ord> 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 1, 1, 1, 1, 2, 2, 2... ## $ treat <fctr> A, A, A, A, A, A, A, A, A, A, A, A, B, B, B, B, B, B, ...
Naszym celem jest sprawdzenie następującego założenia:
- H0: Nie ma różnicy w średnim czasie przeżycia pomiędzy grupami
- H1: Średni czas przeżycia jest różny dla co najmniej jednej grupy.
Innymi słowy, chcesz wiedzieć, czy istnieje statystyczna różnica między średnim czasem przeżycia w zależności od rodzaju trucizny podanej śwince morskiej.
Będziesz postępować w następujący sposób:
- Krok 1: Sprawdź format zmiennej trucizna
- Krok 2: Wydrukuj statystykę podsumowującą: liczbę, średnią i odchylenie standardowe
- Krok 3: Narysuj wykres pudełkowy
- Krok 4: Oblicz jednokierunkowy test ANOVA
- Krok 5: Przeprowadź porównanie parami z Tukey HSD
Krok 1) Sprawdź poziomy trucizny za pomocą poniższego kodu. Powinieneś zobaczyć trzy wartości znakowe, ponieważ czasownik „mutujący” przekształcił kolumnę w uporządkowany czynnik.
levels(df$poison)
Wyjście:
## [1] "1" "2" "3"
Krok 2) Obliczasz średnią i odchylenie standardowe.
df %>% group_by(poison) %>% summarise( count_poison = n(), mean_time = mean(time, na.rm = TRUE), sd_time = sd(time, na.rm = TRUE) )
Wyjście:
## # A tibble: 3 x 4 ## poison count_poison mean_time sd_time ## <ord> <int> <dbl> <dbl> ## 1 1 16 0.617500 0.20942779 ## 2 2 16 0.544375 0.28936641 ## 3 3 16 0.276250 0.06227627
Krok 3) W kroku trzecim możesz graficznie sprawdzić, czy istnieje różnica między rozkładami. Zwróć uwagę, że uwzględniłeś drgającą kropkę.
ggplot(df, aes(x = poison, y = time, fill = poison)) + geom_boxplot() + geom_jitter(shape = 15, color = "steelblue", position = position_jitter(0.21)) + theme_classic()
Wyjście:
Krok 4) Możesz uruchomić jednokierunkowy test ANOVA za pomocą polecenia aov. Podstawowa składnia testu ANOVA jest następująca:
aov(formula, data)
Arguments:
- formula: The equation you want to estimate
- data: The dataset used
Składnia formuły jest następująca:
y ~ X1+ X2+...+Xn # X1 + X2 +... refers to the independent variables y ~ . # use all the remaining variables as independent variables
Teraz możesz odpowiedzieć na pytanie: czy istnieje jakaś różnica w czasie przeżycia świnek morskich w zależności od rodzaju podanej trucizny?
Zapisz model w obiekcie i przekaż go do summary(), aby uzyskać czytelny wydruk wyników.
anova_one_way <- aov(time~poison, data = df) summary(anova_one_way)
Code Wyjaśnienie
- aov(czas ~ trucizna, dane = df): Uruchom test ANOVA przy użyciu następującego wzoru
- summary(anova_one_way): Wydrukuj podsumowanie testu
Wyjście:
## Df Sum Sq Mean Sq F value Pr(>F) ## poison 2 1.033 0.5165 11.79 7.66e-05 *** ## Residuals 45 1.972 0.0438 ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Wartość p wynosi 7.66e-05, znacznie poniżej zwykłego progu 0.05, a trzy gwiazdki oznaczają najsilniejszy kod istotności. Można odrzucić H0 i stwierdzić, że co najmniej jedna grupa trucizn ma inny średni czas przeżycia.
Jak sprawdzić założenia ANOVA w R
Wartość p w analizie ANOVA jest wiarygodna tylko wtedy, gdy spełnione są trzy wymienione wcześniej warunki. Każdy z nich ma bezpośrednie sprawdzenie w R i wszystkie są uruchamiane na dopasowanym obiekcie modelu.
1. Niezależność obserwacji. Jest to cecha projektu badawczego, a nie danych, więc żaden test jej nie uratuje. Każdą świnkę morską należy zmierzyć raz i losowo przypisać do grupy. Jeśli ten sam osobnik pojawia się w kilku wierszach, potrzebny jest model z powtarzanymi pomiarami.
2. Normalność reszt. Analiza ANOVA zakłada, że reszty, a nie surowe dane, mają w przybliżeniu normalny przebieg. Sprawdź wykres QQ i potwierdź go testem Shapiro-Wilka:
par(mfrow = c(2, 2)) plot(anova_one_way) # four diagnostic plots shapiro.test(residuals(anova_one_way))
Punkty leżące na przekątnej wykresu normalnego QQ wskazują na reszty normalne. Wartość p Shapiro-Wilka powyżej 0.05 oznacza, że nie można odrzucić normalności.
3. Jednorodność wariancji. Każda grupa powinna wykazywać podobny rozkład. Wykres reszt względem dopasowania powinien przypominać płaski pas, a nie lejek. Potwierdź to testem Levene'a, który jest bardziej odporny na rozkład nienormalny niż test Bartletta:
library(car)
leveneTest(time ~ poison, data = df)
bartlett.test(time ~ poison, data = df)
Wartość p powyżej 0.05 potwierdza równe wariancje.
Co zrobić, gdy założenie okaże się nieprawdziwe. Jeśli wariancje są nierówne, uruchom oneway.test(time ~ poison, data = df, var.equal = FALSE), stosując poprawkę Welcha. Jeśli reszty wyraźnie odbiegają od rozkładu normalnego, a próba jest mała, przejdź do testu rang Kruskala-Wallisa: kruskal.test(time ~ poison, data = df). Przy dużych, zrównoważonych próbach, analiza wariancji (ANOVA) jest dość odporna na umiarkowane odchylenia od rozkładu normalnego, więc wynik Shapiro-Wilka na granicy rozkładu rzadko jest krytyczny.
Porównanie parami
Istotny test F mówi, że średnie grupowe nie są równe, ale nie wskazuje, która para się różni. Test Tukeya Honest Significant Difference odpowiada na to pytanie, porównując każdą parę, jednocześnie kontrolując wskaźnik FWR.
TukeyHSD(anova_one_way)
Wyjście:
Odczytaj wynik, jeden wiersz na parę. diff kolumna zawiera różnicę między średnimi dwóch grup, lwr oraz wznieść się ograniczył 95-procentowy przedział ufności dla tej różnicy i p przym. to wartość p skorygowana o wielokrotne porównania. Para różni się istotnie, gdy jej przedział nie zawiera zera, co odpowiada wartości p adj poniżej 0.05. W tym zbiorze danych porównania z udziałem trucizny 3 są istotne, co odpowiada wykresowi pudełkowemu: grupa 3 ma wyraźnie niższy średni czas przeżycia niż grupy 1 i 2, podczas gdy grupy 1 i 2 są statystycznie nieodróżnialne od siebie.
Dwukierunkowa ANOVA
Dwukierunkowa analiza wariancji (ANOVA) dodaje drugi czynnik do wzoru. Działa dokładnie tak samo jak test jednokierunkowy, tylko wzór ulega zmianie:
y ~ x1 + x2
Tutaj y jest ilościową zmienną odpowiedzi, natomiast x1 i x2 są czynnikami kategorialnymi.
Hipoteza w dwukierunkowym teście ANOVA
- H0: Średnie grupowe są równe dla obu zmiennych czynnikowych
- H1: Średnia co najmniej jednej grupy różni się w przypadku co najmniej jednego z dwóch czynników
Dodajesz zmienną „treat” do modelu. Ta zmienna rejestruje sposób leczenia podany śwince morskiej. Poniższy wzór addytywny sprawdza, czy każdy czynnik wpływa na czas przeżycia samodzielnie, po uwzględnieniu pozostałych.
Dostosuj kod, dodając „treat” obok pierwszej zmiennej niezależnej.
anova_two_way <- aov(time~poison + treat, data = df) summary(anova_two_way)
Wyjście:
## Df Sum Sq Mean Sq F value Pr(>F) ## poison 2 1.0330 0.5165 20.64 5.7e-07 *** ## treat 3 0.9212 0.3071 12.27 6.7e-06 *** ## Residuals 42 1.0509 0.0250 ## ---
Obie wartości p (5.7e-07 dla trucizny i 6.7e-06 dla leku) są znacznie poniżej 0.05, więc odrzucasz H0 dla obu czynników i wyciągasz wniosek, że zmiana trucizny lub leku wpływa na czas przeżycia.
Dodawanie terminu interakcji
Powyższy model addytywny zakłada, że efekt trucizny jest taki sam niezależnie od sposobu leczenia. Aby przetestować to założenie, zastąp znak plus gwiazdką, która pasuje zarówno do efektów głównych, jak i ich interakcji:
anova_interaction <- aov(time~poison * treat, data = df) summary(anova_interaction)
Jeśli przedział trucizna–leczenie nie jest znaczący, lepszym wyborem będzie model addytywny, ponieważ wymaga mniejszej liczby stopni swobody.
ANOVA w R: Szybki przewodnik po testach
Poniższa tabela zawiera listę wszystkich użytych testów, wywołanie R, które go uruchamia, oraz hipotezę, którą ocenia:
| Testowanie | Code | Hipoteza | Wartość P |
|---|---|---|---|
| Jednokierunkowa analiza wariancji |
aov(y ~ X, data = df)
|
H1: Średnia jest różna dla co najmniej jednej grupy | 0.05 |
| Parami |
TukeyHSD(ANOVA summary) |
0.05 | |
| Dwukierunkowa analiza wariancji |
aov(y ~ X1 + X2, data = df)
|
H1: Przynajmniej jedna średnia grupy różni się w przypadku każdego z czynników | 0.05 |




