12 votos

¿Cómo realizar la imputación de valores en un número muy grande de puntos de datos?

Tengo un conjunto de datos muy grande y falta un 5% de valores al azar. Estas variables están correlacionadas entre sí. El siguiente ejemplo de conjunto de datos de R es sólo 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

¿Existe una (mejor) forma de imputar los valores perdidos en esta situación? ¿Es útil el algoritmo Random Forest? Cualquier solución que funcione en R sería muy apreciada.

Editado:

(1) Los valores perdidos se distribuyen aleatoriamente entre las variables y las muestras. 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 unos 200. Por lo tanto, cuando observamos una muestra de todas las variables (10000), hay muchas posibilidades de que falte algún valor en alguna variable, debido al gran número de variables. Por lo tanto, la eliminación de la muestra no es una opción.

(2) La variable puede ser tratada como cuantitativa o cualitativa (binaria) en el proceso de imputación. Lo único que se juzga es lo bien que podemos predecirla (precisión). Así, predicciones como 0,98 en lugar de 1 podrían ser aceptables en lugar de 0 frente a 1 o -1 frente a 1. Puede que tenga que hacer un compromiso entre el tiempo de cálculo y la precisión.

(3) El problema que tengo es pensar en cómo el sobreajuste puede afectar a los resultados ya que el número de variables es grande comparado con el número de muestras.

(4) Como la cantidad total de valores perdidos es de aproximadamente el 5% y es aleatoria (no se concentra en ninguna variable o muestra, ya que se tomó la precaución de eliminar las variables o muestras que tienen valores perdidos muy altos)

(5) Hacer que los datos estén completos para el análisis es el primer objetivo y la precisión es secundaria. Así que no es demasiado sensible a la precisión.

8voto

Brian Gannon Puntos 16

Puede haber dos formas de tratar el problema de las variables grandes y las muestras pequeñas (observaciones), dependiendo de su situación y del conjunto de datos.

(1) sólo utilizar las muestras (observaciones) como variable siempre que las puntuaciones de las variables sean las mismas o estén normalizadas.

(2) Utilizar las variables como variable pero hacer un muestreo aleatorio al imputar para que el número de variables sea menor que el número de muestras y finalmente fusionar los datos.

Lo siguiente es un entrenamiento, puedes ajustarlo a tu necesidad. He asumido que la variable es continua, pero el entrenamiento es similar para las variables discretas. Aquí estoy dando un pequeño ejemplo para una comprobación rápida.

En primer lugar, para el entrenamiento que genera datos correlacionados, aquí las observaciones (muestras) están correlacionadas, puede ser realista en situaciones en las que las variables se suponen independientes mientras las observaciones están correlacionadas. Pero en otras situaciones en las que 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 missForest para la imputación, que dependen del paquete randomForest para hacerlo. Puede realizar cálculos en paralelo si tiene un gran número de puntos de datos que 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, podemos permitirnos el lujo de estimar la precisión de la imputación comparando el original antes de introducir los valores perdidos 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

Se puede trabajar alrededor para aumentar la precisión. Buena suerte.

5voto

Donbeo Puntos 760

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 en este caso es elegir una de las columnas ( yy ) y recoger la otra en una matriz xx .

Un modelo y=f(x)y=f(x) se entrena y los valores que faltan se sustituyen por los valores predichos por nuestro modelo. Sus datos parecen ser categóricos, por lo que el bosque aleatorio puede ser una buena opción.

Si su conjunto de datos es muy grande, asegúrese de utilizar un algoritmo rápido o escalable.

5voto

Rory Puntos 400

Esta es una pregunta realmente interesante. Yo también estoy buscando lo mismo. En realidad, hay un montón de maneras diferentes de tratar con él.

Lo primero, en mi opinión, será determinar qué tipo de datos faltantes tiene: faltantes completamente al azar (MCAR), faltantes al azar (MAR) o faltantes no al azar ( NMAR). Esto es difícil y controvertido de demostrar, pero papel muestra una forma interesante de ver los datos del SAM.

Para tratar la imputación múltiple, R dispone de algunos paquetes:

  • MICE (que parece muy utilizado),
  • randomForest ,
  • Hmisc
  • Amelia
  • mi

Estos son sólo algunos de los paquetes que he encontrado hasta ahora.

MICE también ha implementado el bosque aleatorio y algunos otros métodos, como la correspondencia media predictiva.

Esto no es mucho pero puede ayudarte a entender algunas cosas. En cuanto tenga resultados o decida con qué método voy a proceder editaré el post.

Buena suerte.

3voto

alexs77 Puntos 36

Una pregunta interesante. El truco está en que, para hacer imputación múltiple, se necesita algo más que un 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 exactamente modelos de probabilidad.

El aspecto combinado de la selección de características (gran pp ) y el entrenamiento de un modelo de simulación me hace pensar que un enfoque bayesiano es el mejor. Eso también significa que no hay un enfoque claro para esto. Para mí el mejor enfoque tendría el siguiente planteamiento:

  1. Identificar todos los patrones de ausencia
  2. Para cada patrón, utilice un enfoque de selección de características bayesiano para asignar pesos posteriores a los casos completos en los datos.
  3. Muestrear aleatoriamente casos completos de forma iterativa para generar marcos de datos completos.

3voto

RoMa Puntos 401

Tu problema parece hecho a medida para algún tipo de terminación de matriz de bajo rango. Pruebe a utilizar el impute.svd() de la función bcv paquete . Sugeriría utilizar un rango pequeño (el argumento k ), algo así como 5.

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