ANOVA в R: Еднофакторен и двуфакторен тест с примери
⚡ Умно обобщение
ANOVA в R сравнява средните стойности на три или повече групи, като разделя общата вариация на междугрупови и вътрешногрупови компоненти. Това ръководство изпълнява еднофакторни и двуфакторни тестове върху набора от данни за отрови, проверява допусканията и изолира различните двойки с Tukey HSD.

Какво е ANOVA?
Анализ на дисперсията (ANOVA) е статистическа техника, използвана за сравняване на средните стойности на две или повече групи. Тестът работи чрез разделяне на общата вариация в дадено измерване на частта, обяснена с принадлежността към групата, и частта, останала като случаен шум. Следователно ANOVA в R ви казва дали поне една групова средна стойност се различава от останалите, а не коя. Това е пряко продължение на t-тест до ситуации, в които факторната променлива има повече от две нива.
Преди да проведете тест, е полезно да знаете кой член на семейството ANOVA е подходящ за вашия дизайн.
Видове ANOVA тестове в R
„ANOVA“ е семейство от тестове, а не единична процедура. Изборът на правилния член зависи от това колко фактори имате и как са събрани данните.
| тест | Кога да го използвате | R повикване |
|---|---|---|
| Еднопосочна ANOVA | Един фактор с три или повече нива | aov(y ~ x, данни = df) |
| Двупосочна ANOVA | Два независими фактора | aov(y ~ x1 + x2, данни = df) |
| Двупосочно с взаимодействие | Ефектът на единия фактор зависи от другия | aov(y ~ x1 * x2, данни = df) |
| ANOVA с повторни измервания | Същите субекти са измервани повече от веднъж | aov(y ~ x + Грешка(субект/x)) |
| АНКОВА | Трябва да се контролира непрекъсната ковариация за | aov(y ~ x + ковариация, данни = df) |
| МАНОВА | Две или повече променливи на отговор едновременно | манова(cbind(y1, y2) ~ x) |
Този урок обхваща първите три. Останалите варианти използват един и същ интерфейс aov(), така че след като можете да прочетете една изходна таблица, можете да ги прочетете всички.
ANOVA срещу T-тест в R: Ключови разлики
И двата теста сравняват средни стойности, така че е добре да се прецизно определи къде единият замества другия.
| Критерии | T-тест | ANOVA |
|---|---|---|
| Брой групи | Точно две | Два или повече |
| Статистика на изпитването | t | F, равно на t на квадрат, когато има две групи |
| Резултат | Назовава посоката на разликата | Само съобщава, че съществува разлика |
| Необходими са последващи действия | None | Post hoc тест, като например Tukey HSD |
| R функция | t.test() | aov() |
Изкушението с три групи е да се проведат три отделни t-теста. Устоявайте му. Всеки тест носи свой собствен процент на грешки от 5%, така че три сравнения увеличават вероятността за фалшиво положителен резултат до приблизително 14%. ANOVA отговаря на същия въпрос с един тест, а Tukey HSD след това обработва детайлите по двойки, като контролира процента на грешки. За случая с две групи вижте урок за t-тест.
Еднопосочна ANOVA
Има много ситуации, в които трябва да сравните средната стойност между множество групи. Например маркетинговият отдел иска да знае дали три екипа имат еднакви продажби.
- Екип: 3 фактора на ниво: A, B и C
- Продажба: мярка за ефективност
Тестът ANOVA може да разбере дали трите групи имат сходни резултати.
За да изясните дали данните идват от една и съща популация, можете да извършите a еднопосочен дисперсионен анализ (еднофакторен ANOVA по-нататък). Както всеки друг статистически тест, той дава доказателства за това дали хипотезата H0 може да бъде отхвърлена. Обърнете внимание, че неотхвърлянето на H0 не е същото като доказването на нейната истинност.
Хипотеза в еднопосочен ANOVA тест
- H0: Средните стойности между групите са идентични
- H1: Поне средната стойност на една група е различна
С други думи, ако не се отхвърли H0, това означава, че няма достатъчно доказателства, за да се заключи, че някоя групова средна стойност се различава от останалите.
Този тест е подобен на t-теста, но ANOVA е правилният избор, когато има повече от две групи. При точно две групи двата теста са еквивалентни и F-статистиката е равна на квадрата на t-статистиката.
Предположения
Еднофакторният ANOVA се основава на три условия: наблюденията са произволно избрани и независими едно от друго, остатъците във всяка група са приблизително нормално разпределени и дисперсията е еднаква във всяка група (хомогенност на дисперсията). Разделът за проверка на предположенията по-долу показва как да се тества всяко едно от тях в R.
Интерпретирайте ANOVA тест
F-статистиката се използва за тестване дали данните са от значително различни популации, т.е. различни средни стойности на извадката.
За да изчислите F-статистиката, трябва да разделите междугрупова променливост през вътрешногрупова променливост.
- между-група Променливостта отразява колко далеч се отклонява средната стойност на всяка група от общата средна стойност. Сравнете двете графики по-долу, за да разберете по-добре.
Лявата графика показва много малка разлика между трите групи, така че средните стойности на всичките три групи са близки до общо означава.
Дясната графика изобразява три разпределения, разположени далеч едно от друго, без припокриване, така че разликата между общата средна стойност и средната стойност на всяка група е голяма.
- вътрешногрупов Променливостта измерва доколко отделните наблюдения се отклоняват от средната стойност за тяхната собствена група. Някои точки са далеч от средната стойност за групата, а вътрешногруповият член улавя точно този разсейване, което е грешката в извадката.
За да разберете визуално концепцията за вътрешногрупова променливост, погледнете графиката по-долу.
Лявата част изобразява разпределението на три различни групи. Увеличихте разпределението на всяка извадка и е ясно, че индивидуалната дисперсия е голяма. F-статистиката пада, така че няма да можете да отхвърлите нулевата хипотеза.
Дясната част показва извадки със същите средни стойности, но много по-малък разсейване. Това повишава F-статистиката и сочи в полза на алтернативната хипотеза.
Можете да използвате и двете мерки за конструиране на F-статистиката. Много е интуитивно да се разбере F-статистиката. Ако числителят се увеличи, това означава, че променливостта между групите е висока и е вероятно групите в извадката да са извлечени от напълно различни разпределения.
С други думи, ниската F-статистика показва малка или никаква съществена разлика между средните стойности на групата.
Пример Еднопосочен ANOVA тест
Ще използвате набора от данни за отровата, за да приложите еднопосочния ANOVA тест. Наборът от данни съдържа 48 реда и 3 променливи:
- Време: Време за оцеляване на животното
- отрова: Вид на използваната отрова: ниво на фактор: 1,2 и 3
- лечение: Вид на използваното лечение: ниво на фактор: 1,2 и 3
Преди да започнете да изчислявате ANOVA теста, трябва да подготвите данните, както следва:
- Стъпка 1: Импортирайте данните
- Стъпка 2: Премахнете ненужната променлива
- Стъпка 3: Преобразувайте променливата отрова като подредено ниво
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)
Изход:
## 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, ...
Нашата цел е да тестваме следното предположение:
- H0: Няма разлика в средното време на оцеляване между групите
- H1: Средното време на оцеляване е различно за поне една група.
С други думи, искате да знаете дали има статистическа разлика между средната стойност на времето за оцеляване според вида отрова, дадена на морското свинче.
Ще продължите както следва:
- Стъпка 1: Проверете формата на променливата poison
- Стъпка 2: Отпечатайте обобщената статистика: брой, средно и стандартно отклонение
- Стъпка 3: Начертайте графика в кутия
- Стъпка 4: Изчислете еднопосочния ANOVA тест
- Стъпка 5: Извършете сравнение по двойки с Tukey HSD
Стъпка 1) Проверете нивата на отравяне с кода по-долу. Трябва да видите трисимволни стойности, защото глаголът mutate е преобразувал колоната в подреден фактор.
levels(df$poison)
Изход:
## [1] "1" "2" "3"
Стъпка 2) Вие изчислявате средната стойност и стандартното отклонение.
df %>% group_by(poison) %>% summarise( count_poison = n(), mean_time = mean(time, na.rm = TRUE), sd_time = sd(time, na.rm = TRUE) )
Изход:
## # 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
Стъпка 3) В трета стъпка можете да проверите графично дали има разлика между разпределението. Обърнете внимание, че включвате трептящата точка.
ggplot(df, aes(x = poison, y = time, fill = poison)) + geom_boxplot() + geom_jitter(shape = 15, color = "steelblue", position = position_jitter(0.21)) + theme_classic()
Изход:
Стъпка 4) Можете да стартирате еднопосочния ANOVA тест с командата aov. Основният синтаксис за ANOVA тест е:
aov(formula, data)
Arguments:
- formula: The equation you want to estimate
- data: The dataset used
Синтаксисът на формулата е:
y ~ X1+ X2+...+Xn # X1 + X2 +... refers to the independent variables y ~ . # use all the remaining variables as independent variables
Сега можете да отговорите на въпроса: има ли някаква разлика във времето за оцеляване между морските свинчета, предвид вида на приложената отрова?
Съхранявайте модела в обект и го предайте на summary(), за да получите четлив отпечатък на резултатите.
anova_one_way <- aov(time~poison, data = df) summary(anova_one_way)
Code Обяснение
- aov(време ~ отрова, данни = df): Изпълнете ANOVA теста със следната формула
- summary(anova_one_way): Отпечатайте резюмето на теста
Изход:
## 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
P-стойността е 7.66e-05, далеч под обичайния праг от 0.05, а трите звездички отбелязват най-силния код за значимост. Можете да отхвърлите H0 и да заключите, че поне една група отрови има различно средно време на оцеляване.
Как да проверим ANOVA предположения в R
ANOVA p-стойността е надеждна само когато са изпълнени трите условия, изброени по-горе. Всяко от тях има директна проверка в R и всички те се изпълняват върху съответния обект на модела.
1. Независимост на наблюденията. Това е свойство на дизайна на изследването, а не на данните, така че никой тест не може да го спаси. Всяко морско свинче трябва да бъде измерено веднъж и разпределено в своята група на случаен принцип. Ако един и същ субект се появява в няколко реда, вместо това е необходим модел с повтарящи се измервания.
2. Нормалност на остатъците. ANOVA приема, че остатъците, а не суровите данни, са приблизително нормални. Проверете QQ графиката и потвърдете с теста на Шапиро-Уилк:
par(mfrow = c(2, 2)) plot(anova_one_way) # four diagnostic plots shapiro.test(residuals(anova_one_way))
Точките, обхващащи диагонала на нормалната QQ графика, показват нормални остатъци. p-стойност на Шапиро-Уилк над 0.05 означава, че не можете да отхвърлите нормалността.
3. Хомогенност на дисперсията. Всяка група трябва да показва подобно разпространение. Графиката „Остатъци спрямо напаснати“ трябва да изглежда като плоска лента, а не като фуния. Потвърдете го с теста на Левен, който е по-устойчив на ненормалност от този на Бартлет:
library(car)
leveneTest(time ~ poison, data = df)
bartlett.test(time ~ poison, data = df)
P-стойност над 0.05 подкрепя еднакви дисперсии.
Какво да се направи, когато едно предположение се окаже неуспешно. Ако дисперсиите са неравномерни, изпълнете oneway.test(time ~ poison, data = df, var.equal = FALSE) - корекцията на Уелч. Ако остатъците са очевидно ненормални и извадката е малка, преминете към ранговия тест на Крускал-Уолис, krusalk.test(time ~ poison, data = df). При големи балансирани извадки, ANOVA е сравнително устойчив до умерени отклонения от нормалността, така че граничният резултат на Шапиро-Уилк рядко е фатален.
Сравнение по двойки
Значимият F-тест ви казва, че средните стойности на групата не са всички равни, но не и коя двойка се различава. Тестът за честна значима разлика на Тюки отговаря на това, като сравнява всяка двойка, като същевременно контролира процента на грешки на ниво семейство.
TukeyHSD(anova_one_way)
Изход:
Прочетете изхода по един ред за всяка двойка. разл колоната съдържа разликата между средните стойности на двете групи, ниско налягане намлява Разрешително очерта 95-процентния доверителен интервал за тази разлика и п прил. е p-стойността, коригирана за множество сравнения. Една двойка се различава значително, когато интервалът ѝ изключва нула, еквивалентно, когато p adj е под 0.05. В този набор от данни сравненията, включващи отрова 3, са значимите, което съответства на диаграмата: група 3 има значително по-ниско средно време на оцеляване от групи 1 и 2, докато групи 1 и 2 са статистически неразличими една от друга.
Двупосочна ANOVA
Двуфакторният ANOVA добавя втори фактор към формулата. Той работи точно както еднофакторния тест, само че формулата се променя:
y ~ x1 + x2
Тук y е количествената променлива на отговора, докато x1 и x2 са категориални фактори.
Хипотеза в двупосочен ANOVA тест
- H0: Средните стойности на групата са равни и за двете факторни променливи
- H1: Поне една групова средна стойност се различава за поне един от двата фактора
Добавяте променливата за третиране към модела. Тази променлива записва третирането, дадено на морското свинче. Адитивната формула по-долу проверява дали всеки фактор влияе върху времето за оцеляване самостоятелно, след отчитане на другия.
Коригирайте кода, като добавите „treat“ до първата независима променлива.
anova_two_way <- aov(time~poison + treat, data = df) summary(anova_two_way)
Изход:
## 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 ## ---
И двете p-стойности (5.7e-07 за отрова и 6.7e-06 за лечение) са далеч под 0.05, така че отхвърляте H0 и за двата фактора и заключавате, че промяната или на отровата, или на лечението влияе върху времето за оцеляване.
Добавяне на термин за взаимодействие
Адитивният модел по-горе приема, че ефектът на отровата е един и същ, независимо от лечението. За да проверим това предположение, заменете знака плюс със звездичка, което отговаря както на основните ефекти, така и на тяхното взаимодействие:
anova_interaction <- aov(time~poison * treat, data = df) summary(anova_interaction)
Ако редът poison:treat не е значим, адитивният модел е по-добрият избор, защото използва по-малко степени на свобода.
ANOVA в R: Справочник за бързи тестове
Таблицата по-долу изброява всеки използван по-горе тест, R извикването, което го изпълнява, и хипотезата, която оценява:
| тест | Code | хипотеза | P-стойност |
|---|---|---|---|
| Еднопосочна ANOVA |
aov(y ~ X, data = df)
|
H1: Средната стойност е различна за поне една група | 0.05 |
| По двойки |
TukeyHSD(ANOVA summary) |
0.05 | |
| Двупосочна ANOVA |
aov(y ~ X1 + X2, data = df)
|
H1: Поне една групова средна стойност се различава за всеки от факторите | 0.05 |




