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.

  • 📐 Statystyka podstawowa: Współczynnik F dzieli zmienność między grupami przez zmienność wewnątrz grup, więc większe wartości przemawiają przeciwko równym średnim.
  • 🧪 Składnia jednokierunkowa: aov(time~poison, data = df) po którym następuje summary() zwraca stopnie swobody, wartość F i wartość p.
  • Weryfikacja założeń: Przetestuj niezależność, normalność reszt za pomocą shapiro.test() i równą wariancję za pomocą leveneTest() przed zaufaniem wartości p.
  • 🔎 Analiza post hoc: TukeyHSD() porównuje każdą parę grup, utrzymując współczynnik błędu rodzinnego na ustalonym poziomie.
  • 🧮 Rozszerzenie dwukierunkowe: aov(time~poison + treat, data = df) dodaje drugi czynnik, a poison:treat dodaje termin interakcji.
  • 📊 Wyniki czytania: Wartość p poniżej 0.05 odrzuca hipotezę zerową o równych średnich, ale nigdy nie pozwala określić, która grupa różni się.

ANOVA w R Jednokierunkowa Dwukierunkowa

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.

Zinterpretuj test ANOVA

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ą.

Zinterpretuj test ANOVA

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:

Przykład testu ANOVA jednokierunkowego

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:

Porównanie parami

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

FAQ

Wartość F to stosunek wariancji międzygrupowej do wariancji wewnątrzgrupowej. Wartości bliskie 1 sugerują, że średnie grupowe są podobne. Duże wartości wskazują, że grupy pochodzą z populacji o różnych średnich.

Użyj oneway.test() z var.equal = FALSE, gdy wariancje są nierówne, oraz kruskal.test(), gdy reszty wyraźnie odbiegają od rozkładu normalnego. Przekształcenie skośnej odpowiedzi za pomocą log() często przywraca zarówno rozkład normalny, jak i równą wariancję.

Każdy test t niesie ze sobą 5-procentowe ryzyko fałszywie dodatnich wyników. Trzy testy parami podnoszą wskaźnik FWR do około 14%. Analiza wariancji (ANOVA) utrzymuje pojedynczy test na poziomie 5%, a analiza Tukey HSD koryguje porównania parami.

ANOVA to standardowy filtr selekcji cech: klasyfikuje predyktory kategoryczne na podstawie tego, jak silnie różnicują one cel numeryczny. Zespoły zajmujące się sztuczną inteligencją używają go również do porównywania wariantów modelu w różnych fazach walidacji krzyżowej.

Tak. Asystenci AI potrafią objaśniać stopnie swobody, tłumaczyć wartości p na język potoczny i sygnalizować naruszenia założeń na wykresach diagnostycznych. Zawsze potwierdzaj odczyt z własnymi wynikami testów leveneTest() i shapiro.test().

Podsumuj ten post następująco: