( Обновление: Обязательно посмотрите ответ Хэдли для лучшего способа сделать это, без , прибегая к вставке строк. Мой ответ все равно будет полезен для объяснения, почемув этом случае сложнее, чем обычно.)
Особенности mcp()
требуют от вас использования подхода относительно грубой силы - склеить выражение, которое вы хотите оценить, и затем передать его через eval(parse())
,
Хитрость в том, что mcp()
интерпретирует свой первый аргумент нестандартным способом.В пределах mcp()
, x1 = 'Tukey'
не означает (как обычно) "означает присвоить значение 'Tukey'
аргументу x1
".Вместо этого все это интерпретируется как символическое описание предполагаемых контрастов.(В этом он очень похож на более привычные объекты формул, такие как y ~ x1 + x2
в вашем вызове lm()
).
for(var in c('x1', 'x2')) {
# Construct a character string with the expression you'd type at the command
# line. For example : "mcp(x1 = 'Tukey')"
exprString <- paste("mcp(", var, "='Tukey')")
# eval(parse()) it to get an 'mcp' object.
LINFCT <- eval(parse(text = exprString))
mc1 <- glht(fm1, linfct = LINFCT)
print(summary(mc1))
}