Как получить сюжет из nls в R?

В R я использую nls для нелинейной аппроксимации методом наименьших квадратов. Как тогда мне построить модельную функцию, используя значения коэффициентов, предоставленных подгонкой?

(Да, это очень наивный вопрос от относительного новичка R.)


person murray    schedule 29.03.2012    source источник
comment
Прокрутите вниз до конца ?nls, и там есть пример для вас.   -  person joran    schedule 29.03.2012
comment
Извините, но приведенный здесь пример мало помогает; Я просто не понимаю, что означают некоторые аргументы в пользу заговора и линий. Пожалуйста помоги! Мой фрейм данных называется xy, с компонентами x и y, а dim(xy) - это 17 2. И я назвал fitted результат вызова nls. Как построить модельную функцию для найденных значений коэффициентов вместе с исходными точками данных?   -  person murray    schedule 29.03.2012
comment
@Murray: Взгляните на эту строку из примера: lines(x, predict(nlmod), col=2). Это работает, потому что predict знает, как вычислить предсказанные значения y на основе вывода nls. В качестве альтернативы, потратьте немного времени, чтобы просеять все компоненты вашего fitted объекта, найти коэффициенты и использовать их для написания вашей собственной функции соответствия. Это придаст вам уверенности в том, что nls сделал то, что вы хотите.   -  person Carl Witthoft    schedule 29.03.2012


Ответы (4)


Используя первый пример из ?nls и следуя примеру, который я указал вам построчно, получаем следующее:

#This is just our data frame
DNase1 <- subset(DNase, Run == 1)
DNase1$lconc <- log(DNase1$conc)
#Fit the model
fm1DNase1 <- nls(density ~ SSlogis(lconc, Asym, xmid, scal), DNase1)

#Plot the original points
# first argument is the x values, second is the y values
plot(DNase1$lconc,DNase1$density)

#This adds to the already created plot a line
# once again, first argument is x values, second is y values
lines(DNase1$lconc,predict(fm1DNase1))

Метод predict для аргумента nls автоматически возвращает подогнанные значения y. В качестве альтернативы вы добавляете шаг и выполняете

yFitted <- predict(fm1DNase1)

и вместо этого передайте yFitted во втором аргументе lines. Результат выглядит так:

введите описание изображения здесь

Или, если вам нужна «гладкая» кривая, вам нужно просто повторить это, но оценить функцию в большем количестве точек:

r <- range(DNase1$lconc)
xNew <- seq(r[1],r[2],length.out = 200)
yNew <- predict(fm1DNase1,list(lconc = xNew))

plot(DNase1$lconc,DNase1$density)
lines(xNew,yNew)
person joran    schedule 29.03.2012
comment
Нет, lines - это $ not $ то, что я хотел построить (вместе с исходными точками данных). Скорее, я хотел построить модельную функцию, используя значения коэффициентов, найденных при вызове nls. Как мне извлечь эти коэффициенты? И как потом их заменить в виде модельной функции? Конкретно модель y ~ k * x^n. Теперь я хочу построить (гладкую) кривую, заданную уравнением y = k * x^n, со значениями k и n, найденными из nls. - person murray; 29.03.2012
comment
@murray Эм ... вызов lines(...,predict()) делает в точности то, что вы только что описали. - person joran; 29.03.2012
comment
@murray А именно, он оценивает функцию подобранную, используя оцененные коэффициенты в качестве исходных точек данных. Если вы хотите, чтобы функция оценивалась в разных точках, вам придется передать их в predict. - person joran; 29.03.2012
comment
@murray Я добавил еще один пример, показывающий, как именно сделать кривую более плавной. - person joran; 29.03.2012
comment
Для значений коэффициентов, найденных nls, я хочу построить результирующую модель как гладкую функцию для этих коэффициентов - так же, как я бы построил, скажем, y = 5 * x ^ 2. Нет ли способа построить функцию в R без явного указания списка значений x? - person murray; 29.03.2012
comment
@murray Ну, есть curve, но это просто то, что я делал вручную, и это будет намного больше работы, в которой все сводится к выражению или функции. Ваше замешательство может заключаться в том, что вы думаете, что на самом деле существует такая вещь, как плавная кривая при построении графика. Нет. Просто функция оценивается в достаточном количестве точек, и ваш глаз не заметит разницы. Каждый график в каждом языке в какой-то момент явно вычерчивает последовательность значений x и соединяет их линией. - person joran; 30.03.2012
comment
спасибо за все ответы! Мне хорошо известно, что для компьютера не существует такой вещи, как плавная кривая для построения графика - это всего лишь точки выборки и сегменты рисования (и, в конечном итоге, сопоставление их с соответствующими пикселями). Но с такими системами, как Mathematica, мне не нужно об этом думать, и вместо этого я могу работать на более высоком уровне абстракции, а именно, просто запрашивая график функции и позволяя системе делать всю грязную работу (включая адаптивную выборку входных значений по скорости изменения значений). - person murray; 30.03.2012

coef (x) возвращает коэффициенты для результатов регрессии x.

model<-nls(y~a+b*x^k,my.data,list(a=0.,b=1.,k=1))
plot(y~x,my.data)
a<-coef(model)[1]
b<-coef(model)[2]
k<-coef(model)[3]
lines(x<-c(1:10),a+b*x^k,col='red')

Например.

person Graham Giller    schedule 21.05.2013

Я знаю, чего вы хотите (я ученый). Это не так, но, по крайней мере, показано, как использовать «кривую» для построения функции подгонки в любом диапазоне, и кривая будет плавной. Используя тот же набор данных, что и выше:

nonlinFit ‹- nls (плотность ~ a - b * exp (-c * conc), data = DNase1, start = list (a = 1, b = 1, c = 1))

fitFnc ‹- функция (x) предсказать (nonlinFit, list (conc = x))

кривая (fitFnc, от = 0,5 до = 10)

or,

кривая (fitFnc, от = 8,2 до = 8,4)

or,

curve (fitFnc, from = .1, to = 50) # выходит за пределы диапазона данных

или что-то еще (без предварительной настройки последовательности точек оценки).

Я элементарный программист на языке R, поэтому не знаю, как реализовать (изящно) что-то вроде ReplaceAll (/.) В Mathematica, которое можно было бы использовать для замены вхождений символьных параметров в модели на подогнанные параметры. Этот первый шаг работает, хотя выглядит ужасно:

myModel ‹- a - b * exp (-c * conc)

nonlinFit ‹- nls (as.formula (paste (density ~, myModel)), data = DNase1, start = list (a = 1, b = 1, c = 1))

Это оставляет вам отдельную `` модель '' (в виде символьной строки), которую вы могли бы использовать с подобранными параметрами ... чисто (НЕ раскапывая a, b, c) просто используйте nonlinFit ... не уверен, как это сделать.

person SteveK9    schedule 24.03.2015

Функция «кривая» построит для вас функции.

person Vincenzo    schedule 12.07.2013