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) |
| МАНОВА | Дві або більше змінних відгуку одночасно | manova(cbind(y1, y2) ~ x) |
У цьому посібнику розглядаються перші три. Решта варіантів використовують той самий інтерфейс aov(), тому, як тільки ви зможете прочитати одну вихідну таблицю, ви зможете прочитати їх усі.
ANOVA проти T-тесту в R: ключові відмінності
Обидва тести порівнюють середні значення, тому варто точно визначити, де один замінює інший.
| Критерії | T-тест | ANOVA |
|---|---|---|
| Кількість груп | Рівно два | Two or more |
| Статистика випробувань | t | F, що дорівнює t у квадраті, коли є дві групи |
| Результат | Називає напрямок різниці | Повідомляється лише про наявність різниці |
| Потрібні подальші дії | ніхто | Post hoc тест, такий як Tukey HSD |
| функція R | t.test() | aov() |
Спокуса з трьома групами полягає в тому, щоб провести три окремі t-тести. Опір їй. Кожен тест має свій власний 5-відсотковий коефіцієнт помилок, тому три порівняння збільшують ймовірність хибнопозитивного результату приблизно до 14 відсотків. ANOVA відповідає на те саме запитання за допомогою одного тесту, а Tukey HSD потім обробляє попарну деталізацію, контролюючи коефіцієнт помилок. Щодо випадку з двома групами див. навчальний посібник з t-тесту.
Одностороння ANOVA
Є багато ситуацій, коли вам потрібно порівняти середнє між кількома групами. Наприклад, відділ маркетингу хоче знати, чи три команди мають однакову ефективність продажів.
- Команда: 3 коефіцієнти рівня: A, B і C
- Продаж: міра ефективності
Тест ANOVA може визначити, чи три групи мають однакові результати.
Щоб уточнити, чи надходять дані з однієї сукупності, ви можете виконати a односторонній дисперсійний аналіз (далі – однофакторний дисперсійний аналіз). Як і будь-який інший статистичний тест, він дає докази того, чи можна відхилити гіпотезу 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(time ~ poison, data = 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
P-значення дисперсійного аналізу (ANOVA) є достовірним лише тоді, коли виконуються три умови, перелічені раніше. Кожна з них має пряму перевірку в 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) – корекцію Велча. Якщо залишки явно ненормальні, а вибірка мала, перейдіть до рангового тесту Краскела-Уолліса, kruskal.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-значення |
|---|---|---|---|
| Односторонній дисперсійний аналіз |
aov(y ~ X, data = df)
|
H1: Середнє значення відрізняється принаймні для однієї групи | 0.05 |
| Попарно |
TukeyHSD(ANOVA summary) |
0.05 | |
| Двосторонній дисперсійний аналіз |
aov(y ~ X1 + X2, data = df)
|
H1: Принаймні одне групове середнє значення відрізняється для будь-якого фактора | 0.05 |




