На самом деле не очень сложно справиться с гетероскедастичностью в простых линейных моделях (например, в одно- или двухсторонних моделях, подобных ANOVA).
Надежность ANOVA
Во-первых, как отмечают другие, ANOVA удивительно устойчив к отклонениям от предположения о равных отклонениях, особенно если у вас есть приблизительно сбалансированные данные (равное количество наблюдений в каждой группе). Предварительные тесты на равные отклонения, с другой стороны, не являются (хотя тест Левена намного лучше, чем F- тест, обычно преподаемый в учебниках). Как сказал Джордж Бокс:
Провести предварительное испытание на отклонения - это все равно, что отправиться в море на гребной лодке, чтобы выяснить, достаточно ли спокойны условия для выхода океанического лайнера из порта!
Несмотря на то, что ANOVA очень устойчив, поскольку очень легко учитывать гетероскедатичность, нет особых причин не делать этого.
Непараметрические тесты
Если вы действительно заинтересованы в различиях в средствах , непараметрические тесты (например, тест Крускала-Уоллиса) действительно бесполезны. Они проверяют различия между группами, но не в целом проверяют различия в средствах.
Пример данных
Давайте сгенерируем простой пример данных, где хотелось бы использовать ANOVA, но где предположение о равных отклонениях неверно.
set.seed(1232)
pop = data.frame(group=c("A","B","C"),
mean=c(1,2,5),
sd=c(1,3,4))
d = do.call(rbind, rep(list(pop),13))
d$x = rnorm(nrow(d), d$mean, d$sd)
У нас есть три группы, с (явными) различиями как по средним, так и по отклонениям:
stripchart(x ~ group, data=d)
ANOVA
Не удивительно, что нормальный ANOVA справляется с этим довольно хорошо:
> mod.aov = aov(x ~ group, data=d)
> summary(mod.aov)
Df Sum Sq Mean Sq F value Pr(>F)
group 2 199.4 99.69 13.01 5.6e-05 ***
Residuals 36 275.9 7.66
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Итак, какие группы отличаются? Давайте использовать метод HSD Тьюки:
> TukeyHSD(mod.aov)
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = x ~ group, data = d)
$group
diff lwr upr p adj
B-A 1.736692 -0.9173128 4.390698 0.2589215
C-A 5.422838 2.7688327 8.076843 0.0000447
C-B 3.686146 1.0321403 6.340151 0.0046867
При значении P, равном 0,26, мы не можем претендовать на какую-либо разницу (по средним показателям) между группами A и B. И даже если мы не учтем, что провели три сравнения, мы не получим низкий уровень P - значение ( P = 0,12):
> summary.lm(mod.aov)
[…]
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.5098 0.7678 0.664 0.511
groupB 1.7367 1.0858 1.599 0.118
groupC 5.4228 1.0858 4.994 0.0000153 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 2.768 on 36 degrees of freedom
Это почему? На основе сюжета, есть это довольно четкое различие. Причина в том, что ANOVA предполагает равные отклонения в каждой группе и оценивает общее стандартное отклонение в 2,77 (показано как «Остаточная стандартная ошибка» в summary.lm
таблице, или вы можете получить его, взяв квадратный корень из остаточного среднего квадрата (7,66) в таблице ANOVA).
Но в группе А стандартное отклонение (население) равно 1, а завышение в 2,77 затрудняет (без необходимости) получение статистически значимых результатов, т. Е. У нас есть тест с (слишком) низким энергопотреблением.
'ANOVA' с неравными отклонениями
Итак, как подобрать подходящую модель, которая учитывает различия в отклонениях? Это легко в R:
> oneway.test(x ~ group, data=d, var.equal=FALSE)
One-way analysis of means (not assuming equal variances)
data: x and group
F = 12.7127, num df = 2.000, denom df = 19.055, p-value = 0.0003107
Итак, если вы хотите запустить простой односторонний ANOVA в R, не допуская равных отклонений, используйте эту функцию. Это в основном расширение (Уэлч)t.test()
для двух образцов с неравными отклонениями.
К сожалению, он не работает с TukeyHSD()
(или большинство других функций , которые вы используете на aov
объекты), так что даже если мы уверены , что там есть групповые различия, мы не знаем , где они находятся.
Моделирование гетероскедастичности
Лучшее решение состоит в том, чтобы моделировать дисперсии явно. И это очень легко в R:
> library(nlme)
> mod.gls = gls(x ~ group, data=d,
weights=varIdent(form= ~ 1 | group))
> anova(mod.gls)
Denom. DF: 36
numDF F-value p-value
(Intercept) 1 16.57316 0.0002
group 2 13.15743 0.0001
Разумеется, все еще существенные различия. Но теперь различия между группами A и B также стали статически значимыми ( P = 0,025):
> summary(mod.gls)
Generalized least squares fit by REML
Model: x ~ group
[…]
Variance function:
Structure: Different standard
deviations per stratum
Formula: ~1 | group
Parameter estimates:
A B C
1.000000 2.444532 3.913382
Coefficients:
Value Std.Error t-value p-value
(Intercept) 0.509768 0.2816667 1.809829 0.0787
groupB 1.736692 0.7439273 2.334492 0.0253
groupC 5.422838 1.1376880 4.766542 0.0000
[…]
Residual standard error: 1.015564
Degrees of freedom: 39 total; 36 residual
Так что использование соответствующей модели помогает! Также обратите внимание, что мы получаем оценки (относительных) стандартных отклонений. Расчетное стандартное отклонение для группы A можно найти в нижней части, результаты, 1,02. Расчетное стандартное отклонение группы B в 2,44 раза больше, или 2,48, а расчетное стандартное отклонение группы C аналогично составляет 3,97 (введите intervals(mod.gls)
доверительные интервалы для относительных стандартных отклонений групп B и C).
Исправление для многократного тестирования
Тем не менее, мы действительно должны исправить для многократного тестирования. Это легко с помощью библиотеки 'multcomp'. К сожалению, в нем нет встроенной поддержки объектов 'gls', поэтому сначала нам нужно добавить несколько вспомогательных функций:
model.matrix.gls <- function(object, ...)
model.matrix(terms(object), data = getData(object), ...)
model.frame.gls <- function(object, ...)
model.frame(formula(object), data = getData(object), ...)
terms.gls <- function(object, ...)
terms(model.frame(object),...)
Теперь давайте приступим к работе:
> library(multcomp)
> mod.gls.mc = glht(mod.gls, linfct = mcp(group = "Tukey"))
> summary(mod.gls.mc)
[…]
Linear Hypotheses:
Estimate Std. Error z value Pr(>|z|)
B - A == 0 1.7367 0.7439 2.334 0.0480 *
C - A == 0 5.4228 1.1377 4.767 <0.001 ***
C - B == 0 3.6861 1.2996 2.836 0.0118 *
Все еще статистически значимая разница между группой А и группой В! ☺ И мы можем даже получить (одновременные) доверительные интервалы для различий между групповыми средствами:
> confint(mod.gls.mc)
[…]
Linear Hypotheses:
Estimate lwr upr
B - A == 0 1.73669 0.01014 3.46324
C - A == 0 5.42284 2.78242 8.06325
C - B == 0 3.68615 0.66984 6.70245
Используя приблизительно (здесь точно) правильную модель, мы можем доверять этим результатам!
Обратите внимание, что для этого простого примера данные для группы C на самом деле не добавляют никакой информации о различиях между группами A и B, поскольку мы моделируем как отдельные средние, так и стандартные отклонения для каждой группы. Мы могли бы просто использовать попарные t- тесты, исправленные для нескольких сравнений:
> pairwise.t.test(d$x, d$group, pool.sd=FALSE)
Pairwise comparisons using t tests with non-pooled SD
data: d$x and d$group
A B
B 0.03301 -
C 0.00098 0.02032
P value adjustment method: holm
Однако для более сложных моделей, например, двусторонних моделей или линейных моделей с множеством предикторов, использование GLS (обобщенных наименьших квадратов) и явное моделирование функций дисперсии является лучшим решением.
И функция дисперсии не обязательно должна быть отдельной константой в каждой группе; мы можем наложить структуру на это. Например, мы можем смоделировать дисперсию как степень среднего значения каждой группы (и, следовательно, нужно оценить только один параметр, показатель степени) или, возможно, как логарифм одного из предикторов в модели. Все это очень легко с GLS (и gls()
в R).
Обобщенные наименьшие квадраты - ИМХО очень недоиспользуемая методика статистического моделирования. Вместо того, чтобы беспокоиться об отклонениях от модельных предположений, смоделируйте эти отклонения!
R
, вам может быть полезно прочитать мой ответ здесь: Альтернативы одностороннему ANOVA для гетероскедастических данных , в котором обсуждаются некоторые из этих проблем.