У меня есть точечный график. Как я могу добавить нелинейную линию тренда?
У меня есть точечный график. Как я могу добавить нелинейную линию тренда?
Ответы:
Давайте создадим некоторые данные.
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