utilizando información vecina para imputar datos o encontrar datos fuera de datos (en R)

13

Tengo un conjunto de datos con la suposición de que los vecinos más cercanos son los mejores predictores. Solo un ejemplo perfecto de gradiente bidireccional visualizado

ingrese la descripción de la imagen aquí

Supongamos que tenemos un caso en el que faltan pocos valores, podemos predecir fácilmente según los vecinos y la tendencia.

ingrese la descripción de la imagen aquí

Matriz de datos correspondiente en R (ejemplo ficticio para entrenamiento):

miss.mat <- matrix (c(5:11, 6:10, NA,12, 7:13, 8:14, 9:12, NA, 14:15, 10:16),ncol=7, byrow = TRUE)
miss.mat 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    5    6    7    8    9   10   11
[2,]    6    7    8    9   10   NA   12
[3,]    7    8    9   10   11   12   13
[4,]    8    9   10   11   12   13   14
[5,]    9   10   11   12   NA   14   15
[6,]   10   11   12   13   14   15   16

Notas: (1) Se supone que la propiedad de los valores faltantes es aleatoria , puede suceder en cualquier lugar.

(2) Todos los puntos de datos provienen de una sola variable, pero se supone que su valor está influenciado neighborsen la fila y columna adyacente a ellos. Por lo tanto, la posición en la matriz es importante y puede considerarse como otra variable.

Mi esperanza en algunas situaciones es que puedo predecir algunos valores fuera de valor (pueden ser errores) y corregir el sesgo (solo un ejemplo, generemos dicho error en los datos ficticios):

> mat2 <- matrix (c(4:10, 5, 16, 7, 11, 9:11, 6:12, 7:13, 8:14, 9:13, 4,15, 10:11, 2, 13:16),ncol=7, byrow = TRUE)
> mat2

    [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    4    5    6    7    8    9   10
[2,]    5   16    7   11    9   10   11
[3,]    6    7    8    9   10   11   12
[4,]    7    8    9   10   11   12   13
[5,]    8    9   10   11   12   13   14
[6,]    9   10   11   12   13    4   15
[7,]   10   11    2   13   14   15   16

Los ejemplos anteriores son solo una ilustración (puede responderse visualmente) pero el ejemplo real puede ser más confuso. Estoy buscando si hay un método robusto para hacer dicho análisis. Creo que esto debería ser posible. ¿Cuál sería el método adecuado para realizar este tipo de análisis? ¿Alguna sugerencia de programa / paquete R para hacer este tipo de análisis?

ingrese la descripción de la imagen aquí

rdorlearn
fuente
¿Puede suponer que los datos que faltan son MAR (en la terminología de Rubin (1976))?
user603
Sí, se puede suponer que los valores faltan al azar (MAR). Ver mis ediciones recientes.
rdorlearn

Respuestas:

7

La pregunta pide formas de utilizar a los vecinos más cercanos de manera robusta para identificar y corregir valores atípicos localizados. ¿Por qué no hacer exactamente eso?

El procedimiento consiste en calcular una suavidad local robusta, evaluar los residuos y poner a cero los que sean demasiado grandes. Esto satisface todos los requisitos directamente y es lo suficientemente flexible como para ajustarse a diferentes aplicaciones, ya que uno puede variar el tamaño del vecindario local y el umbral para identificar valores atípicos.

(¿Por qué es tan importante la flexibilidad? Debido a que cualquier procedimiento de este tipo tiene una buena oportunidad de identificar ciertos comportamientos localizados como "periféricos". Como tal, todos estos procedimientos pueden considerarse suavizadores . Eliminarán algunos detalles junto con los valores atípicos aparentes. El analista necesita cierto control sobre la compensación entre retener detalles y no detectar valores atípicos locales).

Otra ventaja de este procedimiento es que no requiere una matriz rectangular de valores. De hecho, incluso se puede aplicar a datos irregulares utilizando un suavizador local adecuado para dichos datos.

R, así como la mayoría de los paquetes de estadísticas con todas las funciones, tiene varios suavizadores locales robustos integrados, como loess. El siguiente ejemplo fue procesado usándolo. La matriz tiene filas y 49 columnas, casi entradas. Representa una función complicada que tiene varios extremos locales, así como una línea completa de puntos donde no es diferenciable (un "pliegue"). A un poco más del de los puntos, una proporción muy alta para ser considerada "periférica", se agregaron errores gaussianos cuya desviación estándar es solo de la desviación estándar de los datos originales. Este conjunto de datos sintéticos presenta muchas de las características desafiantes de los datos realistas.794940005%1/20

Cifras

Tenga en cuenta que (según las Rconvenciones) las filas de la matriz se dibujan como tiras verticales. Todas las imágenes, excepto los residuos, están sombreadas para ayudar a mostrar pequeñas variaciones en sus valores. Sin esto, ¡casi todos los valores atípicos locales serían invisibles!

Al comparar las imágenes "Imputado" (arreglado) con las imágenes "Reales" (originales no contaminadas), es evidente que la eliminación de los valores atípicos ha suavizado parte, pero no todo, del pliegue (que va desde(0,79) hacia abajo a ; es evidente como una franja angulada cian clara en la trama "Residuos").(49,30)

Las manchas en la trama de "Residuos" muestran los obvios valores aislados locales aislados. Este gráfico también muestra otra estructura (como esa franja diagonal) atribuible a los datos subyacentes. Se podría mejorar este procedimiento utilizando un modelo espacial de los datos (a través de métodos geoestadísticos), pero describirlo e ilustrarlo nos llevaría demasiado lejos aquí.

Por cierto, este código informó haber encontrado solo de los 200 valores atípicos que se introdujeron. Esto no es un fracaso del procedimiento. Debido a que los valores atípicos se distribuían normalmente, aproximadamente la mitad de ellos tenían un tamaño tan cercano a cero, 3 o menos, en comparación con los valores subyacentes que tenían un rango de más de 600, que no hicieron ningún cambio detectable en la superficie. 1022003600

#
# Create data.
#
set.seed(17)
rows <- 2:80; cols <- 2:50
y <- outer(rows, cols, 
           function(x,y) 100 * exp((abs(x-y)/50)^(0.9)) * sin(x/10) * cos(y/20))
y.real <- y
#
# Contaminate with iid noise.
#
n.out <- 200
cat(round(100 * n.out / (length(rows)*length(cols)), 2), "% errors\n", sep="")
i.out <- sample.int(length(rows)*length(cols), n.out)
y[i.out] <- y[i.out] + rnorm(n.out, sd=0.05 * sd(y))
#
# Process the data into a data frame for loess.
#
d <- expand.grid(i=1:length(rows), j=1:length(cols))
d$y <- as.vector(y)
#
# Compute the robust local smooth.
# (Adjusting `span` changes the neighborhood size.)
#
fit <- with(d, loess(y ~ i + j, span=min(1/2, 125/(length(rows)*length(cols)))))
#
# Display what happened.
#
require(raster)
show <- function(y, nrows, ncols, hillshade=TRUE, ...) {
  x <- raster(y, xmn=0, xmx=ncols, ymn=0, ymx=nrows)
  crs(x) <- "+proj=lcc +ellps=WGS84"
  if (hillshade) {
    slope <- terrain(x, opt='slope')
    aspect <- terrain(x, opt='aspect')
    hill <- hillShade(slope, aspect, 10, 60)
    plot(hill, col=grey(0:100/100), legend=FALSE, ...)
    alpha <- 0.5; add <- TRUE
  } else {
    alpha <- 1; add <- FALSE
  }
  plot(x, col=rainbow(127, alpha=alpha), add=add, ...)
}

par(mfrow=c(1,4))
show(y, length(rows), length(cols), main="Data")

y.res <- matrix(residuals(fit), nrow=length(rows))
show(y.res, length(rows), length(cols), hillshade=FALSE, main="Residuals")
#hist(y.res, main="Histogram of Residuals", ylab="", xlab="Value")

# Increase the `8` to find fewer local outliers; decrease it to find more.
sigma <- 8 * diff(quantile(y.res, c(1/4, 3/4)))
mu <- median(y.res)
outlier <- abs(y.res - mu) > sigma
cat(sum(outlier), "outliers found.\n")

# Fix up the data (impute the values at the outlying locations).
y.imp <- matrix(predict(fit), nrow=length(rows))
y.imp[outlier] <- y[outlier] - y.res[outlier]

show(y.imp, length(rows), length(cols), main="Imputed")
show(y.real, length(rows), length(cols), main="Real")
whuber
fuente
whuber: ¿Entiendo correctamente que asumes que los valores atípicos son células aisladas? Si es así, ¿sabría cuán sensible es este enfoque para la violación de esta suposición?
usuario603
@ user603 No asumo que los valores atípicos están aislados, muchos de ellos en el ejemplo no lo están, pero sí asumo que la proporción de valores atípicos en cualquier vecindario local es lo suficientemente baja como para no desglosar el problema local. Podría decirse que si hay algún vecindario con una proporción muy grande de tales valores atípicos, ¡ya no pueden considerarse valores atípicos locales!
whuber
1
@ user603 ¡Absolutamente! Pero eso parece sacarnos de la presunta situación en la que "los vecinos más cercanos son los mejores predictores". Por respeto a eso, cualquier cosa que hagamos al procesar los datos debería preservar esta previsibilidad local. Si una columna tiene una "escala muy diferente" que su vecina, esa circunstancia violaría esta suposición declarada con bastante fuerza. (También me pregunto su enfoque en las columnas: al volver a leer la pregunta, no puedo detectar ninguna asimetría en los roles de las columnas y las filas.)
whuber
1
pag
1
@whuber esta es una gran solución, gracias. Intenté introducir al menos algunos valores perdidos, lo que siempre es una situación real: una combinación de valores perdidos (por ejemplo, 50 valores perdidos) y valores atípicos (100 valores atípicos). emocionante !
rdorlearn
4

Le aconsejaría que eche un vistazo a este artículo [0]. El problema que pretende abordar parece encajar bastante bien con su descripción, excepto que el método propuesto por el autor es un poco más refinado que la inducción NN (aunque utiliza algo similar como punto de partida).

XXnortepag

k

El primer paso de cada iteración es el paso de imputación de datos. Esto se hace como en el algoritmo EM: las celdas faltantes se llenan con el valor que se espera que tengan (este es el paso E).

XXttRpagpagkLLkkrerekpag

Para resumir el artículo, aquí está el algoritmo general que proponen:

  • l=0 0WW0 0XX

  • Luego, hazlo hasta la convergencia:

    WWl(ttl,LLl,rerel)

    l=l+1

    YYl=LLl-1(WWl-1-ttl-1)(LLl-1)

    WWlWWlnorte(ttl-1,LLl-1rerel-1(LLl-1))YYl

El |El |WWl-1-WWlEl |El |F(tt,LL,rere)

(ttl-1,LLl-1rerel-1)

norte(ttl-1,LLrere(LL))

No conozco una implementación R preparada para este enfoque, pero se puede producir fácilmente a partir de los subcomponentes (principalmente un algoritmo PCA robusto), y estos están bien implementados en R, consulte el paquete rrcov (el documento es silencioso informativo sobre este tema).

  • [0] Serneels S. y Verdonck, T. (2008). Análisis de componentes principales para datos que contienen valores atípicos y elementos faltantes. Estadísticas computacionales y análisis de datos vol: 52 número: 3 páginas: 1712-1727.
usuario603
fuente
gracias, mi objetivo aquí no es predecir valores atípicos (en el sentido de que están lejos de la distribución) sino valores fuera de valor (valores atípicos) que no se ajustan al patrón.
rdorlearn
Creo que entendiste mal mi respuesta. Este enfoque producirá predicciones para cualquier valor, pero los valores atípicos no se pronosticarán muy bien: esto se debe a que no se les permite influir en el ajuste de PCA. Te aconsejo que leas el periódico.
usuario603
gracias, el enfoque parece interesante y adivinar también puede funcionar bien. Pero sin los códigos adecuados será difícil de implementar, ¡al menos demasiado sofisticado para mí!
rdorlearn