Jak dodać nieliniową linię trendu do wykresu rozrzutu w R? [Zamknięte]

27

Mam wykres rozproszenia. Jak mogę dodać nieliniową linię trendu?

Karina Khusainova
źródło
4
Czy masz już równanie krzywej trendu, czy dodanie go obejmuje obliczenie równania z danych?
whuber

Odpowiedzi:

34

Stwórzmy trochę danych.

n <- 100
x <- seq (n)
y <- rnorm (n, 50 + 30 * x ^ (- 0,2), 1)
Dane <- data.frame (x, y)

Poniżej pokazano, jak dopasować linię lessa lub dopasowanie regresji nieliniowej.

wykres (y ~ x, dane)

# dopasuj linię lessa
loess_fit <- loess (y ~ x, dane)
linie (dane $ x, przewidywanie (loess_fit), col = "niebieski")

# dopasuj regresję nieliniową
nls_fit <- nls (y ~ a + b * x ^ (- c), Dane, start = lista (a = 80, b = 20, 
    c = 0,2))
wiersze (dane $ x, przewidywanie (nls_fit), col = "czerwony")

wykres fragmentu export_plot

Jeromy Anglim
źródło
1
o spiskowaniu, dla tych, którzy mają problemy z zamówieniem, ta rada jest przydatna
tflutre
23

Jeśli użyjesz ggplot2(trzeci system kreślenia, w R, po podstawie R i sieci), staje się to:

library(ggplot2)
ggplot(Data, aes(x,y)) + geom_point() + geom_smooth()

wątek

Możesz wybrać sposób wygładzania danych: zobacz ?stat_smoothszczegóły i przykłady.

Vincent Zoonekynd
źródło
Niezły wykres i wyjaśnienie! Ale co oznacza obszar cienia?
Darwin PC,
3
Zacieniony obszar to przedział ufności wokół wygładzonej linii. Mógłbyś się o tym przekonać, wchodząc do pliku pomocy R, stat_smoothpisząc, ?stat_smoothjak stwierdził Vincent. :-)
Lubię kod
9

Nie wiedząc dokładnie, czego szukasz, korzystając z latticepakietu możesz łatwo dodać krzywą lessa type="smooth"; na przykład,

> library(lattice)
> x <- rnorm(100)
> y <- rnorm(100)
> xyplot(y ~ x, type=c("smooth", "p"))

Zobacz help("panel.loess")argumenty, które można przekazać do procedury dopasowania lessowego, aby na przykład zmienić stopień wielomianu, który ma zostać użyty.

wprowadź opis zdjęcia tutaj

Aktualizacja

Aby zmienić kolor krzywej lessa, możesz napisać małą funkcję i przekazać ją jako panelparametr do 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)

wprowadź opis zdjęcia tutaj

Jason Morgan
źródło
jak zmieniłbyś linię na inny kolor?
EngrStudent - Przywróć Monikę
1
@EngrStudent Zaktualizowałem swoją odpowiedź.
Jason Morgan
8

Twoje pytanie jest trochę niejasne, więc przyjmuję pewne założenia dotyczące twojego problemu. Bardzo pomogłoby, gdybyś mógł umieścić wykres rozrzutu i trochę opisać dane. Proszę, jeśli przyjmuję złe założenia, zignoruj ​​moją odpowiedź.

Po pierwsze, możliwe jest, że twoje dane opisują proces, który Twoim zdaniem jest nieliniowy. Na przykład, jeśli próbujesz wykonać regresję odległości, aby samochód zatrzymał się z nagłym hamowaniem w stosunku do prędkości samochodu, fizyka mówi nam, że energia pojazdu jest proporcjonalna do kwadratu prędkości - nie prędkości samo. Więc możesz spróbować w tym przypadku regresji wielomianowej i (w R) możesz zrobić coś takiego model <- lm(d ~ poly(v,2),data=dataset). Istnieje wiele dokumentacji na temat tego, jak wprowadzić różne nieliniowości do modelu regresji.

Z drugiej strony, jeśli masz linię, która jest „chwiejna” i nie wiesz, dlaczego jest chwiejna, dobrym punktem początkowym byłaby prawdopodobnie regresja lokalnie ważona, lub loessw R. Wykonuje to regresję liniową na małej region, w przeciwieństwie do całego zestawu danych. Najłatwiej jest wyobrazić sobie wersję „k najbliższego sąsiada”, w której w celu obliczenia wartości krzywej w dowolnym punkcie można znaleźć k punktów najbliższych ciekawemu punktowi i uśrednić je. Loess jest taki, ale używa regresji zamiast prostej średniej. W tym celu użyj model <- loess(y ~ x, data=dataset, span=...), gdy spanzmienna kontroluje stopień wygładzenia.

Z drugiej strony (zabraknie rąk) - mówisz o trendach? Czy to tymczasowy problem? Jeśli tak, zachowaj ostrożność przy interpretacji linii trendu i znaczenia statystycznego. Trendy w szeregach czasowych mogą pojawiać się w procesach „autoregresyjnych”, a dla tych procesów losowość procesu może czasami konstruować trendy z przypadkowego hałasu, a zły test istotności statystycznej może stwierdzić, że jest znaczący, gdy nie jest!

Patrick Caldon
źródło
6

Umieszczanie punktów próbkowania wykresu punktowego i gładkiej krzywej na tym samym wykresie:

  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

Wykres punktowy z gładką krzywą

Jim Robertson
źródło