Дисперсионный анализ в R: однофакторный и двухфакторный тест с примерами.

⚡ Умное резюме

Дисперсионный анализ (ANOVA) в R сравнивает средние значения трех или более групп, разделяя общую вариацию на межгрупповые и внутригрупповые компоненты. В этом пошаговом руководстве выполняются однофакторные и двухфакторные тесты на наборе данных о ядах, проверяются предположения и выделяются различающиеся пары с помощью критерия Тьюки (Tukey HSD).

  • 📐 Основная статистика: F-критерий делит межгрупповую изменчивость на внутригрупповую изменчивость, поэтому большие значения говорят против равенства средних.
  • 🧪 Односторонний синтаксис: Функция aov(time~poison, data = df) с последующим вызовом summary() возвращает число степеней свободы, значение F и значение p.
  • Предположительные проверки: Перед тем как доверять значению p, проверьте независимость, нормальность остатков с помощью функции shapiro.test() и равенство дисперсий с помощью функции leveneTest().
  • 🔎 Постфактумный анализ: Функция TukeyHSD() сравнивает каждую пару групп, сохраняя при этом уровень ошибки первого рода на заданном уровне.
  • 🧮 Двустороннее соединение: aov(time~poison + treat, data = df) добавляет второй фактор, а poison:treat добавляет член взаимодействия.
  • 📊 Результаты чтения: Значение p < 0.05 отвергает нулевую гипотезу о равенстве средних, но никогда не позволяет определить, какая группа отличается.

Дисперсионный анализ в R: однофакторный и двухфакторный.

Что такое АНОВА?

Дисперсионный анализ Дисперсионный анализ (ANOVA) — это статистический метод, используемый для сравнения средних значений двух или более групп. Тест работает путем разделения общей вариации измерения на часть, объясняемую принадлежностью к группе, и часть, оставшуюся в виде случайного шума. Таким образом, ANOVA в R показывает, отличается ли хотя бы одно среднее значение группы от других, а не от какого именно. Это прямое расширение Т-тест к ситуациям, когда факторная переменная имеет более двух уровней.

Перед проведением теста полезно знать, какой из членов семейства ANOVA подходит для вашей схемы эксперимента.

Типы тестов ANOVA в R

«ANOVA» — это скорее семейство тестов, чем отдельная процедура. Выбор подходящего теста зависит от количества факторов и способа сбора данных.

Тест Когда это использовать R-звонок
Односторонний ANOVA Один фактор с тремя или более уровнями aov(y ~ x, data = df)
Двухсторонний ANOVA Два независимых фактора aov(y ~ x1 + x2, data = df)
Двустороннее взаимодействие Влияние одного фактора зависит от другого. aov(y ~ x1 * x2, data = df)
Дисперсионный анализ с повторными измерениями Одни и те же испытуемые проходили измерения более одного раза. aov(y ~ x + Error(subject/x))
АНКОВА Необходимо контролировать непрерывную ковариату. aov(y ~ x + covariate, data = df)
МАНОВА Две или более переменные отклика одновременно manova(cbind(y1, y2) ~ x)

В этом руководстве рассматриваются первые три варианта. Остальные варианты используют тот же интерфейс aov(), поэтому, как только вы научитесь читать одну выходную таблицу, вы сможете читать их все.

ANOVA против T-теста в R: ключевые различия

Оба теста сравнивают средние значения, поэтому важно точно указать, где один заменяет другой.

Критерии Т-тест ANOVA
Количество групп Ровно два Два или более
Статистика испытаний t F равно t в квадрате, когда есть две группы.
Результат Указывает направление разницы Сообщается лишь о наличии различий.
Требуется последующее наблюдение Ничто Постхок-тест, например, тест Тьюки HSD.
Функция R t.тест() aov()

При работе с тремя группами возникает соблазн провести три отдельных t-теста. Не стоит этого делать. Каждый тест имеет свою собственную погрешность в 5%, поэтому три сравнения увеличивают вероятность ложноположительного результата примерно до 14%. Дисперсионный анализ (ANOVA) отвечает на тот же вопрос с помощью одного теста, а тест Тьюки (Tukey HSD) обрабатывает парные сравнения, контролируя при этом погрешность. Для случая с двумя группами см. руководство по t-тесту.

Односторонний ANOVA

Есть много ситуаций, когда вам нужно сравнить среднее значение между несколькими группами. Например, отдел маркетинга хочет знать, имеют ли три команды одинаковые показатели продаж.

  • Команда: коэффициент 3-го уровня: A, B и C.
  • Продажа: показатель эффективности

Тест ANOVA может определить, имеют ли три группы схожие показатели.

Чтобы уточнить, получены ли данные из одной и той же совокупности, вы можете выполнить односторонний дисперсионный анализ (далее — однофакторный дисперсионный анализ). Как и любой другой статистический тест, он дает представление о том, можно ли отклонить нулевую гипотезу (H0). Следует отметить, что неспособность отклонить H0 не равнозначна доказательству ее истинности.

Гипотеза в однофакторном тесте ANOVA

  • H0: средние значения между группами идентичны.
  • H1: По крайней мере, среднее значение одной группы отличается

Иными словами, непризнание нулевой гипотезы означает, что недостаточно доказательств для вывода о том, что среднее значение какой-либо группы отличается от других.

Этот тест похож на t-тест, но дисперсионный анализ (ANOVA) является правильным выбором, когда групп больше двух. При наличии ровно двух групп оба теста эквивалентны, и F-статистика равна квадрату t-статистики.

Предположения

Однофакторный дисперсионный анализ (ANOVA) основан на трех условиях: наблюдения выбираются случайным образом и независимы друг от друга, остатки внутри каждой группы приблизительно распределены нормально, и дисперсия одинакова во всех группах (однородность дисперсии). В разделе проверки предположений ниже показано, как проверить каждое из них в R.

Интерпретация теста ANOVA

F-статистика используется для проверки того, взяты ли данные из значительно разных групп населения, т. е. из разных выборочных средних значений.

Чтобы вычислить F-статистику, вам нужно разделить межгрупповая изменчивость за внутригрупповая изменчивость.

межгрупповой Изменчивость отражает, насколько среднее значение каждой группы отличается от общего среднего значения. Сравните два графика ниже, чтобы понять эту идею.

На левом графике показана очень небольшая разница между тремя группами, поэтому средние значения всех трех групп находятся близко к среднему значению. общий значит.

На правом графике показаны три распределения, расположенные далеко друг от друга и не перекрывающиеся, поэтому разрыв между общим средним значением и средним значением каждой группы велик.

Интерпретация теста ANOVA

внутригрупповой Изменчивость измеряет, насколько отдельные наблюдения отклоняются от среднего значения своей группы. Некоторые точки находятся далеко от среднего значения группы, и внутригрупповой член точно отражает это отклонение, которое и представляет собой ошибку выборки.

Чтобы визуально понять концепцию внутригрупповой изменчивости, посмотрите на график ниже.

В левой части графика показано распределение трех различных групп. Вы увеличили разброс каждой выборки, и очевидно, что индивидуальная дисперсия велика. F-статистика снижается, поэтому вы не сможете отклонить нулевую гипотезу.

В правой части представлены выборки с одинаковыми средними значениями, но гораздо меньшим разбросом. Это повышает F-статистику и указывает в пользу альтернативной гипотезы.

Интерпретация теста ANOVA

Вы можете использовать обе меры для построения 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. Проверьте формат переменной яд.
  • Шаг 2. Распечатайте сводную статистику: количество, среднее значение и стандартное отклонение.
  • Шаг 3. Постройте коробчатую диаграмму
  • Шаг 4. Вычислите однофакторный тест ANOVA.
  • Шаг 5: Проведите попарное сравнение с помощью критерия Тьюки 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()

Выход:

Пример одностороннего теста ANOVA

Шаг 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) и заключить, что по крайней мере одна группа ядов имеет различное среднее время выживания.

Как проверить предположения дисперсионного анализа в 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). При больших сбалансированных выборках дисперсионный анализ достаточно устойчив к умеренным отклонениям от нормального распределения, поэтому пограничный результат теста Шапиро-Уилка редко бывает фатальным.

Попарное сравнение

Значимый 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. Эта переменная регистрирует лечение, назначенное морской свинке. Приведенная ниже аддитивная формула проверяет, влияет ли каждый фактор на время выживания сам по себе, с учетом влияния других факторов.

Измените код, добавив слово 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, поэтому вы отвергаете нулевую гипотезу для обоих факторов и делаете вывод, что изменение яда или лечения влияет на время выживания.

Добавление члена взаимодействия

Приведенная выше аддитивная модель предполагает, что эффект яда одинаков независимо от лечения. Чтобы проверить это предположение, замените знак плюса на звездочку, которая соответствует как основным эффектам, так и их взаимодействию:

anova_interaction <- aov(time~poison * treat, data = df)
summary(anova_interaction)

Если соотношение отравление:лечение не является статистически значимым, аддитивная модель является лучшим выбором, поскольку она использует меньше степеней свободы.

ANOVA в R: Краткий справочник по тестам

В таблице ниже перечислены все использованные выше тесты, вызов функции R для их выполнения и проверяемая гипотеза:

Тест Code Гипотеза Р-значение
Односторонний дисперсионный анализ
aov(y ~ X, data = df)
H1: Среднее значение отличается как минимум для одной группы 0.05
парный
TukeyHSD(ANOVA summary)
0.05
Двухсторонний дисперсионный анализ
aov(y ~ X1 + X2, data = df)
H1: По крайней мере, среднее значение одной группы различается по обоим факторам. 0.05

Часто задаваемые вопросы (FAQ)

F-критерий — это отношение межгрупповой дисперсии к внутригрупповой дисперсии. Значения, близкие к 1, указывают на сходство средних значений групп. Большие значения свидетельствуют о том, что группы взяты из популяций с разными средними значениями.

Используйте oneway.test() с var.equal = FALSE, когда дисперсии неравны, и kruskal.test(), когда остатки явно ненормальны. Преобразование асимметрично распределенных данных с помощью log() часто восстанавливает как нормальность, так и равенство дисперсий.

Каждый t-тест несет в себе собственный 5-процентный риск ложноположительных результатов. Три попарных теста повышают вероятность ошибки первого рода примерно до 14 процентов. Дисперсионный анализ (ANOVA) сохраняет вероятность ошибки первого рода в рамках одного общего теста на уровне 5 процентов, а критерий Тьюки (Tukey HSD) корректирует попарные сравнения.

ANOVA — это стандартный фильтр для отбора признаков: он ранжирует категориальные предикторы по тому, насколько сильно они разделяют числовую целевую переменную. Команды разработчиков ИИ также используют его для сравнения вариантов моделей в разных группах перекрестной проверки.

Да. Искусственный интеллект может объяснять степени свободы, переводить p-значения на простой язык и отмечать нарушения предположений на диагностических графиках. Всегда сверяйте полученные данные со своими собственными результатами leveneTest() и shapiro.test().

Подведем итог этой публикации следующим образом: