Як виконати односторонній дисперсійний аналіз у 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) %>% summarize (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")
З цих коробкових графіків ми бачимо, що середня втрата ваги є найвищою для учасників програми 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 #--- #Significant. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
З результатів моделі ми бачимо, що програма предикторних змінних є статистично значущою на рівні значущості 0,05.
Іншими словами, існує статистично значуща різниця між середньою втратою ваги в результаті трьох програм.
Перевірка припущень моделі
Перш ніж йти далі, нам потрібно перевірити, чи виконуються припущення нашої моделі, щоб результати нашої моделі були надійними. Зокрема, односторонній ANOVA передбачає:
1. Незалежність – спостереження кожної групи мають бути незалежними одне від одного. Оскільки ми використовували рандомізований дизайн (тобто ми розподіляли учасників на програми вправ випадковим чином), це припущення має виконуватися, щоб нам не довелося про це надто турбуватися.
2. Нормальність – залежна змінна повинна мати приблизно нормальний розподіл для кожного рівня предикторної змінної.
3. Рівна дисперсія – дисперсії для кожної групи рівні або приблизно рівні.
Один із способів перевірити припущення про нормальність і рівну дисперсію — це використовувати функцію plot() , яка створює чотири графіки перевірки моделі. Зокрема, нас особливо цікавлять наступні дві ділянки:
- Залишки проти підігнаний – цей графік показує співвідношення між залишками та підігнаними значеннями. Ми можемо використовувати цей графік, щоб приблизно оцінити, чи є дисперсія між групами приблизно рівною чи ні.
- Графік QQ – цей графік відображає стандартизовані залишки проти теоретичних квантилів. Ми можемо використовувати цей графік, щоб приблизно оцінити, чи виконується припущення про нормальність.
Наступний код можна використати для створення цих графіків перевірки моделі:
plot(model)
Наведений вище графік QQ дозволяє нам перевірити припущення про нормальність. В ідеалі стандартизовані залишки повинні лежати вздовж прямої діагональної лінії графіка. Однак на графіку вище ми бачимо, що залишки трохи відхиляються від лінії до початку та кінця. Це означає, що наше припущення нормальності може бути порушено.
Залишки проти Наведений вище скоригований графік дозволяє нам перевірити наше припущення про рівні дисперсії. В ідеалі ми хотіли б, щоб залишки були рівномірно розподілені для кожного рівня підігнаних значень.
Ми бачимо, що залишки набагато більш розкидані для вищих підігнаних значень, що вказує на те, що наше припущення про рівність дисперсій може бути порушено.
Щоб формально перевірити однакові дисперсії, ми можемо виконати тест Левена, використовуючи пакет автомобіля :
#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 #--- #Significant. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
P-значення тесту становить 0,01862 . Якщо ми використовуємо рівень значущості 0,05, ми відхилимо нульову гіпотезу про те, що дисперсії однакові для трьох програм. Однак, якщо ми використовуємо рівень значущості 0,01, ми не відхилимо нульову гіпотезу.
Хоча ми могли б спробувати трансформувати дані, щоб забезпечити виконання наших припущень щодо нормальності та рівності дисперсій, наразі ми не будемо про це надто турбуватися.
Проаналізуйте відмінності лікування
Після того, як ми переконалися, що припущення моделі виконуються (або обґрунтовано виконуються), ми можемо виконати ретельне тестування , щоб точно визначити, які групи лікування відрізняються одна від одної.
Для нашого post hoc тесту ми використаємо функцію TukeyHSD() для виконання тесту Tukey для кількох порівнянь:
#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
#BA 0.9777414 0.1979466 1.757536 0.0100545
#CA 2.5454024 1.7656076 3.325197 0.0000000
#CB 1.5676610 0.7878662 2.347456 0.0000199
P-значення вказує на те, чи є статистично значуща різниця між кожною програмою. Результати показують, що існує статистично значуща різниця між середньою втратою ваги в кожній програмі на рівні значущості 0,05.
Ми також можемо візуалізувати 95% довірчі інтервали в результаті тесту Тьюкі за допомогою функції plot(TukeyHSD()) у R:
#create confidence interval for each comparison
plot(TukeyHSD(model, conf.level=.95), las = 2)
Результати довірчих інтервалів узгоджуються з результатами перевірки гіпотез.
Зокрема, ми бачимо, що жоден із довірчих інтервалів для середньої втрати ваги між програмами не містить нульового значення, що вказує на наявність статистично значущої різниці в середній втраті між трьома програмами.
Це узгоджується з тим, що всі p-значення для наших перевірок гіпотез менше 0,05.
Звіт про результати одностороннього дисперсійного аналізу
Нарешті, ми можемо повідомити про результати одностороннього дисперсійного аналізу таким чином, щоб узагальнити результати:
Було проведено односторонній дисперсійний аналіз, щоб перевірити вплив програми вправ на втрату ваги (вимірюється в фунтах). Була статистично значуща різниця між впливом трьох програм на втрату ваги (F(2, 87) = 30,83, p = 7,55e-11). Були проведені додаткові тести Tukey HSD.
Середня втрата ваги учасників програми C значно більша, ніж середня втрата ваги учасників програми B (p <0,0001).
Середня втрата ваги учасників програми C значно більша, ніж середня втрата ваги учасників програми A (p <0,0001).
Крім того, середня втрата ваги учасників програми B була значно більшою, ніж середня втрата ваги учасників програми A (p = 0,01).
Додаткові ресурси
У наступних посібниках надається додаткова інформація про односторонній дисперсійний аналіз:
Вступ до одностороннього дисперсійного аналізу
Посібник із використання пост-хок тестування з ANOVA
Повний посібник: як звітувати про результати ANOVA