2 votos

uso de random forest para la imputación de datos perdidos en variables categóricas ( en R)

Tengo el siguiente tipo de asociado datos. El siguiente paso de ejemplo para generar la variable asociada. p número de variables y n es el número de observaciones.

p = 500
n = 200
mat <- matrix(NA, ncol = 500, nrow = 200)

for (i in 1:p){
if(i ==1){
     fs <- sample (c("AA", "AB", "AB", "BB"), n, replace=TRUE) 
     mat[,i] <- fs 
     fs1 <- fs 
     } 
rechr <- sample(1:n, 1)
fs1[rechr] <- sample (c("AA", "AB", "AB", "BB"), 1)
mat[,i] <- fs1 
}

dim(mat)
mat[1:10,1:20]

Los datos anteriores están completos, pero en el conjunto de datos reales tengo valores perdidos (que se distribuyen aleatoriamente dentro de cada variable).

Me gustaría predecirlos utilizando random forest (o cualquier otro algoritmo apropiado). Pongamos aleatoriamente un 10% de valores perdidos (el número aproximado de variables) a los datos anteriores.

rowind <- sample(1:n, 20)
colind <- sample(1:p, 20)

for (i in 1:length(rowind)){
                mat[rowind[i],colind[i]] <- NA
}
mat[1:20,1:10]

¿Cómo se puede hacer esto y qué cuestiones Tengo que pensar en hacerlo - teniendo en cuenta variables categóricas Número de observaciones y variables

Editar: Como todas las variables están correlacionadas y ninguna es respuesta (pero puede servir como respuesta) mientras se hace la predicción. Por ejemplo, la predicción del valor perdido de mat[,1] puede basarse en el resto de las variables, la predicción de mat[,2] puede basarse en la predicción del resto de las variables. Por lo tanto, el objetivo aquí es predecir todos los valores perdidos en todas las variables (todas ellas son categóricas).

Edición 2

Estoy interesado en imputación múltiple de estos datos para poder realizar otros análisis que requieran un conjunto de datos completo sin valores perdidos.

4voto

KhaaL Puntos 66

La respuesta de dfife es buena, aunque puede ser informativo volver a leer la descripción de Breiman sobre cómo los bosques aleatorios pueden manejar los valores perdidos en los datos de entrenamiento al tratar de predecir una variable sin valores perdidos: http://www.stat.berkeley.edu/~breiman/RandomForests/cc_home.htm#missing1

Otro enfoque con el que he tenido buena suerte para predecir u obtener puntuaciones de importancia a partir de conjuntos de datos con valores perdidos sin imputar es la división en tres direcciones que divide el valor que falta en una tercera rama en cada nodo. Esto es especialmente útil si el hecho de que algo sea nulo puede ser realmente informativo (por ejemplo, en una encuesta en la que una pregunta que se deja en blanco puede ser significativa).

Este método tiene su origen (que yo sepa) en el rf-ace de Timo Erkkila: https://code.google.com/p/rf-ace/ y también se puede encontrar en mi aplicación, CloudForest: https://github.com/ryanbressler/CloudForest .

rf-ace tiene un paquete r (difícil de construir), cloudforest todavía no, pero es más rápido y más eficiente en cuanto a la memoria y también puede manejar los valores perdidos a través de una corrección de sesgo sin división de tres vías o imputación como en algunas variantes de CART.

Si hay valores que faltan en lo que se intenta predecir, es posible que desee buscar métodos de aprendizaje semisupervisado. Si desea un método no supervisado para imputar los valores perdidos mientras no está intentando predecir algo, podría empezar con la imputación del vecino más cercano o imputar la media o la moda de la variable (como sugiere Breiman para inicializar su método de imputación de RF).

2voto

user44796 Puntos 172

Hay dos formas de hacerlo que dependen de lo que se quiera hacer. Puedes imputar los valores que faltan utilizando el matriz de proximidad (el rfImpute en la función randomForest paquete).

Si sólo le interesa cálculo de la importancia de las variables puede utilizar el cforest en la función party y luego calcular la importancia de las variables a través del paquete varimp() función. Este enfoque se basa en este artículo lo que sugiere una forma muy inteligente de evitando los datos que faltan (y manejarlos de forma elegante) para calcular la importancia de las variables.

2voto

liggett78 Puntos 8268

Parece que le interesan las imputaciones múltiples. Vea esto enlace sobre las formas de imputar / manejar datos categóricos. En el enlace se habla de detalles y cómo hacerlo en SAS.

El paquete R mice puede manejar datos categóricos para casos univariantes utilizando la regresión logística y el análisis de la función discriminante (véase el enlace ). Si utiliza SAS proc mi es el camino a seguir [ver enlace] .

Editar:

Puede utilizar la función rfunsuper utilizado en mi respuesta para el otra pregunta .

p = 500
n = 200
mat <- matrix(NA, ncol = 500, nrow = 200)

for (i in 1:p){
if(i ==1){
     fs <- sample (c("AA", "AB", "AB", "BB"), n, replace=TRUE) 
     mat[,i] <- fs 
     fs1 <- fs 
     } 
rechr <- sample(1:n, 1)
fs1[rechr] <- sample (c("AA", "AB", "AB", "BB"), 1)
mat[,i] <- fs1 
}

dim(mat)

rowind <- sample(1:n, 20)
colind <- sample(1:p, 20)

for (i in 1:length(rowind)){
                mat[rowind[i],colind[i]] <- NA
}
mat[1:20,1:10]

out1 <- rfunsuper (data.frame(mat), iter=5, ntree=100)
diff.rel = 1.555556 / 50587.33 = 3.07499e-05 
diff.rel = 0.1111111 / 50590.67 = 2.196277e-06 

Call:
 randomForest(x = x.roughfixed, ntree = ntree) 
               Type of random forest: unsupervised
                     Number of trees: 100
No. of variables tried at each split: 22

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X