Лучший способ вызвать модель нелинейной регрессии в рисунках кривой () в R?

Я учился строить графики и кривые в R и использовал функции plot() и curve() с набором данных для построения как данных, так и кривой. Однако я не считаю, что использую самые эффективные методы.

Что я сделал, так это установил 2 вектора из data.frame, а затем назначил объект (назовем его o) функции nls(), например o<-nls(y~I(a*x^3)+I(b*x^2)+I(c*x)+d). Я мог бы получить все значения коэффициентов для o (a,b,c,d), вызвав o. Затем я могу вставить приближения для этих значений в функцию curve() после построения точек. Это работает, но мне интересно, есть ли способ подключить o непосредственно к функции curve, чтобы мне не приходилось заново вводить каждый коэффициент?


person DeCodened    schedule 10.07.2017    source источник
comment
Вам будет легче помочь, если вы предоставите воспроизводимый пример с образец ввода, чтобы мы могли протестировать возможные решения. Скорее всего, это можно решить с помощью функции predict().   -  person MrFlick    schedule 10.07.2017
comment
Итак, если я следую, вы бы предпочли увидеть что-то вроде моего ответа Роланду ниже. Я, вероятно, мог бы организовать это пошагово немного лучше здесь, поэтому я прошу прощения за это.   -  person DeCodened    schedule 11.07.2017


Ответы (1)


Обратите внимание, что ваша функция является многочленом и, следовательно, линейна по своим коэффициентам. Во всяком случае, с nls работает так же, как и с lm. Укажите data.frame для подгонки:

o <- lm(y ~ poly(x, 3, raw = TRUE), data = DF)
plot(y ~ x, data = DF)
curve(predict(o, newdata = data.frame(x = x)), add = TRUE)
person Roland    schedule 10.07.2017
comment
Роланд, разве curve не нужно выражение (в данном случае многочлен от x с коэффициентами из o)? Принимая во внимание, что вы можете использовать lines(), чтобы добавить кривую, используя функцию predict, чтобы явно получить значения y. - person eipi10; 11.07.2017
comment
@eipi10 eipi10 Да, кривой нужна функция или выражение, содержащее x. В этом примере я передаю его последним. Создайте несколько фиктивных данных и протестируйте их. Это работает (в моем коде может быть опечатка, так как он не проверен). Пользуюсь этой конструкцией регулярно. - person Roland; 11.07.2017
comment
Спасибо за это, Роланд. Поэтому я попытался воспроизвести свои результаты, используя эту методологию, и получил другую кривую: Первоначально: у меня есть DF‹-read.csv(.....) x‹-DF[,1] y‹-DF[,2] o‹-nls(y~I(c1*x^3)+I(c2*x^2)+I(c3*x)+c4), коэффициент которого: -3,712e-05 7,559e-03 -7,784e -01 2.719e+01 Теперь я использовал: o‹-lm(y~poly(x,3,raw=TRUE)) curve(predict(o),add=TRUE)) получил те же коэффициенты но линии на графике не совпадают. Довольно озадачен. Я предполагаю, что вы можете опустить необязательные данные в lm(), если у вас уже есть данные, соответствующие функции lm()? - person DeCodened; 11.07.2017
comment
Вы должны следовать моему примеру в деталях. Передайте data.frame функции модели и newdata для прогнозирования, как показано. В противном случае это работает неправильно. - person Roland; 11.07.2017
comment
Сотрите этого Роланда, я понял это. Я забыл, что мои данные претерпели небольшую модификацию, и когда я перестроил график, новая кривая с использованием lm() подошла идеально. Спасибо вам за помощь! Реально быстро заметил в документации, что параметр newdata необязательный, но вроде в данном случае надо указывать x как вход. Это для того, чтобы указать диапазон, в котором должно произойти предсказание? Я получил сообщение об ошибке при пропуске этого значения. - person DeCodened; 11.07.2017
comment
В комментарии выше я написал, что кривой нужно выражение, содержащее x. - person Roland; 11.07.2017