Wie füge ich eine nichtlineare Trendlinie zu einem Streudiagramm in R hinzu? [geschlossen]

27

Ich habe eine Streudiagramm. Wie kann ich eine nichtlineare Trendlinie hinzufügen?

Karina Khusainova
quelle
4
Haben Sie bereits die Gleichung der Trendkurve oder beinhaltet das Hinzufügen die Berechnung der Gleichung aus den Daten?
whuber

Antworten:

34

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")

plot of chunk export_plot

Jeromy Anglim
quelle
1
Für die Verschwörung von Ordnungsproblemen ist dieser Ratschlag hilfreich
Flutre
23

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()

Handlung

Sie können festlegen, wie die Daten geglättet werden sollen: ?stat_smoothEinzelheiten und Beispiele finden Sie unter.

Vincent Zoonekynd
quelle
Schöne Grafik und Erklärung! Aber was bedeutet der Schattenbereich?
Darwin PC
3
Der schattierte Bereich ist das Konfidenzintervall um die geglättete Linie. Sie hätten dies selbst herausfinden können, indem Sie auf die R-Hilfedatei stat_smoothzugegriffen haben, indem Sie ?stat_smoothwie von Vincent angegeben tippten. :-)
Ich mag es, den
9

Ohne genau zu wissen, wonach Sie suchen, können Sie mit dem latticePaket 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.

Bildbeschreibung hier eingeben

Aktualisieren

Um die Farbe der Lösskurve zu ändern, können Sie eine kleine Funktion schreiben und als panelParameter ü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)

Bildbeschreibung hier eingeben

Jason Morgan
quelle
Wie würden Sie die Linie eine andere Farbe machen?
EngrStudent - Wiedereinsetzung von Monica am
1
@EngrStudent Ich habe meine Antwort aktualisiert.
Jason Morgan
8

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 loessin 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 spanVariable 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!

Patrick Caldon
quelle
6

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

Streudiagramm mit glatter Kurve

Jim Robertson
quelle