首页 > 解决方案 > 合并估算和非估算数据

问题描述

我有一个关于在多重插补后合并数据集的问题。我创建了一个示例来解释我的问题:

id <- c(1,2,3,4,5,6,7,8,9,10)
age <- c(60,NA,90,55,60,61,77,67,88,90)
bmi <- c(30,NA,NA,23,24,NA,27,23,26,21)
time <- c(62,88,85,NA,68,62,89,62,70,99)
dat <- data.frame(id, age, bmi, time)
dat

id <- c(1,2,3,4,5,6,7,8,9,10)
m1 <- c(60,78,90,55,60,61,77,67,88,90)
m2 <- c(30,44,35,23,24,22,27,23,26,21)
m3 <- c(62,88,85,78,68,62,89,62,70,99)
dat2 <- data.frame(id, m1, m2, m3)
dat2

我有两个数据集,dat 和 dat2。数据集 dat 包含缺失的变量,所以我使用多重插补来插补这个数据集(包 MICE):

library(mice)
impdat <- mice(dat, maxit = 0)
methdat <- impdat$method
preddat <- impdat$predictorMatrix
preddat["id",] <- 0
preddat[,"id"] <- 0
impdat <- mice(dat, method = methdat, predictorMatrix = preddat, seed =         
2018, maxit = 10, m = 5)

现在我想将估算的数据集 impdat 与数据集 dat2 合并。但那是我的问题出现了。我尝试了以下方法:

completedat <- complete(impdat, include = T, action = 'long')
finaldat <- merge(completedat, dat2, by = "id")

finaldat <- as.mids(finaldat)
  Error in `[<-.data.frame`(`*tmp*`, j, value = c(61, 88)) : replacement has 2 rows, data has 1  

但是,这给了我一条错误消息。合并成功,因为完成的数据框是我想要的。问题是我无法将它转换回 mids 对象。

我知道我可以一一添加来自 dat2 的变量。这确实有效:

completedat <- complete(impdat, include = T, action = 'long')
completedat$m1 <- dat2$m1
finaldat2 <- as.mids(completedat)

在这个例子中,这没关系,因为 dat2 只有 4 个变量。在我的真实数据中,我有大约 200 个变量要添加到我的多个估算数据集中,因此我希望有一种更简单的方法可以将所有这些变量添加到我的估算数据集中。有人可以帮助我吗?

标签: rmerger-mice

解决方案


我遇到了同样的问题。就我而言,我的估算数据集和非估算数据集之间的观察数量不同。为了解决这个问题,在我合并数据后,我重新编码了变量.id。调用和时mice输出包。这与您的数据框变量不同,但它们应通过以下代码相互对应。 .idmicecomplete(..., action = 'long')id

library(dplyr)
# recode .id based on value of id
mydata <- mutate(mydata, .id = as.numeric(as.factor(id)))
# this step is important according to the mice manual
mydata <- mydata[order(mydata$.imp, mydata$.id),]

as.mids当我应用此重新编码时,该功能对我有用,我希望它也对你有用。


推荐阅读