Как использовать символ в качестве атрибута функции - PullRequest
4 голосов
/ 09 декабря 2011

Я хочу запустить анализ множественных сравнений для различных переменных модели.Моя идея заключается в следующем:

library(multcomp)
set.seed(123)
x1 <- gl(4,10)
x2 <- gl(5,2,40)
y <- rnorm(40)

fm1 <- lm(y ~ x1 + x2)

for(var in c('x1', 'x2'))
{
mc1 <- glht(fm1, linfct=mcp(var='Tukey'))
print(summary(mc1))
}

При запуске я получаю следующую ошибку: <pre>Error en mcp2matrix(model, linfct = linfct) : Variable(s) ‘var’ have been specified in ‘linfct’ but cannot be found in ‘model’!

То есть невозможно использовать символ дляатрибут функции mcp.Кто-нибудь знает решение?

Ответы [ 3 ]

13 голосов
/ 11 декабря 2011

Обычно лучше избегать работы со строками, представляющими код, где это возможно - это предотвращает ошибки, которые трудно отладить, и эстетически намного элегантнее.Эту проблему довольно легко решить, если вы используете do.call и функцию setNames:

var <- "x1"
cmp <- do.call(mcp, setNames(list("Tukey"), var))
glht(fm1, linfct = cmp)

Здесь вы не можете использовать substitute, поскольку она не позволяет вам изменять именапараметров функции.У меня есть некоторая интуиция, объясняющая, почему это разумно, но недостаточно для объяснения:быть доступным программно, не перепрыгивая через обручи.

3 голосов
/ 09 декабря 2011

( Обновление: Обязательно посмотрите ответ Хэдли для лучшего способа сделать это, без , прибегая к вставке строк. Мой ответ все равно будет полезен для объяснения, почемув этом случае сложнее, чем обычно.)

Особенности 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))
}
2 голосов
/ 09 декабря 2011

Вы пробовали: eval(parse(text='variable')) или assign?

...