У мене сюжет розкидання. Як я можу додати нелінійну лінію тренду?
У мене сюжет розкидання. Як я можу додати нелінійну лінію тренду?
Відповіді:
Давайте створимо деякі дані.
n <- 100 x <- seq (n) y <- rnorm (n, 50 + 30 * x ^ (- 0,2), 1) Дані <- data.frame (x, y)
Далі показано, як можна підходити до лессесу або нелінійної регресії.
сюжет (y ~ x, Дані) # підходити до льосової лінії loess_fit <- loess (y ~ x, дані) рядки (дані $ x, прогнозувати (loess_fit), col = "синій") # підходить нелінійна регресія nls_fit <- nls (y ~ a + b * x ^ (- c), Дані, start = список (a = 80, b = 20, c = 0,2)) рядки (дані $ x, прогнозувати (nls_fit), col = "червоний")
Якщо ви використовуєте ggplot2
(третя система побудови графіку, в R, після основи R та решітки), це стає:
library(ggplot2)
ggplot(Data, aes(x,y)) + geom_point() + geom_smooth()
Ви можете вибрати спосіб згладжування даних: див. ?stat_smooth
Подробиці та приклади.
stat_smooth
, ввівши, ?stat_smooth
як заявив Вінсент. :-)
Не знаючи, що саме ви шукаєте, використовуючи lattice
пакет, ви можете легко додати криву льосу type="smooth"
; наприклад,
> library(lattice)
> x <- rnorm(100)
> y <- rnorm(100)
> xyplot(y ~ x, type=c("smooth", "p"))
Ознайомтеся help("panel.loess")
з аргументами, які можуть бути передані розпорядку лесового пристосування, щоб змінити, наприклад, ступінь полінома, який слід використовувати.
Оновлення
Щоб змінити колір кривої льосу, ви можете написати невелику функцію і передати її як panel
параметр 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)
Ваше запитання трохи розпливчасте, тому я збираюся зробити деякі припущення щодо вашої проблеми. Це дуже допоможе, якби ви могли поставити розсип і трохи описати дані. Будь ласка, якщо я роблю погані припущення, ігноруйте мою відповідь.
По-перше, можливо, ваші дані описують певний процес, який, на вашу думку, нелінійний. Наприклад, якщо ви намагаєтесь зробити регресію на відстань, щоб зупинити автомобіль при раптовому гальмуванні проти швидкості автомобіля, фізика говорить нам, що енергія транспортного засобу пропорційна квадрату швидкості - не швидкості себе. Тому ви можете спробувати поліноміальну регресію в цьому випадку, і (в R) ви могли б зробити щось на кшталт model <- lm(d ~ poly(v,2),data=dataset)
. Існує багато документації про те, як включити різні нелінійності в регресійну модель.
З іншого боку, якщо у вас є лінія, яка є "хиткою", і ви не знаєте, чому це коливання, то гарною відправною точкою, ймовірно, буде місцева зважена регресія, або loess
в Р. Це лінійна регресія на малій регіон, на відміну від усього набору даних. Найпростіше уявити версію "k найближчого сусіда", де для обчислення значення кривої в будь-якій точці ви знайдете k точок, найближчих до точки, що цікавить, та їх середнє значення. Лосс просто такий, але використовує регресію замість прямого середнього. Для цього використовуйте model <- loess(y ~ x, data=dataset, span=...)
, де span
змінна контролює ступінь згладжування.
З третьої сторони (вичерпані руки) - ви говорите про тенденції? Це тимчасова проблема? Якщо це так, будьте обережні з надто інтерпретацією тенденційних ліній та статистичної значущості. Тенденції часових рядів можуть з'являтися в "авторегресивних" процесах, і для цих процесів випадковість процесу може періодично будувати тенденції з випадкового шуму, і неправильний тест на статистичну значимість може сказати вам, що це важливо, коли його немає!
Поставлення зразкових точок розкиду ділянки та плавної кривої на один графік:
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