usare le informazioni del vicino per imputare i dati o trovare off-data (in R)


13

Ho un set di dati con il presupposto che i vicini più vicini siano i migliori predittori. Solo un perfetto esempio di gradiente bidirezionale visualizzato-

inserisci qui la descrizione dell'immagine

Supponiamo di avere casi in cui mancano pochi valori, possiamo facilmente prevedere in base ai vicini e alla tendenza.

inserisci qui la descrizione dell'immagine

Matrice di dati corrispondente in R (esempio fittizio per allenamento):

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

Note: (1) La proprietà dei valori mancanti è considerata casuale , può accadere ovunque.

(2) Tutti i punti dati provengono da una singola variabile, ma si presume che il loro valore sia influenzato da neighborsrighe e colonne adiacenti. Quindi la posizione nella matrice è importante e può essere considerata come un'altra variabile.

La mia speranza in alcune situazioni sono in grado di prevedere alcuni valori errati (possono essere errori) e correggere la distorsione (solo esempio, consente di generare tale errore nei dati fittizi):

> 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

Gli esempi sopra riportati sono solo illustrativi (è possibile rispondere visivamente), ma l'esempio reale può essere più confuso. Sto cercando se esiste un metodo valido per fare tale analisi. Penso che questo dovrebbe essere possibile. Quale sarebbe il metodo adatto per eseguire questo tipo di analisi? eventuali suggerimenti di programmi / pacchetti R per eseguire questo tipo di analisi?

inserisci qui la descrizione dell'immagine


Puoi presumere che i dati mancanti siano MAR (nella terminologia di Rubin (1976))?
user603,

sì, si può presumere che i valori siano mancanti in modo casuale (MAR). Vedi le mie modifiche recenti.
rdorlearn,

Risposte:


7

La domanda chiede di modi per utilizzare vicini più prossimi in un robusto modo per identificare e valori anomali localizzati corretti. Perché non fare esattamente questo?

La procedura consiste nel calcolare un solido smooth locale, valutare i residui e azzerare quelli troppo grandi. Questo soddisfa tutti i requisiti direttamente ed è abbastanza flessibile da adattarsi alle diverse applicazioni, perché si possono variare le dimensioni del vicinato locale e la soglia per identificare i valori anomali.

(Perché la flessibilità è così importante? Perché una tale procedura ha buone probabilità di identificare alcuni comportamenti localizzati come "periferici". In quanto tali, tutte queste procedure possono essere considerate più fluide . Elimineranno alcuni dettagli insieme agli apparenti valori anomali. L'analista ha bisogno di un certo controllo sul compromesso tra la conservazione dei dettagli e il mancato rilevamento di valori anomali locali.)

Un altro vantaggio di questa procedura è che non richiede una matrice rettangolare di valori. In effetti, può anche essere applicato a dati irregolari utilizzando un dispositivo più fluido locale adatto a tali dati.

R, così come la maggior parte dei pacchetti di statistiche con funzionalità complete, ha integrato diversi strumenti di smoothing locali come loess. L'esempio seguente è stato elaborato utilizzandolo. La matrice ha righe e 49 colonne - quasi 4000 voci. Rappresenta una funzione complicata con diversi estremi locali e un'intera linea di punti in cui non è differenziabile (una "piega"). A poco più del 5 % dei punti - una percentuale molto elevata da considerare "periferico" - sono stati aggiunti errori gaussiani cui deviazione standard è di solo 1 / 20 della deviazione standard dei dati originali. Questo set di dati sintetici presenta quindi molte delle caratteristiche impegnative di dati realistici.794940005%1/20

figure

Si noti che (come da Rconvenzioni) le righe della matrice vengono disegnate come strisce verticali. Tutte le immagini, ad eccezione dei residui, hanno l'ombra delle colline per aiutare a visualizzare piccole variazioni nei loro valori. Senza questo, quasi tutti i valori anomali locali sarebbero invisibili!

(0,79)(49,30)

Le macchioline nel diagramma "Residui" mostrano gli evidenti valori anomali locali isolati. Questo grafico mostra anche altre strutture (come quella striscia diagonale) attribuibili ai dati sottostanti. Si potrebbe migliorare questa procedura usando un modello spaziale dei dati ( tramite metodi geostatistici), ma descriverlo e illustrarlo ci porterebbe troppo lontano qui.

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: Capisco correttamente che supponi che gli outlier siano celle isolate? In tal caso, sapresti quanto è sensibile questo approccio alla violazione di questo presupposto?
user603,

@ user603 Non presumo che i valori anomali siano isolati - molti di essi nell'esempio non lo sono - ma presumo che la percentuale di valori anomali in qualsiasi quartiere locale sia sufficientemente bassa da non compromettere la scorrevolezza locale. Probabilmente, se c'è un quartiere con una proporzione molto ampia di tali valori anomali, non possono più essere considerati valori anomali locali!
whuber

1
@ user603 Assolutamente! Ma questo sembra portarci fuori dalla situazione presuntiva in cui "i vicini più vicini sono i migliori predittori". Per rispetto di ciò, qualsiasi cosa facciamo durante l'elaborazione dei dati dovrebbe preservare questa prevedibilità locale. Se una colonna ha una "scala notevolmente diversa" rispetto al suo vicino, quella circostanza violerebbe questa affermazione dichiarata piuttosto fortemente. (Mi chiedo anche la tua attenzione alle colonne: rileggendo la domanda, non riesco a rilevare alcuna asimmetria nei ruoli di colonne e righe.)
whuber

1
p

1
@whuber questa è un'ottima soluzione, grazie - stavo cercando di introdurre almeno alcuni valori mancanti, che è sempre una situazione reale - un mix di valori mancanti (ad esempio 50 valori mancanti) e valori anomali (100 valori anomali). eccitante !
rdorlearn,

4

Ti consiglierei di dare un'occhiata a questo articolo [0]. Il problema che pretende di affrontare sembra adattarsi piuttosto bene alla tua descrizione, tranne per il fatto che il metodo proposto dall'autore è leggermente più raffinato dell'input NN (sebbene utilizzi qualcosa di simile come punto di partenza).

XXnp

k

Il primo passaggio di ogni iterazione è il passaggio di imputazione dei dati. Questo è fatto come nell'algoritmo EM: le celle mancanti sono riempite dal valore che dovrebbero avere (questo è l'E-step).

Nella seconda parte della procedura iterativa in due fasi, si adatta una PCA (solida) ai dati aumentati ottenuti dalla fase precedente. Ciò provoca una decomposizione spettrale diXXttRppkLLkkDDkp

Per riassumere il documento, ecco l'algoritmo generale che propongono:

  • l=0WW0XX (la matrice di dati originale).

  • Quindi, fino alla convergenza:

    un. fare PCA robusto suWWl(ttl,LLl,DDl)

    l=l+1

    c. usoYYl=LLl1(WWl1ttl1)(LLl1)

    d. riempire gli elementi mancanti diWWlWWlN(ttl1,LLl1DDl1(LLl1))YYl

||WWl1WWl||F(tt,LL,DD)

(ttl1,LLl1DDl1)

N(ttl1,LLDD(LL))

Non conosco un'implementazione R pronta per questo approccio, ma si può facilmente produrre dai sottocomponenti (principalmente un robusto algoritmo PCA), e questi sono ben implementati in R, vedere il pacchetto rrcov (il documento è informativa discreta su questo argomento).

  • [0] Serneels S. e Verdonck, T. (2008). Analisi dei componenti principali per dati contenenti valori anomali ed elementi mancanti. Statistica computazionale e analisi dei dati vol: 52 edizione: 3 pagine: 1712-1727.

grazie, il mio obiettivo qui non è quello di prevedere valori anomali (nel senso che sono lontani dalla distribuzione) piuttosto valori fuori valore (valori anomali) che non si adattano al modello.
rdorlearn,

Penso che tu abbia frainteso la mia risposta. Questo approccio produrrà una previsione per qualsiasi valore, ma gli outlier non saranno previsti molto bene: questo perché non sono autorizzati a influenzare l'adattamento PCA. Ti consiglio di leggere l'articolo.
user603,

grazie, l'approccio sembra interessante e anche le ipotesi potrebbero funzionare bene. Ma senza codici adeguati sarà difficile da implementare - almeno troppo sofisticato per me!
rdorlearn,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.