Как добавить нелинейную линию тренда на график рассеяния в R? [закрыто]

27

У меня есть точечный график. Как я могу добавить нелинейную линию тренда?

Карина Хусаинова
источник
4
У вас уже есть уравнение кривой тренда, или добавление его включает вычисление его уравнения из данных?
whuber

Ответы:

34

Давайте создадим некоторые данные.

n <- 100
x <- seq (n)
у <- норм (н, 50 + 30 * х ^ (- 0,2), 1)
Данные <- data.frame (x, y)

Ниже показано, как можно уместить линию Лесса или подгонку нелинейной регрессии.

сюжет (у ~ х, данные)

# соответствовать лесс линии
loess_fit <- loess (y ~ x, Data)
строки (данные $ x, прогнозирование (loess_fit), col = "синий")

# соответствовать нелинейной регрессии
nls_fit <- nls (y ~ a + b * x ^ (- c), Data, start = list (a = 80, b = 20, 
    с = 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в R. Это делает линейную регрессию на небольшой регион, в отличие от всего набора данных. Проще всего представить версию «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

Диаграмма рассеяния с гладкой кривой

Джим Робертсон
источник