library("lme4")
data(Orthodont,package="nlme")
您可能需要在这里考虑两个基本问题:
-
统计:如上所述,考虑在数据集中的每个层(分组变量)上单独运行混合模型有点奇怪。通常混合模型的全部意义在于将模型拟合到组合数据集,尽管我当然可以想象例外情况(下面,我按性别拟合单独的混合模型)。您可能正在寻找类似 @987654322@ 函数(
nlme 和 lme4 都有版本),它分别在每个层上运行(广义)线性模型(非混合模型)。这更有意义,尤其是作为一种探索性技术。
-
计算:在
dplyr 框架中专门做你要求的事情有点困难,因为基本的dplyr 范式假设你正在对数据帧(或数据表)进行操作,可能是分组的,并返回数据帧。这意味着每个操作返回的位必须是数据帧(而不是例如merMod 模型对象)。 (@docendodismus 指出您可以通过在下面的代码中指定 do(model = ...) 来做到这一点,但我认为生成的对象的结构有点奇怪,并且会鼓励您重新考虑您的问题,因为如下图)
在基础 R 中,您可以这样做:
lapply(split(Orthodont,Orthodont$Sex),
lmer,formula=distance~age+(1|Subject))
或
by(Orthodont,Orthodont$Sex,
lmer,formula=distance~age+(1|Subject))
题外话:如果你想为每个主题拟合线性(非混合)模型,你可以使用
## first remove 'groupedData' attributes from the data, which don't
## work with lme4's version of lmList
Orthodont <- data.frame(Orthodont)
lmList(distance~age|Subject,Orthodont)
## note: not including Sex, which doesn't vary within subjects
返回主线程:在plyr(dplyr 的祖先)框架中,您可以更紧凑地稍微拟合单独的混合模型:
library("plyr")
dlply(Orthodont,.(Sex),
lmer,formula=distance~age+(1|Subject))
detach("package:plyr")
如果你想在plyr做,你似乎需要do()(我以为我可以不用它,但我没有找到方法),你需要创建一个返回一个函数总结为数据框。
library("dplyr")
Orthodont %>% group_by(Sex) %>%
do(lmer(.,formula=distance~age+(1|Subject)))
生产
## Error: Results are not data frames at positions: 1, 2
你可以这样做:
lmer_sum <- function(x,...) {
m <- lmer(x,...)
c(fixef(m),unlist(VarCorr(m)))
data.frame(rbind(c(fixef(m),unlist(VarCorr(m)))),
check.names=FALSE)
}
(unlist(VarCorr(m))给出了单标量随机效应的RE方差;需要整个data.frame(rbind(...))东西来将数值向量转换成单行数据框;check.names=FALSE保留列名(Intercept))
Orthodont %>% group_by(Sex) %>%
do(lmer_sum(.,formula=distance~age+(1|Subject)))
给出合理的结果。