У меня есть точечный график. Как я могу добавить нелинейную линию тренда?
У меня есть точечный график. Как я могу добавить нелинейную линию тренда?
Ответы:
Давайте создадим некоторые данные.
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 = "красный")
Если вы используете 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в R. Это делает линейную регрессию на небольшой регион, в отличие от всего набора данных. Проще всего представить версию «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
