¿Cómo realizar la imputación de valores en una gran cantidad de puntos de datos?

12

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.

John
fuente
1
La razón por la que faltan los datos tiene mucho que ver con la elección de la técnica adecuada. Por ejemplo, si los datos faltan completamente al azar, perderá poco al descartar todos los casos con valores faltantes (porque el conjunto de datos es grande y faltan relativamente pocos valores); pero si la falta está relacionada con variables importantes en el análisis, descartar esos casos puede introducir un sesgo.
whuber
1
@whuber Estoy de acuerdo, no es posible eliminar un conjunto de datos de este tamaño ya que todos los casos tendrán un valor perdido al menos en una variable. Esto causará la pérdida total de datos.
John
44
Eso cambia la pregunta sustancialmente, John, porque en su forma actual declara explícitamente lo contrario: afirma que solo falta el 5% de los valores. Incluso si entendemos que el 5% se aplica a todas las entradas en la matriz de datos, en lugar del 5% de los casos, cualquiera que tome el ejemplo como indicativo de la naturaleza de sus datos concluirá válidamente que no más del 10 * 5% = 50 El% de los casos tiene valores faltantes. Las tres cosas que son más importantes para describir en tales preguntas son (1) el propósito del análisis, (2) la naturaleza de la falta y (3) la cantidad de falta.
whuber

Respuestas:

8

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.

# example correlated data, correlated by observations 
# number of observations 
nobs = 200
nvars = 100
# number of variables 
# covariance matrix matrixCR to create correlated data 
matrixCR <- matrix(NA, nrow = nobs, ncol = nobs)
diag(matrixCR) <- 1
matrixCR[upper.tri (matrixCR, diag = FALSE)] <- 0.5
matrixCR[lower.tri (matrixCR, diag = FALSE)] <- 0.5
matrixCR[1:10,1:10]
L = chol(matrixCR)# Cholesky decomposition
nvars = dim(L)[1]
set.seed(123)
rM = t(L) %*% matrix(rnorm(nvars*nobs), nrow=nvars, ncol=nobs)
rownames(rM) <- paste("V", 1:nvars, sep = "") 
colnames(rM) <- paste("O", 1:nobs, sep = "")
rM[1:10,1:10]



# introduce missing values in random places 
N <- round(nobs*nvars*0.05,0) # 5% random missing values 
set.seed(123)
inds <- round ( runif(N, 1, length(rM)) )
rM1 <- rM
rM1[inds] <- NA

Estoy usando el missForestpaquete para la imputación, que depende del randomForestpaquete para hacerlo. Puede hacer computación paralela si tiene una gran cantidad de puntos de datos para imputar.

# now use the rM1 matrix in imputation. 
require(missForest)
out.m <- missForest(rM1, maxiter = 10, ntree = 300)
# imputed 
imp.rM1 <- out.m$ximp

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.

# actual values that were made missing 
aval <- rM[inds]
impv <- imp.rM1[inds]

# accuracy - defined as correlation between actual (before na introduction) and imputed values 
cor(aval,impv)
[1] 0.6759404

Puede trabajar para aumentar la precisión. Buena suerte !

Ram Sharma
fuente
5

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 .xyx

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.

Donbeo
fuente
gracias, ¿tiene alguna sugerencia de libro (s)?
John
nada en particular. pero si buscas en Google la imputación de datos puedes encontrar muchas cosas
Donbeo
De todos modos, si solo faltan algunos valores, puede eliminar toda la línea. Desde sus conjuntos de datos
Donbeo
3
Aunque siempre puede eliminar casos con valores perdidos, eso a veces sería una mala elección, dependiendo de por qué faltan los datos.
whuber
@whuber Estoy totalmente de acuerdo contigo, pero muchas veces esta es la opción más segura.
Donbeo
5

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!

psoares
fuente
Mis datos son MCAR.
John
1
Si sus datos son MCAR, solo puede usar un análisis de caso completo. Muchos artículos informan que el uso de análisis de casos completos con datos MCAR es la mejor solución. Por lo menos, algunos de los papeles que encontré informan de esto, incluso cuando se comparan con otros métodos de imputación
psoares
3

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.

p

  1. Identificar todos los patrones de falta
  2. Para cada patrón, utilice un enfoque de selección de características bayesianas para asignar pesos posteriores para completar casos en los datos.
  3. Muestra aleatoria de casos completos de forma iterativa para generar marcos de datos completos.
AdamO
fuente
3

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 del bcvpaquete . Sugeriría usar un rango pequeño (el argumento k), algo así como 5.

Innuo
fuente