使用带有聚类数据的多重插补技术

6

我正在使用 mice 包来填充缺失的数据。我对填充缺失值还不熟悉,所以在这方面遇到了困难。以下是一个玩具示例:

library(mice)
# Using nhanes dataset as example
df1 <- mice(nhanes, m=10)

因此,您可以看到我使用大多数默认设置10次输入了df1,并且我可以在回归模型、汇总结果等方面使用这个结果。然而,在我的现实数据中,我有来自不同国家的调查数据。因此,缺失的水平因国家而异,特定变量的值也因国家而异,例如年龄、教育水平等。因此,我希望对缺失值进行插补,并允许按国家进行聚类。因此,我将创建一个分组变量,其中没有缺失(当然,在这个玩具示例中,与其他变量的相关性是缺失的,但在我的真实数据中,它们存在)。
# Create a grouping variable
nhanes$country <- sample(c("A", "B"), size=nrow(nhanes), replace=TRUE)

那么我该如何告诉mice()这个变量与其他变量不同 - 即它是多级数据集中的一个层级?


1
在每个因子水平上运行“mice”是否是一个好的解决方法?例如,“mice(nhanes [which(nhanes $ country =='A'),],m = 10)”,然后循环处理因子或使用您喜欢的R的groupby操作?当然,这假设为了对国家“A”的数据进行插补,不需要其他国家,即它们是独立的。 - Gene Burinsky
是的,我确实尝试过这个 - 并且有一个函数可以合并数据集'rbind.mids()' - 但我发现这个函数给了我很多警告和错误,我无法解决。最终,我认为识别数据结构进行插补会更好。感谢您的建议。 - user2498193
2个回答

6
如果您想到了“混合效应”模型中的聚类,那么您应该使用 mice 提供的面向聚类数据的方法。这些方法可以在手册中找到,并且通常以2l.something为前缀。 mice 中针对聚类数据的方法种类有些有限,但我可以推荐在较低级别单元缺失数据时使用 2l.pan,在集群级别使用 2l.only.norm
作为混合效应模型的替代方案,您可以考虑使用哑变量来表示聚类结构(即每个聚类一个哑变量)。当从混合效应模型的角度思考聚类时,这种方法并不理想,因此如果您想进行混合效应分析,请尽可能坚持使用混合效应模型。
下面,我将展示两种策略的示例。
准备工作:
library(mice)
data(nhanes)

set.seed(123)
nhanes <- within(nhanes,{
  country <- factor(sample(LETTERS[1:10], size=nrow(nhanes), replace=TRUE))
  countryID <- as.numeric(country)
})

案例1:使用混合效应模型进行填充

本节使用2l.pan来填充具有缺失数据的三个变量。请注意,我将clusterID作为聚类变量,并在预测矩阵中指定了-2。对于所有其他变量,我仅分配固定效应(1)。

# "empty" imputation as a template
imp0 <- mice(nhanes, maxit=0)
pred1 <- imp0$predictorMatrix
meth1 <- imp0$method

# set imputation procedures
meth1[c("bmi","hyp","chl")] <- "2l.pan"

# set predictor Matrix (mixed-effects models with random intercept
# for countryID and fixed effects otherwise)
pred1[,"country"] <- 0     # don't use country factor
pred1[,"countryID"] <- -2  # use countryID as cluster variable
pred1["bmi", c("age","hyp","chl")] <- c(1,1,1)  # fixed effects (bmi)
pred1["hyp", c("age","bmi","chl")] <- c(1,1,1)  # fixed effects (hyp)
pred1["chl", c("age","bmi","hyp")] <- c(1,1,1)  # fixed effects (chl)

# impute
imp1 <- mice(nhanes, maxit=20, m=10, predictorMatrix=pred1, method=meth1)

案例2:使用虚拟指标(DIs)对集群进行插补

本节使用pmm进行插补,且聚类结构以“临时”方式表示。也就是说,聚类并不是由随机效应表示,而是由固定效应表示。这可能会夸大具有缺失数据的变量的聚类级别的变异性,因此在使用时请确保您知道自己在做什么。

# create dummy indicator variables
DIs <- with(nhanes, contrasts(country)[country,])
colnames(DIs) <- paste0("country",colnames(DIs))
nhanes <- cbind(nhanes,DIs)


# "empty" imputation as a template
imp0 <- mice(nhanes, maxit=0)
pred2 <- imp0$predictorMatrix
meth2 <- imp0$method

# set imputation procedures
meth2[c("bmi","hyp","chl")] <- "pmm"

# for countryID and fixed effects otherwise)
pred2[,"country"] <- 0     # don't use country factor
pred2[,"countryID"] <- 0   # don't use countryID
pred2[,colnames(DIs)] <- 1 # use dummy indicators
pred2["bmi", c("age","hyp","chl")] <- c(1,1,1)  # fixed effects (bmi)
pred2["hyp", c("age","bmi","chl")] <- c(1,1,1)  # fixed effects (hyp)
pred2["chl", c("age","bmi","hyp")] <- c(1,1,1)  # fixed effects (chl)

# impute
imp2 <- mice(nhanes, maxit=20, m=10, predictorMatrix=pred2, method=meth2)

如果您想了解这些方法的详细信息,请查看其中之一其中两篇论文


嗨,SimonG。非常好的答案,谢谢你,它帮了我很多!这比包参考更有帮助,让我更好地理解了。然而,我还有一个问题。在情况1中,为什么您使用-2来表示集群变量,而不是+2?-2和+2之间有什么区别-在帮助文件中没有解释。 - user2498193
1
手册(第47页)中解释了2l.pantype参数。 type参数描述了mice如何理解预测矩阵(pred1)中的行。在所有两级函数中,由“-2”表示的变量被解释为群集变量。那些带有“1”的被理解为具有固定效应的预测变量,“2”作为具有随机效应的预测变量。代码“3”和“4”的工作方式类似于“1”和“2”,不同之处在于计算并包括群集平均值作为附加预测变量。 - SimonG
啊,太棒了,谢谢你提醒我。非常感谢你的帮助! - user2498193

1
你需要设置一个predictorMatrix告诉模型使用哪个变量来预测另一个变量。一种快速的方法是使用predictorM<-quickpred(nhanes)。然后,如果它是正常变量,将矩阵中的1改为2,如果它是不同国家的二级变量,则将其改为-2,并将其作为predictorMatrix =predictorM提交给mice命令。在method命令中,现在必须将方法设置为2l.norm(如果是度量变量)或2l.binom(如果是二元变量)。对于后者,您需要使用Sabine Zinn编写的函数(https://www.neps-data.de/Portals/0/Working%20Papers/WP_XXXI.pdf)。不幸的是,我不知道是否有用于两级计数数据的插补方法存在。 请注意,对多层次数据集进行插补会大大减慢过程。根据我的经验,在保持数据的分层结构方面,重采样方法如PMM或Baboon包效果很好,并且使用起来更快。

谢谢你的回答。我不太明白如何将其更改为2和-2 - 我需要更改哪些单元格(从函数帮助文件中也不清楚)。那么,方法2l.norm2l.binom - 这些是我需要为我正在输入的数据框中的每个变量设置的吗?关于'PMM' - 那不是'mice'命令的一部分吗? - user2498193
1
请不要使用2l.norm。该函数仍存在错误,目前还没有人来修复它。对于聚类数据中的连续变量,应使用2l.pan方法。 - SimonG
2
提供者提供了一个示例数据集,如果您能提供一个针对该示例数据的编码表示,而不仅仅是在“伪代码语言”中讲解解决方案,那么这个答案将会得到很大的改善。 - alexwhitworth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接