我有一些数据符合某个公式的曲线。
为此,我使用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')
我的朋友试图将这些数据放入另一个程序中。它找到相同的参数,其他程序绘制的功能非常适合数据。 此外,手动查找参数非常容易,这使得曲线能够很好地跟踪数据。
我在哪里陷入困境?我是初学者,所以这可能是愚蠢的。
提前谢谢!
已编辑:Data file
答案 0 :(得分:2)
你的问题是你的绘图,你只给一个点值,所以它用它作为y,默认为一个值是x轴上的一个单位(如果你看原始图,你可以看它结束于439,这是你拥有的点数。
你也可以通过用x绘图来解决这个问题:
plot(combined$V1~combined$V3)
points(x,logfit(x,jpw), type = 'l')
答案 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)
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)