Ich habe eine Streudiagramm. Wie kann ich eine nichtlineare Trendlinie hinzufügen?
Ich habe eine Streudiagramm. Wie kann ich eine nichtlineare Trendlinie hinzufügen?
Antworten:
Lassen Sie uns einige Daten erstellen.
n <- 100 x <- seq (n) y <- rnorm (n, 50 + 30 * x ^ (- 0,2), 1) Daten <- Daten.Frame (x, y)
Im Folgenden wird gezeigt, wie Sie eine Lösslinie oder die Anpassung einer nichtlinearen Regression anpassen können.
Handlung (y ~ x, Daten) # eine Lößlinie einpassen loess_fit <- loess (y ~ x, Daten) Linien (Data $ x, predict (loess_fit), col = "blue") # Passen Sie eine nichtlineare Regression an nls_fit <- nls (y ~ a + b * x ^ (- c), Daten, start = liste (a = 80, b = 20, c = 0,2)) lines (Data $ x, predict (nls_fit), col = "red")
Wenn Sie verwenden ggplot2
(das dritte Zeichnungssystem in R nach Basis R und Gitter), wird dies zu:
library(ggplot2)
ggplot(Data, aes(x,y)) + geom_point() + geom_smooth()
Sie können festlegen, wie die Daten geglättet werden sollen: ?stat_smooth
Einzelheiten und Beispiele finden Sie unter.
stat_smooth
zugegriffen haben, indem Sie ?stat_smooth
wie von Vincent angegeben tippten. :-)
Ohne genau zu wissen, wonach Sie suchen, können Sie mit dem lattice
Paket ganz einfach eine Lösskurve hinzufügen type="smooth"
. z.B,
> library(lattice)
> x <- rnorm(100)
> y <- rnorm(100)
> xyplot(y ~ x, type=c("smooth", "p"))
Siehe help("panel.loess")
Argumente, die an die Löß-Anpassungsroutine übergeben werden können, um beispielsweise den Grad des zu verwendenden Polynoms zu ändern.
Aktualisieren
Um die Farbe der Lösskurve zu ändern, können Sie eine kleine Funktion schreiben und als panel
Parameter übergeben an xyplot
:
x <- rnorm(100)
y <- rnorm(100)
panel_fn <- function(x, y, ...)
{
panel.xyplot(x, y, ...)
panel.xyplot(x, y, type="smooth", col="red", ...)
}
xyplot(y ~ x, panel=panel_fn)
Ihre Frage ist ein bisschen vage, deshalb werde ich einige Annahmen darüber machen, was Ihr Problem ist. Es wäre sehr hilfreich, wenn Sie ein Streudiagramm erstellen und die Daten ein wenig beschreiben könnten. Wenn ich schlechte Annahmen mache, ignoriere bitte meine Antwort.
Erstens ist es möglich, dass Ihre Daten einen Prozess beschreiben, den Sie vernünftigerweise für nicht linear halten. Wenn Sie beispielsweise versuchen, die Entfernung zu verringern, in der ein Auto mit plötzlichem Bremsen anhält, und dies im Verhältnis zur Geschwindigkeit des Autos, sagt uns die Physik, dass die Energie des Fahrzeugs proportional zum Quadrat der Geschwindigkeit ist - nicht zur Geschwindigkeit selbst. Vielleicht möchten Sie in diesem Fall die polynomiale Regression ausprobieren, und (in R) können Sie so etwas tun model <- lm(d ~ poly(v,2),data=dataset)
. Es gibt eine Menge Dokumentation darüber, wie verschiedene Nichtlinearitäten in das Regressionsmodell aufgenommen werden können.
Auf der anderen Seite, wenn Sie eine Linie haben, die "wackelig" ist und Sie nicht wissen, warum sie wackelig ist, dann wäre ein guter Ausgangspunkt wahrscheinlich eine lokal gewichtete Regression oder loess
in R. Dies führt eine lineare Regression auf einer kleinen Linie durch Region, im Gegensatz zum gesamten Datensatz. Es ist am einfachsten, sich eine "k am nächsten Nachbarn" -Version vorzustellen, bei der Sie den Wert der Kurve an einem beliebigen Punkt berechnen, die k Punkte finden, die dem interessierenden Punkt am nächsten liegen, und sie mitteln. Löss ist einfach so, verwendet aber eine Regression anstelle eines geraden Durchschnitts. Verwenden Sie dazu model <- loess(y ~ x, data=dataset, span=...)
, wobei die span
Variable den Grad der Glättung steuert.
Auf der dritten Hand (aus den Händen laufen) - sprechen Sie über Trends? Ist das ein zeitliches Problem? Wenn dies der Fall ist, seien Sie vorsichtig, wenn Sie die Trendlinien und die statistische Signifikanz überschätzen. Trends in Zeitreihen können in "autoregressiven" Prozessen auftreten, und für diese Prozesse kann die Zufälligkeit des Prozesses gelegentlich Trends aus zufälligem Rauschen konstruieren, und der falsche statistische Signifikanztest kann Ihnen sagen, dass er signifikant ist, wenn er nicht signifikant ist!
Beispielpunkte für Streudiagramme und glatte Kurve in dasselbe Diagramm einfügen:
library(graphics)
## Create some x,y sample points falling on hyperbola, but with error:
xSample = seq(0.1, 1.0, 0.1)
ySample = 1.0 / xSample
numPts <- length(xSample)
ySample <- ySample + 0.5 * rnorm(numPts) ## Add some noise
## Create x,y points for smooth hyperbola:
xCurve <- seq(0.1, 1.0, 0.001)
yCurve <- 1.0 / xCurve
plot(xSample, ySample, ylim = c(0.0, 12.0)) ## Plot the sample points
lines(xCurve, yCurve, col = 'green', lty = 1) ## Plot the curve