4
$\begingroup$

I'm trying to use mice package to do imputations, I'm pretty new to all of this. I have 9 continuous variables and I used the following code to impute, using the 'cart' (Classification and regression trees) method:

imp <- mice(incomplete.data, method="cart", m=10, maxit=20, seed=456, 
            pred=quickpred(incomplete.data, method="spearman"))

All imputations look fine, except two: '2' and '8' (see density plots below). I am puzzled why these two do not perform well and what could be done to improve them.

Initially I tried to use the default 'pmm' method for all of the imputations. However I got the following error code:

Error in solve.default(xtx + diag(pen)) : system is computationally singular: 
 reciprocal condition number = 1.83676e-18'

This is why I switched to the method 'cart'. Any ideas how to improve this please? I'm stuck.

enter image description here

$\endgroup$
5
  • $\begingroup$ Perhaps you could edit your question to tell us what the two methods you are using are? $\endgroup$
    – mdewey
    Commented Feb 26, 2018 at 16:57
  • $\begingroup$ Methods are in the code. The first method, that failed, was 'pmm'. Then I tried 'cart' which worked fine except for the two variables. Does that make sense? $\endgroup$
    – user196772
    Commented Feb 26, 2018 at 16:59
  • $\begingroup$ No it does not. What does pmm involve? What does cart involve? There is a danger that this would be closed as off-topic as asking about R code but you probably do have a statistical question too. The chances of someone answering that is improved if the question is thrown open to people who do not use MI by chained equation solely in R $\endgroup$
    – mdewey
    Commented Feb 26, 2018 at 17:03
  • $\begingroup$ I understand, apologies. 'pmm' = predictive mean matching 'cart' = Classification and regression trees $\endgroup$
    – user196772
    Commented Feb 26, 2018 at 17:28
  • $\begingroup$ Check the variables that you're using as predictors. I had this error when using complete (i.e. no missingness) as predictor that were not strictly continuous. Once I took them out the imputations ran fine $\endgroup$
    – lloyds
    Commented Apr 15, 2019 at 15:52

1 Answer 1

3
$\begingroup$

Based on your plots, you can not say which of the distributions are correct or wrong. These kind of plots are usually used to see whether the multiple imputations lead to similar imputed values (i.e. when the red lines of one plot would be completely different from each other, your imputation might be too unstable).

The difference of the red and blue lines in plot 2 and 8 might result from the response mechanism of your data. Consider the following example in R:

set.seed(3456789) # Reproducible example
N <- 1000 # Sample size

y_all <- rnorm(N, 10, 2) # Dependent variable
x1 <- y_all + rnorm(N, 0, 5) # Predictor 1
x2 <- y_all + rnorm(N, 20, 2) # Predictor 2
x3 <- y_all + rnorm(N, 5, 3) # Predictor 3
x4 <- y_all + rnorm(N, 15, 10) # Predictor 4
x5 <- y_all + rnorm(N, 10, 3) # Predictor 5

# Insert missing values according the response mechanism Missing At Random (MAR)
y_obs <- y_all
y_obs[(x1 + x2 + x3 + x4 + x5) > mean(x1 + x2 + x3 + x4 + x5)] <- NA # Observed values of Y
y_miss <- y_all[is.na(y_obs)] # Missing values of Y (for comparison)

# Plot observed and missing Values of Y
# This is only possible because we know the missing values - impossible in real life
plot(density(y_all), 
     xlim = c(2.5, 17.5), 
     ylim = c(0, 0.4), 
     xlab = "Y", 
     main = "Observed and Missing Values of Y", 
     lwd = 2)
lines(density(y_obs[!is.na(y_obs)]), 
      col = "cornflowerblue", 
      lwd = 2)
lines(density(y_miss), 
      col = "firebrick3", 
      lwd = 2)
legend("topleft", 
       c("All", "Observed", "Missing"), 
       lty = 1, 
       col = c(1, "cornflowerblue", "firebrick3"))

incomplete.data <- data.frame(y_obs, x1, x2, x3, x4, x5) # Create data.frame

enter image description here

# Impute data with your specifications
library("mice")

# Apply mice function
imp <- mice(incomplete.data,
            method = "cart", 
            pred = quickpred(incomplete.data, method = "spearman"), 
            m = 10, 
            maxit = 20, 
            seed = 456)

# Density plot of observed and imputed values
densityplot(imp, xlim = c(2.5, 17.5), ylim = c(0, 0.4))

enter image description here

In the second graphic you can see that the imputed values are very different from the observed values. However, they are much closer (i.e. much better) to the missing values that are indicated by the red line in the first graphic. In other words, by imputing different/higher values compared to your observed values, you are reducing bias (which is exactly what you want).

To get back to your example: You should evaluate whether it is logical from a theoretical viewpoint that the imputed values of plots 2 and 8 are higher than the observed values.

Furthermore, I would encourage you to investigate why your code has problems with pmm, since predictive mean matching is usually better than cart.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.