R:从自举混合效应模型结果获得系数和CI

时间:2016-09-06 21:55:58

标签: r bootstrapping lme4 coefficients

工作数据如下:

set.seed(1234)
df <- data.frame(y = rnorm(1:30), 
                 fac1 = as.factor(sample(c("A","B","C","D","E"),30, replace = T)),
                 fac2 = as.factor(sample(c("NY","NC","CA"),30,replace = T)),
                 x = rnorm(1:30))

lme模型拟合为:

library(lme4)
mixed <- lmer(y ~ x + (1|fac1) + (1|fac2), data = df)

我使用bootMer来运行参数自举,我可以成功获得固定和随机效应的系数(截距)和SE:

mixed_boot_sum <- function(data){s <- sigma(data)
c(beta = getME(data, "fixef"), theta = getME(data, "theta"), sigma = s)}

mixed_boot <- bootMer(mixed, FUN = mixed_boot_sum, nsim = 100, type = "parametric", use.u = FALSE)

我的第一个问题是如何从引导结果mixed_boot中获得两个随机效应的各个级别的系数(斜率)?

使用mixed包中的augment函数从broom模型中提取系数(斜率)没有问题,见下文:

library(broom)
mixed.coef <- augment(mixed, df)

但是,似乎broom无法处理boot类对象。我无法直接在mixed_boot上使用上述功能。

我还尝试通过添加mixed_boot_sum来修改mmList(我认为这将是我要找的),但R抱怨为:

Error in bootMer(mixed, FUN = mixed_boot_sum, nsim = 100, type = "parametric",  : 
  bootMer currently only handles functions that return numeric vectors

此外,是否可以通过指定FUN获得固定和随机效果的CI?

现在,我对FUN的正确规格感到困惑,以满足我的需求。任何有关我的问题的帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

  

我的第一个问题是如何从bootstrapping结果mixed_boot获取两个随机效应的每个单独级别的系数(斜率)?

我不确定“每个级别的系数(斜率)”是什么意思。 broom::augment(mixed, df)给出每个观察的预测(残差等)。如果你想要每个级别的预测系数,我会尝试

mixed_boot_coefs <- function(fit){
   unlist(coef(fit))
}

原始模型给出了

mixed_boot_coefs(mixed)
## fac1.(Intercept)1 fac1.(Intercept)2 fac1.(Intercept)3 fac1.(Intercept)4 
##        -0.4973925        -0.1210432        -0.3260958         0.2645979 
## fac1.(Intercept)5           fac1.x1           fac1.x2           fac1.x3 
##        -0.6288728         0.2187408         0.2187408         0.2187408 
##           fac1.x4           fac1.x5 fac2.(Intercept)1 fac2.(Intercept)2 
##         0.2187408         0.2187408        -0.2617613        -0.2617613 
##  ...

如果您想要更清楚地命名结果对象,可以使用:

flatten <- function(cc) setNames(unlist(cc),
                                outer(rownames(cc),colnames(cc),
                                      function(x,y) paste0(y,x)))

mixed_boot_coefs <- function(fit){
   unlist(lapply(coef(fit),flatten))
}

运行bootMer / confint / boot::boot.ci后,这些函数会为每个值提供置信区间(请注意,所有斜率facW.xZ在各组之间都相同因为模型只假设截距中的随机变化)。换句话说,无论您知道如何从拟合模型中提取信息(条件模式/ BLUP [ranef],预测的分组变量[coef]的每个级别的截距和斜率,参数估计[可以在fixef'中使用getMEVarCorr],随机效应差异[predict],特定条件下的预测[bootMer] ...) s FUN参数,,只要您可以将其结构展平为简单的数字向量