R: идеальная кривая сглаживания - PullRequest
2 голосов
/ 31 октября 2011

Я пытаюсь подогнать плавную кривую к моему набору данных; есть ли лучшая сглаживающая кривая, чем я создал, используя следующие коды:

x <- seq(1, 10, 0.5)
y <- c(1, 1.5, 1.6, 1.7, 2.1,
       2.2, 2.2, 2.4, 3.1, 3.3,
        3.7, 3.4, 3.2, 3.1, 2.4,
        1.8, 1.7, 1.6, 1.4)
lo <- loess(y~x)
plot(x,y)
xv <- seq(min(x),max(x), (max(x) - min(x))/1000000)
lines(xv, predict(lo,xv), col='blue', lwd=1)

редактирует:

Я не собираюсь производить красивый (не обязательно) Я хочу показать сглаженную тенденцию .... Я не связан с соответствующей формулой формулы .... Мне нужно восстановить формулу

Ответы [ 3 ]

5 голосов
/ 31 октября 2011

Как поставлено, вопрос почти бессмысленный.Не существует такой вещи, как «лучшая» линия соответствия, поскольку «лучшая» зависит от целей вашего обучения.Довольно просто сгенерировать сглаженную линию, чтобы она подходила для каждой отдельной точки данных (например, полином 18-го порядка будет идеально соответствовать вашим данным, но, скорее всего, будет совершенно бессмысленным).количество гладкости модели loess путем изменения аргумента span.Чем больше значение span, тем более плавная кривая, чем меньше значение span, тем больше он будет соответствовать каждой точке:

Вот график со значением span=0.25:

x <- seq(1, 10, 0.5)
y <- c(1, 1.5, 1.6, 1.7, 2.1,
    2.2, 2.2, 2.4, 3.1, 3.3,
    3.7, 3.4, 3.2, 3.1, 2.4,
    1.8, 1.7, 1.6, 1.4)

xl <- seq(1, 10, 0.125)
plot(x, y)
lines(xl, predict(loess(y~x, span=0.25), newdata=xl))

enter image description here


Альтернативный подход заключается в подборе сплайнов через ваши данные.Сплайн должен проходить через каждую точку (тогда как сглаживатель, такой как lowess, не может.)

spl <- smooth.spline(x, y)
plot(x, y)
lines(predict(spl, xl))

enter image description here

4 голосов
/ 31 октября 2011

Я думаю, что, возможно, вы ищете интерполированную гладкую линию, которая в случае R, вероятно, легче всего достигается путем подбора интерполяционного сплайна? Как обсуждают другие ответы, дело не в статистической подгонке, но есть много контекстов, в которых вы хотите получить гладкую интерполированную кривую - я думаю, что ваша терминология, возможно, отбросила людей.

Сплайны численно более устойчивы, чем полиномы.

x <- seq(1, 10, 0.5)
y <- c(1, 1.5, 1.6, 1.7, 2.1,
    2.2, 2.2, 2.4, 3.1, 3.3,
    3.7, 3.4, 3.2, 3.1, 2.4,
    1.8, 1.7, 1.6, 1.4)

library(splines)

isp <- interpSpline(x,y)

xvec <- seq(min(x),max(x),length=200)  ## x values for prediction

png("isp.png")
plot(x,y)
## predict() produces a list with x and y components
lines(predict(isp,xvec),col="red")
dev.off()

enter image description here

4 голосов
/ 31 октября 2011

У вас есть 19 очков, поэтому полином до X ^ 18 будет бросать в глаза каждый из ваших пунктов:

> xl=seq(0,10,len=100)
> p=lm(y~poly(x,18))
> plot(x,y)
> lines(xl,predict(p,newdata=data.frame(x=xl)))

НО это игнорирует статистику.Речь идет о признании того, что кривые не будут проходить через точки.Речь идет о поиске модели с небольшим количеством параметров, которая объясняет как можно больше о данных и оставляет только шум.Речь не идет о наведении точек на кривую - нарисованная кривая имеет очень мало значения между точками данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...