合并估算和非估算数据

时间:2018-11-16 13:11:19

标签: r merge r-mice

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

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个要添加到多个估算数据集中的变量,因此我希望有一种更简便的方法将所有这些变量添加到估算数据集中。有人可以帮我吗?

2 个答案:

答案 0 :(得分:0)

如果您想合并估算数据和非估算数据,cbind是否可以工作?

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

# install.packages("mice")
library(mice)
impdat <- mice(dat, 
               seed = 2018, 
               maxit = 10, 
               m = 5)
impdat
# Class: mids
# Number of multiple imputations:  5 
# Imputation methods:
#   id   age   bmi  time 
# "" "pmm" "pmm" "pmm" 
# PredictorMatrix:
#   id age bmi time
# id    0   1   1    1
# age   1   0   1    1
# bmi   1   1   0    1
# time  1   1   1    0

impdat = complete(impdat)
impdat

# id age bmi time
# 1   1  60  30   62
# 2   2  60  24   88
# 3   3  90  24   85
# 4   4  55  23   89
# 5   5  60  24   68
# 6   6  61  24   62
# 7   7  77  27   89
# 8   8  67  23   62
# 9   9  88  26   70
# 10 10  90  21   99

final_data = cbind(impdat, dat2)
final_data
# id age bmi time id m1 m2 m3
# 1   1  60  30   62  1 60 30 62
# 2   2  60  24   88  2 78 44 88
# 3   3  90  24   85  3 90 35 85
# 4   4  55  23   89  4 55 23 78
# 5   5  60  24   68  5 60 24 68
# 6   6  61  24   62  6 61 22 62
# 7   7  77  27   89  7 77 27 89
# 8   8  67  23   62  8 67 23 62
# 9   9  88  26   70  9 88 26 70
# 10 10  90  21   99 10 90 21 99

enter image description here

答案 1 :(得分:0)

我遇到了同样的问题。就我而言,在我估算和未估算的数据集之间有不同数量的观察结果。为了解决这个问题,在合并数据之后,我随后重新编码了变量.id。当您调用mice.id时,mice包将输出complete(..., 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函数对我有用,我希望它也对您有用。