Объединить вмененные и не вмененные данные - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть вопрос об объединении наборов данных после многократного вменения. Я создал пример, чтобы объяснить мою проблему:

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. В наборе данных содержатся отсутствующие переменные, поэтому я использую несколько вменений для вменения этого набора данных (пакет 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  

Однако, это дает мне сообщение об ошибке. Объединение прошло успешно, потому что законченный кадр данных - это то, что я хочу. Проблема в том, что я не могу преобразовать его обратно в объект среднего уровня.

Я знаю, что могу добавить переменные из dat2 одну за другой. Это работает:

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

В этом примере это нормально, потому что dat2 имеет только 4 переменные. В моих реальных данных у меня есть приблизительно 200 переменных, которые я хочу добавить в свой множественный вмененный набор данных, поэтому я надеюсь, что есть более простой способ добавить все эти переменные в мой вмененный набор данных. Кто-нибудь может мне помочь?

Ответы [ 2 ]

0 голосов
/ 25 июля 2019

Я испытал эту же проблему. В моем случае у меня было разное количество наблюдений между моими вмененными и не вменяемыми наборами данных. Чтобы это исправить, после объединения данных я перекодировал переменную .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 сработала для меня, когда я применил этот перекодировку, и я надеюсь, что она работает и для вас.

0 голосов
/ 16 ноября 2018

Не будет 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

...