Vous n'avez pas d'autre choix que d'imputer les valeurs ou de changer de modèle. Un bon choix pourrait être aregImpute dans le paquet Hmisc. Je pense que c'est moins lourd que rfimpute qui est ce qui vous retient, premier exemple de package (il y en a d'autres):
# Check that aregImpute can almost exactly estimate missing values when
# there is a perfect nonlinear relationship between two variables
# Fit restricted cubic splines with 4 knots for x1 and x2, linear for x3
set.seed(3)
x1 <- rnorm(200)
x2 <- x1^2
x3 <- runif(200)
m <- 30
x2[1:m] <- NA
a <- aregImpute(~x1+x2+I(x3), n.impute=5, nk=4, match='closest')
a
matplot(x1[1:m]^2, a$imputed$x2)
abline(a=0, b=1, lty=2)
x1[1:m]^2
a$imputed$x2
# Multiple imputation and estimation of variances and covariances of
# regression coefficient estimates accounting for imputation
# Example 1: large sample size, much missing data, no overlap in
# NAs across variables
x1 <- factor(sample(c('a','b','c'),1000,TRUE))
x2 <- (x1=='b') + 3*(x1=='c') + rnorm(1000,0,2)
x3 <- rnorm(1000)
y <- x2 + 1*(x1=='c') + .2*x3 + rnorm(1000,0,2)
orig.x1 <- x1[1:250]
orig.x2 <- x2[251:350]
x1[1:250] <- NA
x2[251:350] <- NA
d <- data.frame(x1,x2,x3,y)
# Find value of nk that yields best validating imputation models
# tlinear=FALSE means to not force the target variable to be linear
f <- aregImpute(~y + x1 + x2 + x3, nk=c(0,3:5), tlinear=FALSE,
data=d, B=10) # normally B=75
f
# Try forcing target variable (x1, then x2) to be linear while allowing
# predictors to be nonlinear (could also say tlinear=TRUE)
f <- aregImpute(~y + x1 + x2 + x3, nk=c(0,3:5), data=d, B=10)
f
# Use 100 imputations to better check against individual true values
f <- aregImpute(~y + x1 + x2 + x3, n.impute=100, data=d)
f
par(mfrow=c(2,1))
plot(f)
modecat <- function(u) {
tab <- table(u)
as.numeric(names(tab)[tab==max(tab)][1])
}
table(orig.x1,apply(f$imputed$x1, 1, modecat))
par(mfrow=c(1,1))
plot(orig.x2, apply(f$imputed$x2, 1, mean))
fmi <- fit.mult.impute(y ~ x1 + x2 + x3, lm, f,
data=d)
sqrt(diag(vcov(fmi)))
fcc <- lm(y ~ x1 + x2 + x3)
summary(fcc) # SEs are larger than from mult. imputation
Vous mentionnez que de nombreuses nouvelles observations ont des valeurs manquantes sur les variables indépendantes. Même si vous avez de nombreux cas comme celui-ci, si pour chaque nouvelle observation il n'y a que des lacunes dans une ou deux de ses variables et que votre quantité de variables n'est pas minuscule, peut-être simplement en remplissant les trous avec une médiane ou une moyenne (sont-ils continus?) pourrait fonctionner.
Une autre chose qui pourrait être intéressante est de faire une analyse d'importance variable mineure. L'implémentation aléatoire de la forêt R calcule deux mesures d'importance et des parcelles respectives:
varImpPlot(yourRandomForestModel) # yourRandomForestModel must have the argument importance=TRUE
Et vous pouvez jouer avec l'inclusion de variables "importantes" dans la formation du modèle, jusqu'à ce que la précision de la prédiction ne soit pas autant affectée par rapport au "modèle complet". Peut-être que vous conservez des variables avec un faible nombre de manquements. Cela pourrait vous aider à réduire la taille de votre problème.
randomForest
package de R ne dispose que de la méthode d'imputation que vous avez décrite. Si vous voulez rester dans un environnement similaire,gbm
a une méthode un peu plus fluide pour gérer les valeurs manquantes dans les nouvelles données (ce n'est pas parfait, mais c'est utile).