No tienes más opción que imputar los valores o cambiar de modelos. Una buena elección podría ser aregImpute en el paquete Hmisc. Creo que es menos pesado que rfimpute, que es lo que te está deteniendo, primer ejemplo del paquete (hay otros):
# Comprueba que aregImpute puede estimar casi exactamente los valores faltantes cuando
# hay una relación no lineal perfecta entre dos variables
# Ajustar splines cúbicos restringidos con 4 knots para x1 y x2, lineal para 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
# Imputación múltiple y estimación de varianzas y covarianzas de
# estimaciones de coeficientes de regresión teniendo en cuenta la imputación
# Ejemplo 1: tamaño de muestra grande, muchos datos faltantes, sin superposición en
# NA entre 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)
# Encontrar el valor de nk que produce los mejores modelos de imputación de validación
# tlinear=FALSE significa no forzar que la variable objetivo sea lineal
f <- aregImpute(~y + x1 + x2 + x3, nk=c(0,3:5), tlinear=FALSE,
data=d, B=10) # normalmente B=75
f
# Intentar forzar a que la variable objetivo (x1, luego x2) sea lineal mientras se permiten
# predictores no lineales (también podría decir tlinear=TRUE)
f <- aregImpute(~y + x1 + x2 + x3, nk=c(0,3:5), data=d, B=10)
f
# Usar 100 imputaciones para verificar mejor contra valores verdaderos individuales
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) # Los SEs son más grandes que con imputación múltiple
Mencionas que tienes muchas nuevas observaciones que tienen valores faltantes en las variables independientes. Aunque tengas muchos casos así, si para cada nueva observación solo faltan uno o dos de sus variables y la cantidad de variables no es pequeña, tal vez simplemente rellenar los huecos con la mediana o el promedio (¿son continuas?) podría funcionar.
Otra cosa que podría ser interesante es realizar un análisis de importancia de variables. La implementación de random forest en R calcula dos medidas de importancia y respectivas gráficas:
varImpPlot(tuModeloRandomForest) # tuModeloRandomForest debe tener el argumento importance=TRUE
Y puedes jugar con incluir solo variables "importantes" en el entrenamiento del modelo, hasta que la precisión de la predicción no se vea muy afectada en comparación con el "modelo completo". Quizás te convenga mantener variables con un bajo número de faltantes. Podría ayudarte a reducir el tamaño de tu problema.
4 votos
Hay muchas formas de manejar los valores faltantes en árboles de decisión, pero el paquete
randomForest
en R solo tiene el método de imputación que describiste. Si deseas permanecer en un ambiente similar,gbm
tiene un método algo más suave para manejar los valores faltantes en nuevos datos (no es perfecto, pero es útil).0 votos
Creo que el paquete party maneja mejor los valores faltantes
0 votos
Estimado @Simone, ¿cómo funciona el paquete
party
con NAs en el conjunto de pruebas? No pude encontrar rastro de imputación en los manuales o ejemplos departy
.0 votos
@hermo trata de echar un vistazo al documento de la fiesta citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.92.9930 parece que el algoritmo funciona como CART - busca divisiones sustitutas.
0 votos
Intenta usar "na.action = na.roughfix".