Entfernen von Ausreißern basierend auf der Entfernung des Kochs in R-Sprache

13

Ich habe diesen R-Code für die lineare Regression:

fit <- lm(target ~ age+sales+income, data = new)

Wie kann man einflussreiche Beobachtungen anhand der Entfernung des Kochs identifizieren und diese aus den Daten in R entfernen?

user3459010
quelle
Hier ist ein schönes Beispiel, das auch eine Einführung in die Verwendung der robusten Regression für den Umgang mit Daten gibt, die Einflusspunkte enthalten: ats.ucla.edu/stat/r/dae/rreg.htm In Zukunft sollten Sie versuchen, a etwas mehr Forschung, bevor Sie eine Frage stellen.
Roland
4
Trotz des Fokus auf Rdenke ich, dass es hier eine aussagekräftige statistische Frage gibt, da verschiedene Kriterien vorgeschlagen wurden, um "einflussreiche" Beobachtungen anhand der Entfernung von Cook zu identifizieren - und einige von ihnen unterscheiden sich stark voneinander. (Nach meiner Erfahrung rlmidentifiziert oder bewertet die von @ Roland referenzierte Funktion, mit deren Code ich bestens vertraut bin, Probleme im Zusammenhang mit einflussreichen Beobachtungen mit kleinen Residuen weder, noch würde ich davon ausgehen, dass Sie dies nicht getan haben Forschung.)
whuber
1
@ Roland- Ich weiß nicht, warum du das Gefühl hast, dass ich meine Recherchen nicht durchgeführt habe, bevor ich dies gepostet habe !! Ich bin auf diesen Link gestoßen, den du geteilt hast, aber er hat mir nichts gebracht! In Zukunft sollten Sie besser mit einer Lösung antworten, indem Sie mir den richtigen Code geben, anstatt Links zu solchen nutzlosen Artikeln zu geben!
user3459010
Einige Diskussionen in Wie man Cooks Entfernungsdiagramme liest? & Cooks Abstandsgrenzwert .
Scortchi - Monica wieder einsetzen

Antworten:

17

Dieser Beitrag hat ungefähr 6000 Aufrufe in 2 Jahren, daher denke ich, dass eine Antwort dringend benötigt wird. Obwohl ich viele Ideen aus der Referenz entlehnt habe, habe ich einige Änderungen vorgenommen. Wir werden die carsDaten in verwenden base r.

library(tidyverse)

# Inject outliers into data.
cars1 <- cars[1:30, ]  # original data
cars_outliers <- data.frame(speed=c(1,19), dist=c(198,199))  # introduce outliers.
cars2 <- rbind(cars1, cars_outliers)  # data with outliers.

Zeichnen wir die Daten mit Ausreißern, um zu sehen, wie extrem sie sind.

# Plot of data with outliers.

plot1 <- ggplot(data = cars1, aes(x = speed, y = dist)) +
        geom_point() + 
        geom_smooth(method = lm) +
        xlim(0, 20) + ylim(0, 220) + 
        ggtitle("No Outliers")
plot2 <- ggplot(data = cars2, aes(x = speed, y = dist)) +
        geom_point() + 
        geom_smooth(method = lm) +
        xlim(0, 20) + ylim(0, 220) + 
        ggtitle("With Outliers")

gridExtra::grid.arrange(plot1, plot2, ncol=2)

Vergleich 1

Wir können sehen, dass die Regressionslinie nach Einführung der Ausreißer schlecht passt. Lassen Sie uns deshalb Cooks Distanz, um sie zu identifizieren. Ich verwende den traditionellen Cut-Off von . Beachten Sie, dass der Grenzwert Ihnen nur hilft, darüber nachzudenken, was mit den Daten nicht stimmt .4n

mod <- lm(dist ~ speed, data = cars2)
cooksd <- cooks.distance(mod)

# Plot the Cook's Distance using the traditional 4/n criterion
sample_size <- nrow(cars2)
plot(cooksd, pch="*", cex=2, main="Influential Obs by Cooks distance")  # plot cook's distance
abline(h = 4/sample_size, col="red")  # add cutoff line
text(x=1:length(cooksd)+1, y=cooksd, labels=ifelse(cooksd>4/sample_size, names(cooksd),""), col="red")  # add labels

Cook's Distance Plot

Es gibt viele Möglichkeiten, mit Ausreißern umzugehen, wie in der Referenz angegeben. Jetzt möchte ich sie einfach entfernen.

# Removing Outliers
# influential row numbers
influential <- as.numeric(names(cooksd)[(cooksd > (4/sample_size))])

# Alternatively, you can try to remove the top x outliers to have a look
# top_x_outlier <- 2
# influential <- as.numeric(names(sort(cooksd, decreasing = TRUE)[1:top_x_outlier]))

cars2_screen <- cars2[-influential, ]

plot3 <- ggplot(data = cars2, aes(x = speed, y = dist)) +
        geom_point() + 
        geom_smooth(method = lm) +
        xlim(0, 20) + ylim(0, 220) + 
        ggtitle("Before")
plot4 <- ggplot(data = cars2_screen, aes(x = speed, y = dist)) +
        geom_point() + 
        geom_smooth(method = lm) +
        xlim(0, 20) + ylim(0, 220) + 
        ggtitle("After")

gridExtra::grid.arrange(plot3, plot4, ncol=2)

Vor und nach dem Vergleich

Hurra, wir haben die Ausreißer erfolgreich entfernt ~

Hervorragende Referenz: Ausreißerbehandlung

Jetlag
quelle
# Detecting outliers in cars dataset; fit<- lm(dist ~ speed, data = cars); cars$cooksd <- cooks.distance(fit); # Defining outliers based on 4/n criteria; cars$outlier <- ifelse(cars$cooksd < 4/nrow(cars), "keep","delete")Dies ist so ziemlich das Gleiche, aber in nur 4 Codezeilen. Die endgültige Ausgabe enthält eine Spalte mit dem Namen Ausreißer, in der "Löschen" angegeben ist, wenn festgestellt wird, dass der Wert ein Ausreißer ist.
Mohit Sharma