在R中,我使用nls进行非线性最小二乘拟合。那么我如何使用拟合提供的系数值来绘制模型函数?
(是的,这是来自R亲戚新手的非常天真的问题。)
答案 0 :(得分:14)
使用?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)
答案 1 :(得分:2)
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')
例如。
答案 2 :(得分:2)
我知道你想要什么(我是科学家)。这不是它,但至少显示如何使用'曲线'在任何范围内绘制拟合函数,曲线将是平滑的。使用与上面相同的数据集:
nonlinFit&lt; - nls(密度~a - b * exp(-c * conc),data = DNase1,start = list(a = 1,b = 1,c = 1))
fitFnc&lt; - function(x)predict(nonlinFit,list(conc = x))
曲线(fitFnc,from = .5,to = 10)
,或者
曲线(fitFnc,从= 8.2,到= 8.4)
,或者
曲线(fitFnc,从= .1,到= 50)#井在数据范围之外
或其他(不先设置一系列评估点)。
我是一个基本的R程序员,所以我不知道如何在Mathematica中实现(优雅地)类似ReplaceAll(/。)的东西,用于替换模型中符号参数的出现,使用合适的参数。这第一步虽然看起来很可怕但仍然有效:
myModel&lt; - “a - b * exp(-c * conc)”
nonlinFit&lt; - nls(as.formula(paste(“density~”,myModel)),data = DNase1,start = list(a = 1,b = 1,c = 1))
它为你留下了一个单独的'模型'(作为一个字符串),你可以使用适合的参数......干净利落(不挖掘a,b,c)只会使用nonlinFit ......不知道怎么样。
答案 3 :(得分:-1)
“曲线”功能将为您绘制函数。