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

r  random-forest  missing-data  data-imputation  multiple-imputation  large-data  definition  moving-window  self-study  categorical-data  econometrics  standard-error  regression-coefficients  normal-distribution  pdf  lognormal  regression  python  scikit-learn  interpolation  r  self-study  poisson-distribution  chi-squared  matlab  matrix  r  modeling  multinomial  mlogit  choice  monte-carlo  indicator-function  r  aic  garch  likelihood  r  regression  repeated-measures  simulation  multilevel-analysis  chi-squared  expected-value  multinomial  yates-correction  classification  regression  self-study  repeated-measures  references  residuals  confidence-interval  bootstrap  normality-assumption  resampling  entropy  cauchy  clustering  k-means  r  clustering  categorical-data  continuous-data  r  hypothesis-testing  nonparametric  probability  bayesian  pdf  distributions  exponential  repeated-measures  random-effects-model  non-independent  regression  error  regression-to-the-mean  correlation  group-differences  post-hoc  neural-networks  r  time-series  t-test  p-value  normalization  probability  moments  mgf  time-series  model  seasonality  r  anova  generalized-linear-model  proportion  percentage  nonparametric  ranks  weighted-regression  variogram  classification  neural-networks  fuzzy  variance  dimensionality-reduction  confidence-interval  proportion  z-test  r  self-study  pdf 

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 !


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.


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!


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.

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.