В R я использую nls для нелинейной аппроксимации методом наименьших квадратов. Как тогда мне построить модельную функцию, используя значения коэффициентов, предоставленных подгонкой?
(Да, это очень наивный вопрос от относительного новичка R.)
В R я использую nls для нелинейной аппроксимации методом наименьших квадратов. Как тогда мне построить модельную функцию, используя значения коэффициентов, предоставленных подгонкой?
(Да, это очень наивный вопрос от относительного новичка R.)
Используя первый пример из ?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)
lines
- это $ not $ то, что я хотел построить (вместе с исходными точками данных). Скорее, я хотел построить модельную функцию, используя значения коэффициентов, найденных при вызове nls. Как мне извлечь эти коэффициенты? И как потом их заменить в виде модельной функции? Конкретно модель y ~ k * x^n
. Теперь я хочу построить (гладкую) кривую, заданную уравнением y = k * x^n
, со значениями k и n, найденными из nls
.
- person murray; 29.03.2012
lines(...,predict())
делает в точности то, что вы только что описали.
- person joran; 29.03.2012
predict
.
- person joran; 29.03.2012
curve
, но это просто то, что я делал вручную, и это будет намного больше работы, в которой все сводится к выражению или функции. Ваше замешательство может заключаться в том, что вы думаете, что на самом деле существует такая вещь, как плавная кривая при построении графика. Нет. Просто функция оценивается в достаточном количестве точек, и ваш глаз не заметит разницы. Каждый график в каждом языке в какой-то момент явно вычерчивает последовательность значений x и соединяет их линией.
- person joran; 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')
Например.
Я знаю, чего вы хотите (я ученый). Это не так, но, по крайней мере, показано, как использовать «кривую» для построения функции подгонки в любом диапазоне, и кривая будет плавной. Используя тот же набор данных, что и выше:
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 ... не уверен, как это сделать.
Функция «кривая» построит для вас функции.
?nls
, и там есть пример для вас. - person joran   schedule 29.03.2012xy
, с компонентамиx
иy
, аdim(xy)
- это17 2
. И я назвалfitted
результат вызова nls. Как построить модельную функцию для найденных значений коэффициентов вместе с исходными точками данных? - person murray   schedule 29.03.2012lines(x, predict(nlmod), col=2)
. Это работает, потому чтоpredict
знает, как вычислить предсказанные значения y на основе выводаnls
. В качестве альтернативы, потратьте немного времени, чтобы просеять все компоненты вашегоfitted
объекта, найти коэффициенты и использовать их для написания вашей собственной функции соответствия. Это придаст вам уверенности в том, чтоnls
сделал то, что вы хотите. - person Carl Witthoft   schedule 29.03.2012