4

I have a mids object created from mice. I would like to recode some imputed variables and retain the mids object. I know that I could convert the mids object to "long" with complete(), but I want to keep the mids object since it has some additional uses.

Here's an example using the nhanes dataset. Running mice() creates 5 imputed datasets for the variables in nhanes. I'm focusing on hyp.

library(mice)
names(nhanes)
nhanes$hyp
#[1] NA  1  1 NA  1 NA  1  1  1 NA NA NA  1  2  1 NA  2  2 1  2 NA  1  1  1  
imp <- mice(nhanes, print = FALSE)
imp$imp$hyp
# 1 2 3 4 5
# 1  1 1 1 1 1
# 4  2 1 1 2 2
# 6  1 1 1 1 1
# 10 1 1 1 1 1
# 11 1 1 2 1 1
# 12 1 1 1 1 2
# 16 1 1 2 1 1
# 21 1 1 2 1 1

How could I recode the imputed hyp values inside the mids object imp (e.g., 1's become 5's).

My only ideas thus far involves converting imp to long, extracting the variables of interest into a new dataframe, recoding, converting the new dataframe via as.mids, then putting back into imp via cbind.mids().

imp_long <- complete(imp, "long", include=T)
hyp <- imp_long[, "hyp"]
hyp2 <- hyp
hyp2[hyp2==1] <- 5
hyp4mids <- data.frame(.imp = rep(0:5, each = nrow(nhanes)),
                       .id = rep(1:nrow(nhanes), times = 6),
                       hyp2,
                       TMP = NA)
hyp4mids <- as.mids(hyp4mids, .imp = 1, .id = 2)
hyp4mids$chainMean <- hyp4mids$chainVar <- array(NA, dim = c(2, 25, 5),
                                                 dimnames = list(
                                                   c("hyp2", "TMP"),
                                                   1:25,
                                                   paste0("Chain ", 1:5)))
imp2 <- cbind.mids(imp, hyp4mids)
imp2$imp$hyp2
# 1 2 3 4 5
# 1  5 5 5 5 5
# 4  2 5 5 2 2
# 6  5 5 5 5 5
# 10 5 5 5 5 5
# 11 5 5 2 5 5
# 12 5 5 5 5 2
# 16 5 5 2 5 5
# 21 5 5 2 5 5

It works, but I think I should be able to modify hyp in the imp mids object directly.

Eric Green
  • 7,385
  • 11
  • 56
  • 102
  • Possible duplicate of [Perform operation on each imputed dataset in R's MICE](http://stackoverflow.com/questions/26667162/perform-operation-on-each-imputed-dataset-in-rs-mice) – wjchulme Apr 11 '16 at 13:01

1 Answers1

5

It appears that the trick is to modify $data and $imp:

imp <- mice(nhanes, print = FALSE)
l1 <- complete(imp, "long") 
table(l1$hyp)
# 1  2 
#92 33 

imp$data$hyp[imp$data$hyp==1] <- 5
imp$imp$hyp[imp$imp$hyp==1] <- 5
l2 <- complete(imp, "long")
table(l2$hyp)
# 2  5 
#33 92 
Eric Green
  • 7,385
  • 11
  • 56
  • 102
  • Yes, that works, but it is a little hacky and requires you to change the data at two places. It might be easier to recode `nhanes$hyp` before calling `mice()`. – Stef van Buuren Jul 19 '23 at 20:41