Если у меня есть данные (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?
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)