Mam wykres rozproszenia. Jak mogę dodać nieliniową linię trendu?
Mam wykres rozproszenia. Jak mogę dodać nieliniową linię trendu?
Odpowiedzi:
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")
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()
Możesz wybrać sposób wygładzania danych: zobacz ?stat_smooth
szczegóły i przykłady.
stat_smooth
pisząc, ?stat_smooth
jak stwierdził Vincent. :-)
Nie wiedząc dokładnie, czego szukasz, korzystając z lattice
pakietu 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.
Aktualizacja
Aby zmienić kolor krzywej lessa, możesz napisać małą funkcję i przekazać ją jako panel
parametr 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)
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 loess
w 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 span
zmienna 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!
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