Передача строк в аргумент 'контрасты' lme / lmer - PullRequest
0 голосов
/ 10 октября 2018

Я пишу подпрограмму для возврата результатов продольных моделей со смешанными эффектами.Я хочу иметь возможность передавать элементы из списков переменных в lme/lmer в качестве переменных результата и предиктора.Я также хотел бы иметь возможность указывать контрасты в этих моделях смешанных эффектов, однако у меня возникают проблемы с получением аргумента contrasts() для распознавания строк как имен переменных, указанных в спецификации модели в рамках того же вызова lme/lme4.

Вот некоторые игрушечные данные,

set.seed(345)
A0 <- rnorm(4,2,.5)
B0 <- rnorm(4,2+3,.5)
A1 <- rnorm(4,6,.5)
B1 <- rnorm(4,6+2,.5)
A2 <- rnorm(4,10,.5)
B2 <- rnorm(4,10+1,.5)
A3 <- rnorm(4,14,.5)
B3 <- rnorm(4,14+0,.5)
score <- c(A0,B0,A1,B1,A2,B2,A3,B3)
id <- rep(1:8,times = 4, length = 32)
time <- factor(rep(0:3, each = 8, length = 32))
group <- factor(rep(c("A","B"), times =2, each = 4, length = 32))
df <- data.frame(id = id, group = group, time = time,  score = score)

Теперь следующий вызов lme работает просто отлично, с заданными контрастами (я знаю, что это по умолчанию, так что все это чисто педагогическое).

mod <- lme(score ~ group*time, random = ~1|id, data = df, contrasts = list(group = contr.treatment(2), time = contr.treatment(4)))

Следующее также работает, передавая строки как имена переменных в lme с помощью функции reformulate().

t <- "time"
g <- "group"
dv <- "score"

mod1R <- lme(reformulate(paste0(g,"*",t), response = "score"), random = ~1|id, data = df)

Но если я хочу указать контрасты, как вВ первом примере он не работает

mod2R <- lme(reformulate(paste0(g,"*",t), response = "score"), random = ~1|id, data = df, contrasts = list(g = contr.treatment(2), t = contr.treatment(4)))

# Error in `contrasts<-`(`*tmp*`, value = contrasts[[i]]) : contrasts apply only to factors

Как мне получить lme, чтобы распознать, что строки, указанные в аргументе contrasts, ссылаются на переменные, переданные в функцию reformulate()?

1 Ответ

0 голосов
/ 10 октября 2018

Вы должны иметь возможность использовать setNames() в списке контрастов, чтобы применить полные имена к списку:

# Using a %>% pipe so need to load magrittr
library(magrittr)

mod2R <- lme(reformulate(paste0(g,"*",t), response = "score"), 
             random = ~1|id, 
             data = df, 
             contrasts = list(g = contr.treatment(2), t = contr.treatment(4)) %>%
                 setNames(c(g, t))
             )
...