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

如果我正确理解这篇文章,在预测器矩阵中,我应该用-2指定id聚类变量,用1指定两个固定预测变量timegroup。这样

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))

我想知道的是:

  1. 这是一个纵向随机截距插补模型吗?将id变量指定为-2将其指定为"类"变量,但在此鼠标入门中,它建议对于多级模型,您应该在数据帧中创建一个所有1变量作为常量,然后将其指定为通过预测器矩阵中的2随机截距。但是,这是基于2l.norm函数而不是2l.pan函数,所以我不太确定我在这里的位置。2l.pan函数是否不需要此列或随机效应的规范?
  2. 有没有办法指定纵向随机斜率模型,如果是,如何指定?

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

如何使用2l.pan

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

type

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

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

此外,2l.pan还提供了代码34,它们与12的含义相似,但将包括该变量的人均值的额外固定效应。如果您尝试对时变预测变量的人事内效应和人与人之间的效应进行建模,这将非常有用。

intercept

逻辑确定是否自动添加截距。

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

groupcenter.slope

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

使用此选项,可以将预测变量集中在人员均值周围,而不是"按原样"包含预测变量(即不居中)。这仅适用于编码为34的变量。对于编码为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)

在此示例中,将time编码为34没有多大意义,因为time的人的手段对于所有人都是相同的。但是,如果您有要作为预测变量包含在插补模型中的时变协变量,则34可能很有用。

interceptgroupcenter.slope这样的附加参数可以直接在调用mice()中指定,例如:

imp <- mice(df, ..., groupcenter.slope=TRUE)

关于您的问题

因此,要回答您的问题,如帖子中所述:

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

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

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

pan库不需要截距项。

您可以使用以下方法深入研究该函数

library(pan)
?pan

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

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

其中pan函数参数type是一个Vector of length ncol(x) identifying random and class variables。默认情况下,截距被添加并定义为随机效应。

他们确实提供了一些示例,就像您在固定效应的预测矩阵中用 1 表示"x"一样。

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

它有几个带有描述的示例。pan的CRAN文档可能会对您有所帮助。

最新更新