R中的nls()曲线拟合

时间:2017-05-01 13:55:42

标签: r

我有一些数据符合某个公式的曲线。

为此,我使用nls-function,如下所示:

fitmodel <- nls(y ~ a+b/(1+exp(-((x-c)/d))),
    data = combined,
    start=list(a=200,b=2000, c=80, d=10.99),      
    trace=TRUE)

这样可行,但会发出警告

“1:在min(x)中:min没有非缺失参数;返回Inf
2:在max(x)中:max没有非缺失参数;返回-Inf“

当我在我的情节中绘制具有确定参数的函数时,它根本不适合,例如:

jpw <- coef(fitmodel)

logfit <- function(x,jpw) {jpw[1] + jpw[2]/(1+exp(-((x-jpw[3])/jpw[4])))
}

points(logfit(x, jpw),type='l')

bad fit

我的朋友试图将这些数据放入另一个程序中。它找到相同的参数,其他程序绘制的功能非常适合数据。 此外,手动查找参数非常容易,这使得曲线能够很好地跟踪数据。

我在哪里陷入困境?我是初学者,所以这可能是愚蠢的。

提前谢谢!

已编辑:Data file

2 个答案:

答案 0 :(得分:2)

你的问题是你的绘图,你只给一个点值,所以它用它作为y,默认为一个值是x轴上的一个单位(如果你看原始图,你可以看它结束于439,这是你拥有的点数。

你也可以通过用x绘图来解决这个问题:

plot(combined$V1~combined$V3)
points(x,logfit(x,jpw), type = 'l')

enter image description here

答案 1 :(得分:0)

看到你的数据集会很有趣 无论如何,这是一个有效的例子。希望这可以帮到你。

logfit <- function(x,jpw) {
   jpw[1] + jpw[2]/(1+exp(-((x-jpw[3])/jpw[4])))
}

jpw <- c(-2,1,0,.5)
x <- runif(100, -3, 3)
y <- logfit(x, jpw)+rnorm(100, sd=0.01)
df <- data.frame(x,y)

curve(logfit(x,jpw),from=-3,to=3, ,type='l')
points(x,y)

enter image description here

fitmodel <- nls(y ~ a + b/(1+exp(-((x-c)/d))),
    data = df,
    start=list(a=1, b=2, c=1, d=1),      
    trace=TRUE)

fitmodel

输出结果为:

Nonlinear regression model
  model: y ~ a + b/(1 + exp(-((x - c)/d)))
   data: df
        a         b         c         d 
-1.999901  1.002425  0.006527  0.498689 
 residual sum-of-squares: 0.009408

Number of iterations to convergence: 6 
Achieved convergence tolerance: 1.732e-06

这里我使用@jpw。

给出的数据
df <- dget(file="data.txt")
names(df) <- c("y","v2","x")    
fitmodel <- nls(y ~ a + b/(1+exp(-((x-c)/d))),
    data = df,
    start=list(a=200,b=2000, c=80, d=10.99),      
    trace=TRUE)
summary(fitmodel)

估计的参数是:

Formula: y ~ a + b/(1 + exp(-((x - c)/d)))

Parameters:
   Estimate Std. Error t value Pr(>|t|)    
a  231.6587     2.8498   81.29   <2e-16 ***
b 1893.0646     6.3528  297.99   <2e-16 ***
c  151.5405     0.2016  751.71   <2e-16 ***
d   17.2068     0.1779   96.72   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 37.19 on 473 degrees of freedom

Number of iterations to convergence: 10 
Achieved convergence tolerance: 3.9e-06

现在我绘制结果。

plot(df$x, df$y)
jpw.est <- coef(fitmodel)
curve(logfit(x,jpw.est), from=0, to=300, col="red", lwd=2, add=T)

enter image description here