Wenn Sie wirklich wollen dies tun (entfernen Sie die größten (absoluten) Residuen), dann können wir das lineare Modell verwenden, um die geringste Schätzung Quadrate Lösung und zugehörige Residuen und wählen Sie dann die mittleren n% der Daten. Hier ein Beispiel:
Zunächst einige Dummy-Daten erzeugen:
require(MASS) ## for mvrnorm()
set.seed(1)
dat <- mvrnorm(1000, mu = c(4,5), Sigma = matrix(c(1,0.8,1,0.8), ncol = 2))
dat <- data.frame(dat)
names(dat) <- c("X","Y")
plot(dat)
Als nächst wir das lineare Modell passen und die Residuen extrahieren:
res <- resid(mod <- lm(Y ~ X, data = dat))
Die quantile()
Funktion kann uns die erforderlichen Quantile der Residuen. Sie schlugen vor 90% der Daten beibehalten wird, so wollen wir die oberen und unteren 0,05 quantiles:
res.qt <- quantile(res, probs = c(0.05,0.95))
Wählen Sie diese Beobachtungen mit Residuen in der Mitte 90% der Daten:
want <- which(res >= res.qt[1] & res <= res.qt[2])
Wir können dann visualisieren diese, mit den roten Punkten diejenigen sind wir behalten:
plot(dat, type = "n")
points(dat[-want,], col = "black", pch = 21, bg = "black", cex = 0.8)
points(dat[want,], col = "red", pch = 21, bg = "red", cex = 0.8)
abline(mod, col = "blue", lwd = 2)
Die Korrelationen für die vollständigen Daten und der ausgewählten Teilmenge sind:
> cor(dat)
X Y
X 1.0000000 0.8935235
Y 0.8935235 1.0000000
> cor(dat[want,])
X Y
X 1.0000000 0.9272109
Y 0.9272109 1.0000000
> cor(dat[-want,])
X Y
X 1.000000 0.739972
Y 0.739972 1.000000
Beachten Sie, dass hier könnten wir ganz gute Daten werfen werden, weil wir die 5% mit der größten positiven Residuen und 5% mit der gerade wählen größtes Negativ. Eine Alternative ist es, das 90% mit kleinsten absoluten Residuen wählen:
ares <- abs(res)
absres.qt <- quantile(ares, prob = c(.9))
abswant <- which(ares <= absres.qt)
## plot - virtually the same, but not quite
plot(dat, type = "n")
points(dat[-abswant,], col = "black", pch = 21, bg = "black", cex = 0.8)
points(dat[abswant,], col = "red", pch = 21, bg = "red", cex = 0.8)
abline(mod, col = "blue", lwd = 2)
Mit dieser etwas anderen Teilmenge ist die Korrelation etwas niedriger:
> cor(dat[abswant,])
X Y
X 1.0000000 0.9272032
Y 0.9272032 1.0000000
Ein weiterer Punkt ist, dass selbst dann wir werfen gute Daten aus. Sie sollten sich Cooks Entfernung als Maß für die Stärke der Ausreißer ansehen und nur die Werte oberhalb einer bestimmten Cook-Distanz verwerfen.Wikipedia hat Informationen über Cooks Entfernung und vorgeschlagene Schwellenwerte.
> head(cooks.distance(mod))
1 2 3 4 5 6
7.738789e-04 6.056810e-04 6.375505e-04 4.338566e-04 1.163721e-05 1.740565e-03
und wenn Sie die Schwelle (n) vorgeschlagen diejenigen, die die Schwelle überschreiten nur auf Wikipedia, und entfernen Sie berechnen: Die cooks.distance()
Funktion können die Werte von mod
abzurufen verwendet werden. Für diese Daten:
> any(cooks.distance(mod) > 1)
[1] FALSE
> any(cooks.distance(mod) > (4 * nrow(dat)))
[1] FALSE
keiner der Abstände Cook übersteigen die vorgeschlagenen Schwellenwerte (. Nicht überraschend angesichts der Art, wie ich die Daten generiert)
all dies gesagt ist, warum tun Sie dies tun wollen? Wenn Sie nur versuchen, Daten loszuwerden, um eine Korrelation zu verbessern oder eine signifikante Beziehung zu generieren, klingt das ein bisschen fischig und etwas wie Daten, die mich ausgraben.
Was halten Sie einen Ausreißer hier in Betracht ziehen? Abweichung von der Fit-Linie der kleinsten Quadrate (d. H. Größte Residuen) oder Werte an den Extremen der bivariaten Verteilung von "x" und "y"? –
@Gavin Hier betrachte ich die größten Residuen als Ausreißer. – Leo