Как провести односторонний дисперсионный анализ в R


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

Этот тип теста называется односторонним дисперсионным анализом, потому что мы анализируем, как одна предикторная переменная влияет на переменную отклика.

Примечание.Если бы вместо этого нас интересовало, как две переменные-предикторы влияют на переменную отклика, мы могли бы провести двусторонний дисперсионный анализ .

Как провести односторонний дисперсионный анализ в R

В следующем примере показано, как провести однофакторный дисперсионный анализ в R.

Фон

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

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

Мы набираем 90 человек для участия в эксперименте, в котором мы случайным образом назначаем 30 человек следовать либо программе A, либо программе B, либо программе C в течение одного месяца.

Следующий код создает фрейм данных, с которым мы будем работать:

#make this example reproducible
set.seed(0)

#create data frame
data <- data.frame(program = rep(c("A", "B", "C"), each = 30),
 weight_loss = c(runif(30, 0, 3),
 runif(30, 0, 5),
 runif(30, 1, 7)))

#view first six rows of data frame
head(data)

# program weight_loss
#1 A 2.6900916
#2 A 0.7965260
#3 A 1.1163717
#4 A 1.7185601
#5 A 2.7246234
#6 A 0.6050458

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

Изучение данных

Еще до того, как мы подогнали однофакторную модель ANOVA, мы можем лучше понять данные, найдя среднее значение и стандартное отклонение потери веса для каждой из трех программ с помощью пакета dplyr :

#load *dplyr* package
library(dplyr)

#find mean and standard deviation of weight loss for each treatment group
data %>%
 group_by(program) %>%
 summarise (mean = mean(weight_loss),
 sd = sd(weight_loss))

# A tibble: 3 x 3
# program mean sd
# 
#1 A 1.58 0.905
#2 B 2.56 1.24 
#3 C 4.13 1.57

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

#create boxplots
boxplot(weight_loss ~ program,
data = data,
main = "Weight Loss Distribution by Program",
xlab = "Program",
ylab = "Weight Loss",
col = "steelblue",
border = "black") 
Блочные диаграммы для исследования данных в R

Только из этих диаграмм видно, что средняя потеря веса самая высокая у участников программы C, а средняя потеря веса самая низкая у участников программы A.

Мы также можем видеть, что стандартное отклонение («длина» диаграммы) для потери веса немного выше в программе C по сравнению с двумя другими программами.

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

Подбор однофакторной модели ANOVA

Общий синтаксис для соответствия однофакторной модели ANOVA в R выглядит следующим образом:

aov (переменная ответа ~ переменная_предиктора, данные = набор данных)

В нашем примере мы можем использовать следующий код, чтобы соответствовать однофакторной модели ANOVA, используя weight_loss в качестве переменной ответа и программу в качестве нашей переменной-предиктора. Затем мы можем использовать функцию summary() для просмотра вывода нашей модели:

#fit the one-way ANOVA model
model <- aov(weight_loss ~ program, data = data)

#view the model output
summary(model)

# Df Sum Sq Mean Sq F value Pr(>F) 
#program 2 98.93 49.46 30.83 7.55e-11 \*\*\*
#Residuals 87 139.57 1.60 
#---
#Signif. codes: 0 '\*\*\*' 0.001 '\*\*' 0.01 '\*' 0.05 '.' 0.1 ' ' 1

Из выходных данных модели мы видим, что программа предикторов статистически значима на уровне значимости 0,05.

Другими словами, существует статистически значимая разница между средней потерей веса в результате трех программ.

Проверка предположений модели

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

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

2. Нормальность – зависимая переменная должна быть примерно нормально распределена для каждого уровня предикторной переменной.

3. Равная дисперсия – дисперсии для каждой группы равны или примерно равны.

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

  • Остатки против подобранных — этот график показывает взаимосвязь между остатками и подобранными значениями. Мы можем использовать этот график, чтобы приблизительно оценить, является ли дисперсия между группами примерно одинаковой.
  • График QQ — этот график отображает стандартизованные остатки по отношению к теоретическим квантилям. Мы можем использовать этот график, чтобы приблизительно оценить, выполняется ли предположение о нормальности.

Для создания этих графиков проверки модели можно использовать следующий код:

plot(model) 
График QQ в R

Приведенный выше график QQ позволяет нам проверить предположение о нормальности. В идеале стандартизированные остатки должны располагаться вдоль прямой диагональной линии на графике. Однако на графике выше мы видим, что остатки немного отклоняются от линии к началу и концу. Это указывает на то, что наше предположение о нормальности может быть нарушено.

Остатки по сравнению с подогнанным графиком в R

Приведенный выше график «Остатки против подобранных » позволяет нам проверить наше предположение о равных дисперсиях. В идеале мы хотели бы, чтобы остатки были равномерно распределены для каждого уровня подобранных значений.

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

Чтобы формально протестировать равные отклонения, мы могли бы использовать тест Левена, используя пакет car :

#load car package
library (car)

#conduct Levene's Test for equality of variances
leveneTest(weight_loss ~ program, data = data)

#Levene's Test for Homogeneity of Variance (center = median)
# Df F value Pr(>F) 
#group 2 4.1716 0.01862 \*
# 87 
#---
#Signif. codes: 0 '\*\*\*' 0.001 '\*\*' 0.01 '\*' 0.05 '.' 0.1 ' ' 1

Значение p теста составляет 0,01862.Если мы используем уровень значимости 0,05, мы отклоним нулевую гипотезу о том, что дисперсии одинаковы для трех программ. Однако, если мы используем уровень значимости 0,01, мы не отвергнем нулевую гипотезу.

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

Анализ различий в лечении

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

Для нашего апостериорного теста мы будем использовать функцию TukeyHSD() для проведения теста Тьюки для множественных сравнений:

#perform Tukey's Test for multiple comparisons
TukeyHSD(model, conf.level=.95) 

# Tukey multiple comparisons of means
# 95% family-wise confidence level
#
#Fit: aov(formula = weight_loss ~ program, data = data)
#
#$program
# diff lwr upr p adj
#B-A 0.9777414 0.1979466 1.757536 0.0100545
#C-A 2.5454024 1.7656076 3.325197 0.0000000
#C-B 1.5676610 0.7878662 2.347456 0.0000199

Значение р указывает, есть ли статистически значимая разница между каждой программой. Из результатов видно, что существует статистически значимая разница между средней потерей веса по каждой программе на уровне значимости 0,05.

Мы также можем визуализировать 95% доверительные интервалы, полученные в результате теста Тьюки, с помощью функции plot(TukeyHSD()) в R:

#create confidence interval for each comparison
plot(TukeyHSD(model, conf.level=.95), las = 2)
График Тьюки HSD для разницы в средних значениях

Результаты доверительных интервалов согласуются с результатами проверки гипотез.

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

Это согласуется с тем фактом, что все p-значения из наших тестов гипотез ниже 0,05.

Отчет о результатах однофакторного дисперсионного анализа

Наконец, мы можем представить результаты однофакторного дисперсионного анализа таким образом, чтобы обобщить результаты:

Односторонний ANOVA был проведен для изучения эффектов программы упражнений.по снижению веса (измеряется в фунтах). Наблюдалась статистически значимая разница между влиянием трех программ на потерю веса (F(2, 87) = 30,83, p = 7,55e-11). Были проведены апостериорные тесты Тьюки HSD.

Средняя потеря веса у участников программы C значительно выше, чем средняя потеря веса у участников программы B (p < 0,0001).

Средняя потеря веса для участников программы С значительно выше, чем средняя потеря веса для участников программы А (p < 0,0001).

Кроме того, средняя потеря веса у участников программы Б значительно выше, чем средняя потеря веса у участников программы А (p = 0,01).

Дополнительные ресурсы

Следующие руководства предоставляют дополнительную информацию об однофакторном ANOVA:

Введение в однофакторный дисперсионный анализ
Руководство по использованию апостериорных тестов с ANOVA
Полное руководство: как сообщить о результатах ANOVA

Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.