MICE纵向多级插补模型的随机效应

lle*_*lls 10 r mixed-models r-mice

我试图用纵向设计来估算数据集中的数据.有两个预测因子(实验组和时间)和一个结果变量(分数).聚类变量是id.

这是玩具数据

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 <- rep(0:3, each = 8, length = 32)
group <- rep(c("A","B"), times =2, each = 4, length = 32)
df <- data.frame(id = id, group = group, time = time,  score = score)

# plots
(ggplot(df, aes(x = time, y = score, group = group)) + 
    stat_summary(fun.y = "mean", geom = "line", aes(linetype = group)) +
    stat_summary(fun.y = "mean", geom = "point", aes(shape = group), size = 3) +
    coord_cartesian(ylim = c(0,18)))

# now place some NAs
df[sample(1:nrow(df), 10, replace = F),"score"] <- NA

df
Run Code Online (Sandbox Code Playgroud)

如果我没有理解这个帖子正确,在预测矩阵我应该指定id一个聚类变量-2和两个固定的预测time,并group1.像这样

library(mice)

(ini <- mice(df, maxit=0))
(pred <- ini$predictorMatrix)
(pred["score",] <- c(-2, 1, 1, 0))
(imp <- mice(df, 
            method = c("", "", "", "2l.pan"),
            pred = pred, 
            maxit = 1, 
            seed = 71152))
Run Code Online (Sandbox Code Playgroud)

我想知道的是:

  1. 这是纵向随机截取插补模型吗?指定id变量-2将其指定为"类"变量,但是在这个小鼠引物中,它建议对于多级模型,你应该1在数据帧中创建一个所有的变量作为常量,然后将其指定为随机截取通过2在预测矩阵中.然而(i)这是基于2l.norm功能而不是2l.pan功能,所以我不确定我在哪里.该2l.pan功能是否不需要此列或随机效果的规范?
  2. 有没有办法指定纵向随机斜率模型,如果是这样,如何?

Mat*_* L. 6

pan库不需要拦截术语.

你可以使用挖掘功能

library(pan)
?pan
Run Code Online (Sandbox Code Playgroud)

也就是说,在加载了库的情况下mice使用了一个包装器,你可以查看该功能的帮助.它指出:它有一个参数叫做这是它默认为true.默认情况下,这被定义为随机拦截.在浏览鼠标包装器的R代码后找到了这个:mice.impute.2l.panmiceintercept[a] Logical [and] determin[es] whether the intercept is automatically added.

if (intercept) { x <- cbind(1, as.matrix(x)) type <- c(2, type) }

pan函数参数type是一个Vector of length ncol(x) identifying random and class variables.截距默认添加并定义为随机效果.

他们确实提供了例如你在固定效果预测矩阵中用"x"表示1的例子.

它还声明2l.norm,The random intercept is automatically added in mice.impute.2l.norm().

它有一些描述的例子. CRAN文档pan可能对您有所帮助.


Sim*_*onG 5

这个答案对你来说可能有点晚了,但它可能会帮助一些未来阅读这篇文章的人:

如何与 2l.pan

以下是有关使用 指定多级插补模型的一些详细信息mice。由于应用程序是纵向的,我使用术语“人员”来指代级别 2 的单位。这些是文档中2l.pan提到的最相关的参数mice

type

ncol(x)识别随机变量和类变量的长度向量。随机效应由 标识2。组变量(只允许一个)被编码为-2. 随机效应还包括固定效应。如果对于协变量X1组,应计算均值并将其包括为进一步的固定效应选择3。除了 中的效应3,规范4还包括 的随机效应 X1

您可以在预测变量矩阵中使用 5 种不同的代码,用于用 估算的变量2l.pan。人员标识符编码为-2(这与 不同2l.norm)。为了包括具有固定或随机效应的预测变量,这些变量分别用1或编码2。如果编码为2,则自动包含相应的固定效应。

此外,2l.pan提供代码3and 4,它们与and具有相似的含义12但将包括对该变量的个人均值的附加固定效应。如果您尝试对时变预测变量的人内和人际效应进行建模,这将非常有用。

intercept

逻辑判断是否自动添加拦截。

默认情况下,2l.pan包括作为固定和随机效果的截距。因此,不需要在预测矩阵中包含常数项。如果设置为intercept=FALSE,则此行为会更改,并且从插补模型中删除截距。

groupcenter.slope

如果TRUE,在组均值(type34)的情况下,这些预测变量的组均值在进行插补之前进行。默认为FALSE

使用此选项,可以将预测变量集中在人的均值周围,而不是“按原样”包括预测变量(即,不居中)。这仅适用于编码为3or 的变量4。对于编码为 的预测变量3,这不是很重要,因为有中心和没有中心的模型是相同的。

然而,当预测变量被编码为4(即具有随机斜率)时,中心化会改变随机效应的含义,因此随机斜率不再适用于“原样”变量,而是适用于该变量的内部偏差多变的。


在您的示例中,您可以包含一个简单的随机斜率,time如下所示:

library(mice)
ini <- mice(df, maxit=0)

# predictor matrix (following 'type')
pred <- ini$predictorMatrix
pred["score",] <- c(-2, 1, 2, 0)

# imputation method
meth <- c("", "", "", "2l.pan")

imp <- mice(df, method=meth, pred=pred, maxit=10, m=10)
Run Code Online (Sandbox Code Playgroud)

在这个例子中,编码time3or4没有多大意义,因为人的意思time对于所有人来说都是相同的。但是,如果您希望将时变协变量作为预测变量包含在插补模型中,3并且4可能会很有用。

intercept和等附加参数groupcenter.slope可以直接在对 的调用中指定mice(),例如:

imp <- mice(df, ..., groupcenter.slope=TRUE)
Run Code Online (Sandbox Code Playgroud)

关于您的问题

因此,按照帖子中的说明回答您的问题:

  1. 是的,2l.pan提供了一个多级(或者更确切地说是两级)插补模型。默认情况下,截距作为固定和随机效应包含在内(可以用 更改intercept=FALSE)并且不需要在预测矩阵中指定(这与 形成对比2l.norm)。

  2. 是的,您可以使用 指定随机斜率2l.pan。为此,具有随机斜率的预测变量被编码为24在预测变量矩阵中。如果编码为2,则包括随机斜率。如果编码为4,则包括随机斜率以及该变量的个人均值的附加固定效应。如果编码为4,随机斜率的含义可以通过使用groupcenter.slope=TRUE(见上文)来改变。

本文还包括一些关于如何使用2l.pan多重插补和其他函数的工作示例:[链接]