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 cars
Daten 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)
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
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)
Hurra, wir haben die Ausreißer erfolgreich entfernt ~
Hervorragende Referenz: Ausreißerbehandlung