R: Wie entfernt ich Ausreißer aus einem glatteren in ggPlot2?
-
25-09-2019 - |
Frage
Ich habe den folgenden Datensatz, den ich mit GGPLOT2 zeichnen möchte. Es handelt sich um eine Zeitreihe von drei Experimenten A1, B1 und C1, und jedes Experiment hatte drei Replikate.
Ich versuche einen Status hinzuzufügen, der Ausreißer erfasst und beseitigt, bevor ich einen glatteren (Mittelwert und Varianz?) Zurückgibt. Ich habe meine eigene Ausreißerfunktion geschrieben (nicht gezeigt), aber ich gehe davon aus, dass es bereits eine Funktion gibt, die dies tut, ich habe sie einfach nicht gefunden.
Ich habe mir stat_sum_df ("median_hilow", geom = "sanft") aus einigen Beispielen im GGPLOT2 -Buch angesehen, aber ich habe das Hilfedoc von HMISC nicht verstanden, um zu sehen, ob es Ausreißer beseitigt oder nicht.
Gibt es eine Funktion, um solche Ausreißer in GGPlot zu entfernen, oder wo würde ich meinen Code unten ändern, um meine eigene Funktion hinzuzufügen?
EDIT: Ich habe das gerade gesehen (So verwenden Sie Ausreißer -Tests im R -Code) und Beachten Sie, dass Hadley eine robuste Methode wie RLM empfiehlt. Ich zeichne bakterielle Wachstumskurven auf, daher denke ich nicht, dass ein lineares Modell am besten ist, aber alle Ratschläge zu anderen Modellen oder die Verwendung oder Verwendung robuster Modelle in dieser Situation wären geschätzt.
library (ggplot2)
data = data.frame (day = c(1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7), od =
c(
0.1,1.0,0.5,0.7
,0.13,0.33,0.54,0.76
,0.1,0.35,0.54,0.73
,1.3,1.5,1.75,1.7
,1.3,1.3,1.0,1.6
,1.7,1.6,1.75,1.7
,2.1,2.3,2.5,2.7
,2.5,2.6,2.6,2.8
,2.3,2.5,2.8,3.8),
series_id = c(
"A1", "A1", "A1","A1",
"A1", "A1", "A1","A1",
"A1", "A1", "A1","A1",
"B1", "B1","B1", "B1",
"B1", "B1","B1", "B1",
"B1", "B1","B1", "B1",
"C1","C1", "C1", "C1",
"C1","C1", "C1", "C1",
"C1","C1", "C1", "C1"),
replicate = c(
"A1.1","A1.1","A1.1","A1.1",
"A1.2","A1.2","A1.2","A1.2",
"A1.3","A1.3","A1.3","A1.3",
"B1.1","B1.1","B1.1","B1.1",
"B1.2","B1.2","B1.2","B1.2",
"B1.3","B1.3","B1.3","B1.3",
"C1.1","C1.1","C1.1","C1.1",
"C1.2","C1.2","C1.2","C1.2",
"C1.3","C1.3","C1.3","C1.3"))
> data
day od series_id replicate
1 1 0.10 A1 A1.1
2 3 1.00 A1 A1.1
3 5 0.50 A1 A1.1
4 7 0.70 A1 A1.1
5 1 0.13 A1 A1.2
6 3 0.33 A1 A1.2
7 5 0.54 A1 A1.2
8 7 0.76 A1 A1.2
9 1 0.10 A1 A1.3
10 3 0.35 A1 A1.3
11 5 0.54 A1 A1.3
12 7 0.73 A1 A1.3
13 1 1.30 B1 B1.1
... etc...
Das habe ich bisher und arbeitet gut, aber Ausreißer werden nicht entfernt:
r <- ggplot(data = data, aes(x = day, y = od))
r + geom_point(aes(group = replicate, color = series_id)) + # add points
geom_line(aes(group = replicate, color = series_id)) + # add lines
geom_smooth(aes(group = series_id)) # add smoother, average of each replicate
Bearbeiten: Ich habe gerade zwei Diagramme hinzugefügt, in denen Beispiele für die Ausreißerprobleme, die ich aus den realen Daten habe, und nicht die obigen Beispieldaten.
Die ersten Diagramme zeigen die Serie P26S4 und um Tag 32 etwas wirklich Seltsames in zwei der Replikate und zeigen 2 Ausreißer.
Die zweite Diagramm zeigt die Serie P22S5 und am 18. Tag, etwas Seltsames fuhr mit der Lesung an diesem Tag, wahrscheinlich für Maschinenfehler, denke ich.
Im Moment spreche ich die Daten auf, um zu überprüfen, ob die Wachstumskurven in Ordnung aussehen. Nachdem ich Hadleys Rat beantragt und familie = "symmetrisch" eingestellt hatte, bin ich zuversichtlich, dass die loess glattere Aufgabe die Ignorierung der Ausreißer leistet.
@Peter/@Hadley, das nächste, was ich gerne tun möchte, ist zu versuchen, eine logistische, Gompertz- oder Richard -Wachstumskurve an diese Daten anstelle einer Löss zu passen und die Wachstumsrate in der Exponentialstufe zu berechnen. Schließlich plane ich das Grofit -Paket in R (http://cran.r-project.org/web/packages/grofit/index.html), aber im Moment möchte ich diese manuell mit ggplot2 prüfen, wenn möglich. Wenn Sie irgendwelche Hinweise haben, wäre es sehr geschätzt.
Lösung
Hast du das ausprobiert family = "symmetric"
Argument an geom_smooth
(was wiederum an weitergegeben wird loess
)? Dadurch wird die Löss glatt resistent gegen Ausreißer.
Warum ist eine lineare Anpassung Ihrer Meinung nach nicht angemessen? Sie haben nur 4 x Werte, und es scheint sicherlich keine starken Beweise für eine Abweichung von der Linearität zu geben.
Andere Tipps
Erstens bin ich mir nicht sicher, ob ein „Ausreißer“ auf solch kleinen Daten ordnungsgemäß definiert ist.
Zweitens müssten Sie dann entscheiden, was Sie unter "Ausreißer" meinen, dh es ist eines der Drogen, eines der Replikate oder eines der Zeitpunkte?
Wie Hadley bemerkt, gibt es kaum Hinweise auf Abweichung von der Linearität.
Schließlich denke ich, dass ein Teil der Verwendung eines reibungsloseren Einsatzes ist, dass es sich gut mit Ausreißern befasst, vorausgesetzt, es gibt genügend Daten. Aber du hast sehr wenig.
Ich muss also genau fragen, warum Sie Ausreißer entfernen möchten. Was machen Sie mit diesen Daten (abgesehen davon, dass Sie nette Handlungen machen)?
ich hoffe das hilft