Ich versuche eine glatte Kurve zu zeichnen R
. Ich habe die folgenden einfachen Spielzeugdaten:
> x
[1] 1 2 3 4 5 6 7 8 9 10
> y
[1] 2 4 6 8 7 12 14 16 18 20
Wenn ich es jetzt mit einem Standardbefehl zeichne, sieht es natürlich holprig und nervös aus:
> plot(x,y, type='l', lwd=2, col='red')
Wie kann ich die Kurve glatt machen, damit die 3 Kanten mit geschätzten Werten gerundet werden? Ich weiß, dass es viele Methoden gibt, um eine glatte Kurve anzupassen, aber ich bin mir nicht sicher, welche für diese Art von Kurve am besten geeignet ist und wie Sie sie schreiben würden R
.
r
plot
curve-fitting
Frank
quelle
quelle
Antworten:
Ich mag
loess()
viel zum Glätten:Venables und Ripleys MASS-Buch enthält einen ganzen Abschnitt über das Glätten, der auch Splines und Polynome behandelt - aber
loess()
fast jedermanns Favorit.quelle
x
undy
sind sichtbare Variablen. Wenn es sich um Spalten eines data.frame mit dem Namen handeltfoo
, fügen Siedata=foo
demloess(y ~ x. data=foo)
Aufruf eine Option hinzu - genau wie bei fast allen anderen Modellierungsfunktionen in R.supsmu()
als Out-of-the-Box-Glätterlo <- loess(count~day, data=logins_per_day)
), erhalte ich Folgendes:Error: NA/NaN/Inf in foreign function call (arg 2) In addition: Warning message: NAs introduced by coercion
Möglicherweise ist glatt.spline eine Option. Hier können Sie einen Glättungsparameter (normalerweise zwischen 0 und 1) festlegen
Sie können Predict auch für Smooth.Spline-Objekte verwenden. Die Funktion wird mit Basis R geliefert. Weitere Informationen finden Sie unter? Smooth.spline.
quelle
Um es wirklich glatt zu bekommen ...
Dieser Stil interpoliert viele zusätzliche Punkte und liefert eine Kurve, die sehr glatt ist. Es scheint auch der Ansatz zu sein, den ggplot verfolgt. Wenn die Standardglätte in Ordnung ist, können Sie sie einfach verwenden.
quelle
Die Funktion qplot () im Paket ggplot2 ist sehr einfach zu verwenden und bietet eine elegante Lösung, die Konfidenzbänder enthält. Zum Beispiel,
produziert
quelle
ggplot2
erfolgreich installiert, kann aber nicht ausgeführt werden,qplot
da die Funktion in Debian 8.5 nicht gefunden werden kann.LOESS ist ein sehr guter Ansatz, wie Dirk sagte.
Eine andere Option ist die Verwendung von Bezier-Splines, die in einigen Fällen besser funktionieren als LOESS, wenn Sie nicht viele Datenpunkte haben.
Hier finden Sie ein Beispiel: http://rosettacode.org/wiki/Cubic_bezier_curves#R
quelle
Die anderen Antworten sind alle gute Ansätze. Es gibt jedoch einige andere Optionen in R, die nicht erwähnt wurden, einschließlich
lowess
undapprox
, die möglicherweise eine bessere Passform oder eine schnellere Leistung ergeben.Die Vorteile lassen sich mit einem alternativen Datensatz leichter demonstrieren:
Hier sind die Daten, die mit der Sigmoidkurve überlagert sind, die sie generiert hat:
Diese Art von Daten ist häufig, wenn ein binäres Verhalten in einer Population betrachtet wird. Dies kann beispielsweise ein Diagramm darüber sein, ob ein Kunde etwas gekauft hat (ein binäres 1/0 auf der y-Achse) oder nicht, und wie viel Zeit er auf der Site verbracht hat (x-Achse).
Eine große Anzahl von Punkten wird verwendet, um die Leistungsunterschiede dieser Funktionen besser zu demonstrieren.
Smooth
,spline
Undsmooth.spline
alle Produkte Kauderwelsch auf einem Datensatz , wie dies mit jedem Satz von Parametern habe ich versucht, vielleicht aufgrund ihrer Neigung zu jedem Punkt auf der Karte, die für verrauschte Daten nicht funktioniert.Die
loess
,lowess
undapprox
Funktionen alle Produkte brauchbare Ergebnisse, wenn auch nur knapp fürapprox
. Dies ist der Code für jeden, der leicht optimierte Parameter verwendet:Und die Ergebnisse:
Wie Sie sehen können,
lowess
ergibt sich eine nahezu perfekte Anpassung an die ursprüngliche Erzeugungskurve.Loess
ist nah, erfährt aber eine merkwürdige Abweichung an beiden Schwänzen.Obwohl Ihr Datensatz sehr unterschiedlich sein wird, habe ich festgestellt, dass andere Datensätze ähnlich funktionieren, mit beiden
loess
undlowess
in der Lage sind, gute Ergebnisse zu erzielen. Die Unterschiede werden bedeutender, wenn Sie sich Benchmarks ansehen:Loess
ist extrem langsam und dauert 100x so lange wieapprox
.Lowess
liefert bessere Ergebnisse alsapprox
, läuft aber immer noch ziemlich schnell (15x schneller als Löss).Loess
Mit zunehmender Anzahl von Punkten bleibt es auch zunehmend stecken und wird um 50.000 unbrauchbar.BEARBEITEN: Zusätzliche Untersuchungen zeigen, dass
loess
bestimmte Datensätze besser passen. Wenn Sie mit einem kleinen Datensatz arbeiten oder die Leistung keine Rolle spielt, probieren Sie beide Funktionen aus und vergleichen Sie die Ergebnisse.quelle
In ggplot2 können Sie Glättungen auf verschiedene Arten durchführen, zum Beispiel:
quelle
Diese Methode wurde nicht angezeigt. Wenn also jemand anderes dies tun möchte, stellte ich fest, dass in der ggplot-Dokumentation eine Technik für die Verwendung der
gam
Methode vorgeschlagen wurde, die ähnliche Ergebnisse wieloess
bei der Arbeit mit kleinen Datenmengen liefert.Erstens mit der Lössmethode und der automatischen Formel. Zweitens mit der Gam-Methode mit der vorgeschlagenen Formel
quelle