Tengo un conjunto de datos muy grande y faltan alrededor del 5% de valores aleatorios. Estas variables están correlacionadas entre sí. El siguiente conjunto de datos R de ejemplo es solo un ejemplo de juguete con datos correlacionados ficticios.
set.seed(123)
# matrix of X variable
xmat <- matrix(sample(-1:1, 2000000, replace = TRUE), ncol = 10000)
colnames(xmat) <- paste ("M", 1:10000, sep ="")
rownames(xmat) <- paste("sample", 1:200, sep = "")
#M variables are correlated
N <- 2000000*0.05 # 5% random missing values
inds <- round ( runif(N, 1, length(xmat)) )
xmat[inds] <- NA
> xmat[1:10,1:10]
M1 M2 M3 M4 M5 M6 M7 M8 M9 M10
sample1 -1 -1 1 NA 0 -1 1 -1 0 -1
sample2 1 1 -1 1 0 0 1 -1 -1 1
sample3 0 0 1 -1 -1 -1 0 -1 -1 -1
sample4 1 0 0 -1 -1 1 1 0 1 1
sample5 NA 0 0 -1 -1 1 0 NA 1 NA
sample6 -1 1 0 1 1 0 1 1 -1 -1
sample7 NA 0 1 -1 0 1 -1 0 1 NA
sample8 1 -1 -1 1 0 -1 -1 1 -1 0
sample9 0 -1 0 -1 1 -1 1 NA 0 1
sample10 0 -1 1 0 1 0 0 1 NA 0
¿Hay una (mejor) forma de imputar valores perdidos en esta situación? ¿Es útil el algoritmo Random Forest? Cualquier solución de trabajo en R sería muy apreciada.
Ediciones:
(1) Los valores faltantes se distribuyen aleatoriamente entre las variables y las muestras. Como el número de variables es muy grande (aquí en el ejemplo - 10000), mientras que el número de muestras es pequeño aquí en el ejemplo ficticio anterior es de aproximadamente 200. Entonces, cuando Si observamos cualquier muestra sobre todas las variables (10000), hay muchas posibilidades de que falte un valor en alguna variable, debido a la gran cantidad de variables. Entonces, simplemente eliminar la muestra no es una opción.
(2) La variable puede tratarse como cuantitativa o cualitativa (binaria) en el proceso de imputación. El único juicio es qué tan bien podemos predecirlo (precisión). Por lo tanto, las predicciones como 0,98 en lugar de 1 podrían ser aceptables en lugar de 0 frente a 1 o -1 frente a 1. Es posible que deba compensar el tiempo de cálculo y la precisión.
(3) El problema que tengo pensando es cómo el sobreajuste puede afectar los resultados ya que el número de variables es grande en comparación con el número de muestras.
(4) Como la cantidad total de valores faltantes es aproximadamente del 5% y es aleatoria (no se concentra en ninguna variable o muestra, ya que se tomó precaución para eliminar las variables o muestras que tienen valores faltantes muy altos)
(5) Completar los datos para el análisis es el primer objetivo y la precisión es secundaria. Por lo tanto, no es demasiado sensible a la precisión.
fuente
Respuestas:
Puede haber dos formas de lidiar con un problema de muestra (observación) variable grande y pequeña, según su situación y conjunto de datos.
(1) solo use muestras (observaciones) como variable, siempre que los puntajes entre las variables sean iguales o normalizados.
(2) Utilice las variables como variables, pero realice un muestreo aleatorio mientras realiza la imputación, de modo que la variable numérica sea menor que el número de muestras y finalmente combine los datos.
Lo siguiente es entrenamiento, puede ajustarse a sus necesidades. Supongo que la variable es continua, pero tu entrenamiento es similar para las variables discretas. Aquí estoy dando un pequeño ejemplo para una verificación rápida.
Primero, para el entrenamiento que genera datos correlacionados, aquí las observaciones (muestras) están correlacionadas, pueden ser realistas en situaciones donde las variables se suponen independientes mientras que las observaciones están correlacionadas. Pero en otras situaciones donde tanto las observaciones como las variables están correlacionadas.
Estoy usando el
missForest
paquete para la imputación, que depende delrandomForest
paquete para hacerlo. Puede hacer computación paralela si tiene una gran cantidad de puntos de datos para imputar.Como se trata de un conjunto de datos simulados, tenemos el lujo de estimar la precisión de la imputación comparando los valores originales antes de los perdidos introducidos con los imputados.
Puede trabajar para aumentar la precisión. Buena suerte !
fuente
Hay libros completos de imputación de datos, por lo que es difícil dar una respuesta en este marco.
Lo más fácil de hacer en este caso es elegir una de las columnas ( ) y recoger la otra en una matriz .xy X
Se entrena un modelo y los valores faltantes se reemplazan con los valores predichos por nuestro modelo. Sus datos parecen ser categóricos, por lo que el bosque aleatorio puede ser una buena opción.y= f( x )
Si su conjunto de datos es muy grande, asegúrese de utilizar un algoritmo rápido o escalable.
fuente
Esta es una pregunta realmente interesante. También estoy buscando lo mismo. En realidad, hay muchas formas diferentes de lidiar con eso.
Lo primero, en mi opinión, será determinar qué tipo de datos faltantes tiene: falta completamente al azar (MCAR), falta al azar (MAR) o falta no al azar (NMAR). Esto es difícil y controvertido de probar, pero este documento muestra una forma interesante de ver los datos MAR.
Para hacer frente a la imputación múltiple, R tiene algunos paquetes:
MICE
(que parece muy usado),randomForest
,Hmisc
Amelia
mi
Estos son solo algunos de los paquetes que encontré hasta ahora.
MICE
También ha implementado un bosque aleatorio y algunos otros métodos, como la comparación predictiva de medias.Esto no es mucho, pero puede ayudarlo a descubrir algunas cosas. Tan pronto como tenga resultados o decida con qué método procederé, editaré la publicación.
¡Buena suerte!
fuente
Interesante pregunta. El truco para esto es que, para realizar una imputación múltiple, necesita más que un simple modelo predictivo (que podría / sería fácil de obtener en, por ejemplo, un enfoque de aprendizaje automático). Llamaremos a estos modelos modelos de simulación, ya que no son modelos de probabilidad.
fuente
Su problema parece hecho a medida para algún tipo de terminación de matriz de bajo rango. Intente usar la
impute.svd()
función delbcv
paquete . Sugeriría usar un rango pequeño (el argumentok
), algo así como 5.fuente