Продолжение серии моих переводов из учебного пособия «Просто R — Использование R для ознакомительной статистики» американского автора John’a VERZANI.
http://www.math.csi.cuny.edu/Statistics/R/simpleR
Раздел 15: Анализ различий (дисперсионный анализ, ANOVA)
t-Тест используется, чтобы узнать, существуют ли различия в средних двух выборок. Напр., есть ли разница между испытуемой и контрольной группами. Метод, именуемый «анализ различий» («дисперсионный анализ», ANOVA), позволяет сравнивать средние более чем в двух группах.
Разберём вначале пример однофакторного анализа.
Классификация стипендий
Предположим, что школа должна рассмотреть 300 заявок на стипендии. Эта работа слишком велика для одного человека, поэтому школа нанимает шестерых классификаторов. Комитет по рассмотрению стипендий хотел бы убедиться, что все классификаторы пользуются одной и той же шкалой при оценивании заявок, поскольку в ином случае заявители не будут находиться в равных условиях. Одним из способов сделать это является распределить в случайном порядке между классификаторами задания (каждому из шестерых достанется по 50) и затем сравнить оценки, выставленные каждым из шести, зная, что различия между классификаторами будут минимальны (т. е. будут в пределах случайной ошибки) в том случае, если все пользуются одинаковой шкалой оценок.
Для того, чтобы проиллюстрировать работу метода, положим, что в нашем распоряжении есть 27 тестов и три классификатора (а не 300 и 6 — для простоты). Кроме того, пусть классификаторы пользуются пятибальной шкалой. Выставленные ими оценки выглядят так:
grader 1: 4, 3, 4, 5, 2, 3, 4, 5
grader 2: 4, 4, 5, 5, 4, 5, 4, 4
grader 3: 3, 4, 2, 4, 5, 5, 4, 4
Введём эти данные в R и объединим затем в одну таблицу:
> x = c(4,3,4,5,2,3,4,5)
> y = c(4,4,5,5,4,5,4,4)
> z = c(3,4,2,4,5,5,4,4)
> scores = data.frame(x,y,z)
> boxplot(scores)
Вначале мы построили диаграммы размахов, позволяющие зрительно сравнить три распределения. Из рисунка следует, что второй классификатор отличается от двух других.
Дисперсионный анализ позволяет нам установить, действительно ли средние оценки всех классификаторов одинаковы в пределах ошибки. Функция в R, позволяющая проводить однофакторный дисперсионный анализ (oneway.test
) требует данных в ином формате, а именно — данные должны составлять один вектор, а во второй должен быть фактором, описывающим классификаторов или категорию (иными словами в одном столбце должны быть все оценки классификаторов, а во втором — указание, какая оценка какому классификатору принадлежит). Команда stack()
сделает это преобразование:
> scores = stack(scores)
> names(scores)
[1] "values" "ind"
Посмотрев на имена векторов (names), мы узнали, что значения собраны в переменной «values», а категории — в переменной «ind». Чтобы вызвать oneway.test()
, мы должны воспользоваться такой же записью, какая применяется в формулах:
> oneway.test(values ~ ind, data=scores, var.equal=T)
One-way analysis of means
data: values and ind
F = 1.1308, num df = 2, denom df = 21, p-value = 0.3417
Мы видим, что p = 0.34, а это значит, что мы принимаем нулевую гипотезу о равенстве средних. Более детальную информацию об анализе можно получить, воспользовавшись функциями anova()
и aov()
.
Дополнение из книги Paul TEETOR. R Cookbook.
Итак, вы узнали, что есть значимые отличия в средних, относящихся к разным группам. Однако сам по себе тест не показывает, какие именно группы отличаются.
Функция TukeyHSD()
позволяет посчитать эти отличия и указывает вам на самые большие из них. В ней реализован т. н. метод «по-честному значимых отличий» («honest significant differences»), предложенный Джоном ТЬЮКИ.
Выполнение дисперсионного анализа функцией aov()
даёт результаты, к которым применяют функцию TukeyHSD()
:
> TukeyHSD(aov(x ~ f))
Здесь x — это ваши данные, а f — группирующий их фактор. Вы можете визуализировать результаты для наглядности:
> plot(TukeyHSD(m))
Тест Краскела–Уоллиса
Тест Краскела–Уоллиса является непараметрическим тестом, используемым вместо однофакторного дисперсионного анализа в том случае, если данные не распределены нормально. Его применяют подобно тому, как тест Вилкоксона вместо t-теста.
Тест Краскела–Уоллиса используется в R подобно команде oneway.test
:
> kruskal.test(values ~ ind, data=scores)
Kruskal-Wallis rank sum test
data: values by ind
Kruskal-Wallis chi-squared = 1.9387, df = 2, p-value = 0.3793
Читать далее