Verwenden von Nachbarinformationen bei der Eingabe von Daten oder Finden von Off-Daten (in R)

13

Ich habe einen Datensatz mit der Annahme, dass die nächsten Nachbarn die besten Prädiktoren sind. Nur ein perfektes Beispiel für einen Zwei-Wege-Gradienten, der

Bildbeschreibung hier eingeben

Angenommen, wir haben einen Fall, in dem nur wenige Werte fehlen, und wir können dies auf der Grundlage von Nachbarn und Trends leicht vorhersagen.

Bildbeschreibung hier eingeben

Entsprechende Datenmatrix in R (Dummy-Beispiel für Workout):

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

Anmerkungen: (1) Es wird angenommen, dass die Eigenschaft fehlender Werte zufällig ist. Sie kann überall vorkommen.

(2) Alle Datenpunkte stammen von einer einzelnen Variablen, aber es wird davon ausgegangen, dass ihr Wert durch die neighborsbenachbarten Zeilen und Spalten beeinflusst wird . Die Position in der Matrix ist also wichtig und kann als andere Variable betrachtet werden.

Ich hoffe, dass ich in einigen Situationen einige Abweichungen (möglicherweise Fehler) vorhersagen und die Abweichung korrigieren kann (nur ein Beispiel, lassen Sie uns einen solchen Fehler in den Dummy-Daten erzeugen):

> 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

Die obigen Beispiele dienen nur der Veranschaulichung (können visuell beantwortet werden), das tatsächliche Beispiel kann jedoch verwirrender sein. Ich bin auf der Suche nach einer robusten Methode für eine solche Analyse. Ich denke das sollte möglich sein. Welche Methode wäre geeignet, um diese Art von Analyse durchzuführen? Vorschläge für R-Programme / -Pakete für diese Art der Analyse?

Bildbeschreibung hier eingeben

rdorlearn
quelle
Können Sie annehmen, dass die fehlenden Daten MAR sind (in der Terminologie von Rubin (1976))?
user603
ja, es kann angenommen werden, dass die Werte zufällig fehlen (MAR). Siehe meine letzten Änderungen.
Rdorlearn

Antworten:

7

In der Frage wird nach Möglichkeiten gefragt, wie die nächsten Nachbarn auf robuste Weise verwendet werden können, um lokalisierte Ausreißer zu identifizieren und zu korrigieren. Warum nicht genau das tun?

Die Prozedur besteht darin, eine robuste lokale Glättung zu berechnen, die Residuen auszuwerten und alle zu großen zu nullen. Dies erfüllt alle Anforderungen direkt und ist flexibel genug, um sich an unterschiedliche Anwendungen anzupassen, da man die Größe der lokalen Nachbarschaft und die Schwelle zur Identifizierung von Ausreißern variieren kann.

(Warum ist Flexibilität so wichtig? Weil bei einem solchen Verfahren bestimmte lokalisierte Verhaltensweisen mit hoher Wahrscheinlichkeit als "äußerlich" eingestuft werden können. Daher können alle derartigen Verfahren als reibungslos angesehen werden . Sie beseitigen einige Details zusammen mit den offensichtlichen Ausreißern. Der Analyst muss eine gewisse Kontrolle über den Kompromiss zwischen der Beibehaltung von Details und der Nichterkennung lokaler Ausreißer haben.)

Ein weiterer Vorteil dieses Verfahrens besteht darin, dass keine rechteckige Wertematrix erforderlich ist. Tatsächlich kann es sogar auf unregelmäßige Daten angewendet werden, indem ein lokaler Glätter verwendet wird, der für solche Daten geeignet ist.

RNeben den meisten Statistikpaketen mit vollem Funktionsumfang sind mehrere robuste lokale Smoothers integriert, z loess. Das folgende Beispiel wurde damit bearbeitet. Die Matrix hat Zeilen und 49 Spalten - fast 4000 Einträge. Es handelt sich um eine komplizierte Funktion mit mehreren lokalen Extrema sowie einer ganzen Linie von Punkten, an denen es nicht unterscheidbar ist (eine "Falte"). Um etwas mehr als 5 % der Punkte - ein sehr hoher Anteil zu betrachten „abgelegenen“ - wurden Gauß - Fehler , deren Standardabweichung hinzugefügt ist nur 1 / 20 der Standardabweichung der ursprünglichen Daten. Dieser synthetische Datensatz bietet viele der herausfordernden Merkmale realistischer Daten.794940005%1/20

Figuren

Beachten Sie, dass (gemäß RKonventionen) die Matrixzeilen als vertikale Streifen gezeichnet werden. Alle Bilder mit Ausnahme der Residuen sind schattiert, um kleine Abweichungen in ihren Werten anzuzeigen. Ohne dies wären fast alle lokalen Ausreißer unsichtbar!

Durch den Vergleich der "unterstellten" (fixierten) mit den "echten" (nicht kontaminierten) Originalbildern wird deutlich, dass das Entfernen der Ausreißer einige, aber nicht alle Falten (die von unten verlaufen ) geglättet hat bis ( 49 , 30 ) ; es ist als hellcyanfarbener Winkelstreifen in der "Residuen" -Darstellung erkennbar).(0,79)(49,30)

Die Flecken in der Darstellung "Residuen" zeigen die offensichtlichen lokal isolierten Ausreißer. In diesem Diagramm wird auch eine andere Struktur (z. B. der Diagonalstreifen) angezeigt, die den zugrunde liegenden Daten zugeordnet werden kann. Man könnte dieses Verfahren verbessern, indem man ein räumliches Modell der Daten ( über geostatistische Methoden) verwendet, aber dies zu beschreiben und zu veranschaulichen, würde uns hier zu weit führen.

Übrigens wurde in diesem Code gemeldet, dass nur der 200 eingeführten Ausreißer gefunden wurden. Dies ist kein Fehlschlag des Verfahrens. Da die Ausreißer normalverteilt waren, lag ihre Größe bei etwa der Hälfte nahe bei Null - 3 oder darunter, verglichen mit zugrunde liegenden Werten mit einem Bereich von über 600 -, die keine nachweisbare Veränderung der Oberfläche bewirkten. 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
quelle
whuber: Verstehe ich es richtig, dass Sie annehmen, dass die Ausreißer isolierte Zellen sind? Wenn ja, würden Sie wissen, wie sensibel diese Vorgehensweise bei Verstößen gegen diese Annahme ist?
user603
@ user603 Ich gehe nicht davon aus, dass die Ausreißer isoliert sind - viele davon im Beispiel nicht -, aber ich gehe davon aus, dass der Anteil der Ausreißer in einer lokalen Nachbarschaft so gering ist, dass sie die lokale Glättung nicht beeinträchtigen. Wenn es ein Viertel mit einem sehr hohen Anteil solcher Ausreißer gibt, können sie möglicherweise nicht mehr als lokale Ausreißer betrachtet werden!
whuber
1
@ user603 Auf jeden Fall! Aber das scheint uns aus der mutmaßlichen Situation herauszubringen, in der "die nächsten Nachbarn die besten Prädiktoren sind". Aus diesem Grund sollte alles, was wir bei der Verarbeitung der Daten tun, diese lokale Vorhersehbarkeit bewahren. Wenn eine Spalte einen "ganz anderen Maßstab" als ihr Nachbar hat, würde dieser Umstand diese festgelegte Annahme ziemlich stark verletzen. (Ich frage mich auch, ob Sie sich auf Spalten konzentrieren: Beim erneuten Lesen der Frage kann ich keine Asymmetrie in den Rollen von Spalten und Zeilen
feststellen
1
p
1
@whuber das ist eine großartige Lösung, danke - ich habe versucht, zumindest einige fehlende Werte einzuführen, was immer eine reale Situation ist - eine Mischung aus fehlenden (zum Beispiel 50 fehlende Werte) und Ausreißern (100 Ausreißern). aufregend !
Rdorlearn
4

Ich würde dir raten, dir diesen Artikel anzuschauen [0]. Das Problem, das angesprochen werden soll, scheint gut zu Ihrer Beschreibung zu passen, mit der Ausnahme, dass die vom Autor vorgeschlagene Methode etwas raffinierter ist als die NN-Eingabe (obwohl sie etwas Ähnliches als Ausgangspunkt verwendet).

XXnp

k

Der erste Schritt jeder Iteration ist der Datenimputationsschritt. Dies geschieht wie beim EM-Algorithmus: Die fehlenden Zellen werden mit dem Wert gefüllt, den sie haben sollen (dies ist der E-Schritt).

XXttRppkLLkkDDkp

Um das Papier zusammenzufassen, hier ist der allgemeine Algorithmus, den sie vorschlagen:

  • l=0WW0XX

  • Dann machen Sie bis zur Konvergenz:

    WWl(ttl,LLl,DDl)

    l=l+1

    YYl=LLl1(WWl1ttl1)(LLl1)

    WWlWWlN(ttl1,LLl1DDl1(LLl1))YYl

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

(ttl1,LLl1DDl1)

Dieser Ansatz bietet Ihnen auch eine Vielzahl von Diagnosetools, mit denen Sie die Qualität der Imputation überprüfen können. Sie können beispielsweise auch mehrere Zeichnungen aus erstellenN(ttl1,LLDD(LL))

Ich weiß nicht , von einem fertig gemacht R Implementierung für diesen Ansatz, aber man kann leicht aus den Teilkomponenten (vor allem einen robusten PCA - Algorithmus) erzeugt werden, und diese sind in R implementiert, finden Sie in das rrcov Paket (das Papier ist ruhig informativ zu diesem Thema).

  • [0] Serneels S. und Verdonck, T. (2008). Hauptkomponentenanalyse für Daten mit Ausreißern und fehlenden Elementen. Computational Statistics & Data Analysis Band: 52 Ausgabe: 3 Seiten: 1712-1727.
user603
quelle
danke, mein Ziel ist es hier nicht, Ausreißer vorherzusagen (in dem Sinne, dass sie von der Verteilung entfernt sind), sondern Off-Werte (Ausreißer), die nicht zum Muster passen.
Rdorlearn
Ich denke, Sie haben meine Antwort falsch verstanden. Dieser Ansatz erzeugt eine Vorhersage für einen beliebigen Wert, die Ausreißer werden jedoch nicht sehr gut vorhergesagt: Dies liegt daran, dass sie die PCA-Anpassung nicht beeinflussen dürfen. Ich rate Ihnen, die Zeitung zu lesen.
user603
danke, der ansatz scheint interessant zu sein und erraten könnte auch gut funktionieren. Aber ohne die richtigen Codes wird es schwierig sein, sie zu implementieren - zumindest für mich zu raffiniert!
Rdorlearn