Як додати нелінійну лінію тренду до ділянки розкиду в R? [зачинено]


27

У мене сюжет розкидання. Як я можу додати нелінійну лінію тренду?


4
У вас вже є рівняння кривої тренду чи додавання в нього включає обчислення рівняння з даних?
whuber

Відповіді:


34

Давайте створимо деякі дані.

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 = "червоний")

сюжет шматка export_plot


1
про змову, для тих, хто стикається з проблемами замовлення, ця порада корисна
tflutre

23

Якщо ви використовуєте ggplot2(третя система побудови графіку, в R, після основи R та решітки), це стає:

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

сюжет

Ви можете вибрати спосіб згладжування даних: див. ?stat_smoothПодробиці та приклади.


Гарний графік та пояснення! Але що означає тіньова область?
ПК Дарвіна

3
Затінена область - це довірчий інтервал навколо згладженої лінії. Ви могли це дізнатись самостійно, відвідавши файл довідки R stat_smooth, ввівши, ?stat_smoothяк заявив Вінсент. :-)
Мені подобається

9

Не знаючи, що саме ви шукаєте, використовуючи 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)

введіть тут опис зображення


як би ви зробили лінію іншого кольору?
EngrStudent

1
@EngrStudent Я оновив свою відповідь.
Джейсон Морган

8

Ваше запитання трохи розпливчасте, тому я збираюся зробити деякі припущення щодо вашої проблеми. Це дуже допоможе, якби ви могли поставити розсип і трохи описати дані. Будь ласка, якщо я роблю погані припущення, ігноруйте мою відповідь.

По-перше, можливо, ваші дані описують певний процес, який, на вашу думку, нелінійний. Наприклад, якщо ви намагаєтесь зробити регресію на відстань, щоб зупинити автомобіль при раптовому гальмуванні проти швидкості автомобіля, фізика говорить нам, що енергія транспортного засобу пропорційна квадрату швидкості - не швидкості себе. Тому ви можете спробувати поліноміальну регресію в цьому випадку, і (в R) ви могли б зробити щось на кшталт model <- lm(d ~ poly(v,2),data=dataset). Існує багато документації про те, як включити різні нелінійності в регресійну модель.

З іншого боку, якщо у вас є лінія, яка є "хиткою", і ви не знаєте, чому це коливання, то гарною відправною точкою, ймовірно, буде місцева зважена регресія, або loessв Р. Це лінійна регресія на малій регіон, на відміну від усього набору даних. Найпростіше уявити версію "k найближчого сусіда", де для обчислення значення кривої в будь-якій точці ви знайдете k точок, найближчих до точки, що цікавить, та їх середнє значення. Лосс просто такий, але використовує регресію замість прямого середнього. Для цього використовуйте model <- loess(y ~ x, data=dataset, span=...), де spanзмінна контролює ступінь згладжування.

З третьої сторони (вичерпані руки) - ви говорите про тенденції? Це тимчасова проблема? Якщо це так, будьте обережні з надто інтерпретацією тенденційних ліній та статистичної значущості. Тенденції часових рядів можуть з'являтися в "авторегресивних" процесах, і для цих процесів випадковість процесу може періодично будувати тенденції з випадкового шуму, і неправильний тест на статистичну значимість може сказати вам, що це важливо, коли його немає!


6

Поставлення зразкових точок розкиду ділянки та плавної кривої на один графік:

  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

Ділянка розсіювання з плавною кривою

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.