В качестве начального примечания, если оно не было изменено, чтобы получить правильные результаты для суммы квадратов типа III, необходимо установить контрастное кодирование для факторных переменных. Это можно сделать внутри вызова lm
или с помощью options
. В приведенном ниже примере используется options
.
Я бы с осторожностью использовал HSD.test
и аналогичные функции с несбалансированными конструкциями, если в документации не рассматривается их использование в этих ситуациях. В документации на TukeyHSD
упоминается, что она настраивается для «слегка несбалансированных» конструкций. Я не знаю, обрабатывает ли HSD.test
вещи по-другому. Вам нужно будет проверить дополнительную документацию для пакета или исходную ссылку, указанную для функции.
В качестве примечания, заключив в скобки целую функцию HSD.test
, вы сможете распечатать результаты. См. Пример ниже.
В общем, я бы рекомендовал отказаться от Tukey.HSD
и подобных функций и использовать гибкие пакеты emmeans
(née lsmeans
) или multcomp
для всех ваших сравнительных нужд. emmeans
особенно полезен для выполнения среднего разделения на взаимодействиях или для изучения контрастов между обработками .
При несбалансированном дизайне вы можете сообщить о средстве Е.М. (или L.S.) вместо арифметического. См. SAEPER: Что такое метод наименьших квадратов? . Обратите внимание, что в приведенном ниже примере предельные средние значения, сообщаемые emmeans
, отличаются от значений, указанных в HSD.test
.
Также обратите внимание, что "Tukey" в glht
не имеет никакого отношения к сравнениям Tukey HSD или Tukey-скорректированным; он просто устанавливает контрасты для всех парных тестов, как говорится в выходных данных.
Однако функции adjust="tukey"
в emmeans
означают использование скорректированных по Тьюки сравнений, как говорится в выходных данных.
Следующий пример частично адаптирован из ARCHBS: односторонняя Anova .
if(!require(car)){install.packages("car")}
library(car)
data(mtcars)
mtcars$cyl.f = factor(mtcars$cyl)
mtcars$carb.f = factor(mtcars$carb)
options(contrasts = c("contr.sum", "contr.poly"))
model = lm(mpg ~ cyl.f + carb.f, data=mtcars)
library(car)
Anova(model, type="III")
if(!require(agricolae)){install.packages("agricolae")}
library(agricolae)
(HSD.test(model, "cyl")$groups)
if(!require(emmeans)){install.packages("emmeans")}
if(!require(multcompView)){install.packages("multcompView")}
library(emmeans)
library(multcompView)
marginal = emmeans(model,
~ cyl.f)
pairs(marginal, adjust="tukey")
cld(marginal, adjust="tukey", Letters=letters)
if(!require(multcomp)){install.packages("multcomp")}
library(multcomp)
mc = glht(model,
mcp(cyl.f = "Tukey"))
summary(mc, test=adjusted("single-step"))
multcomp::cld(mc)