Когда выбирать nls () вместо loess ()?

Если у меня есть данные (x, y), я могу легко провести через них прямую линию, например

f=glm(y~x)
plot(x,y)
lines(x,f$fitted.values)

Но для пышных данных мне нужна пышная линия. Кажется, можно использовать loess ():

f=loess(y~x)
plot(x,y)
lines(x,f$fitted)

Этот вопрос эволюционировал по мере того, как я набирал и исследовал его. Я начал с того, что хотел использовать простую функцию для подбора данных (где я ничего не знаю о данных) и хотел понять, как использовать nls () или optim () для сделай это. Это было то, что все, казалось, предлагали в аналогичных вопросах, которые я нашел.Но вот наткнулся на лёсс () Я счастлив. Итак, теперь мой вопрос: почему кто-то решил использовать nls или optim вместо loess (или smooth.spline )? Используя аналогию с ящиком для инструментов, это nls отвертка, а лесс - электрическая отвертка (то есть я почти всегда выбираю последнюю, поскольку она делает то же самое, но с меньшими усилиями. )? Или nls плоская отвертка, а лёсс крестовая отвертка (что означает, что лёсс лучше подходит для некоторых проблем, но для других он просто не справится) ?

Для справки, вот игровые данные, которые я использовал, что лёсс дает удовлетворительные результаты для:

x=1:40
y=(sin(x/5)*3)+runif(x)

И:

x=1:40
y=exp(jitter(x,factor=30)^0.5)

К сожалению, он хуже справляется с этим:

x=1:400
y=(sin(x/20)*3)+runif(x)

Can nls (), или любая другая функция или библиотека, справятся как с этим, так и с предыдущим примером exp, без подсказки (т.е. без указания, что это синусоида)?

ОБНОВЛЕНИЕ: Некоторые полезные страницы по той же теме на stackoverflow:

Качество подгонки функций в R

Как подогнать плавную кривую к моим данным в R?

smooth.spline "из коробки" дает хорошие результаты в моих 1-м и 3-м примерах, но ужасно (он просто соединяет точки) во втором примере. Однако f = smooth.spline (x, y, spar = 0.5) хорош на всех трех.

ОБНОВЛЕНИЕ №2: gam () (из пакета mgcv) пока что отлично: он дает результат, аналогичный loess (), когда он был лучше, и аналогичный результат для smooth.spline (), когда он был лучше. И все без подсказок и лишних параметров.Документы были так далеко у меня над головой, что я чувствовал себя так, будто щурюсь на самолет, летящий над головой; но был обнаружен метод проб и ошибок:

#f=gam(y~x)    #Works just like glm(). I.e. pointless
f=gam(y~s(x)) #This is what you want
plot(x,y)
lines(x,f$fitted)

11
задан Community 23 May 2017 в 12:17
поделиться