为什么 nls return "Missing value or an infinity produced when evaluating the model" 在这种情况下?

Why does nls return "Missing value or an infinity produced when evaluating the model" in this instance?

我正在尝试使用 R 的 nls 方法将指数模型拟合到我拥有的一组数据。有问题的模型是:

y=ae^(bx)

我通过获取两侧的日志然后从线性回归模型中找到系数来估计起点,然后将它们传递给 nls。当我这样做时,nls 会抛出 "Missing value or an infinity produced when evaluating the model" 错误。

当我使用我手动设置的值 (a=1, b=1) 测试模型时,该模型工作正常,但我希望我的代码不仅能处理测试数据。我试过交换 a 和 b 的值,也试过使用 selfStart 方法(尽管我并不完全理解它们)。

到目前为止,这是我的代码:

csvfile <- read.csv("testdata.csv")
col1<-unlist(lapply(csvfile[colnames(csvfile)[1]], log))
col2<-unlist(lapply(csvfile[colnames(csvfile)[2]], log))
a_start<-as.numeric(summary(lm(col2~col1))$coefficients[2])
b_start<-as.numeric(summary(lm(col2~col1))$coefficients[4])
f=as.formula(paste(as.name(colnames(csvfile)[1]),"~I(a*exp(b*",as.name(colnames(csvfile[2])),"))"))
expo<-nls(f,data=csvfile, start=list(a=a_start,b=b_start))

这是testdata.csv的内容:

"x","y"
1,7
2,10
3,24
4,47
5,96

我期望得到的结果是 a=2.78545 和 b=0.707868,这是我手动输入起始值时得到的结果。

感谢所有help/advice,谢谢。

欢迎来到 SO。

我认为这是由于一个小的打字错误造成的。当您使用

生成公式时
f=as.formula(paste(as.name(colnames(csvfile)[1]),"~I(a*exp(b*",as.name(colnames(csvfile[2])),"))"))

那你实际上是在生成公式

> f
x ~ I(a * exp(b * y))

我认为您已经交换了 xy 并且需要对 a 的起始值进行反向转换。至少,当您从记录的变量创建起始值时,您将 log(y) 建模为 log(x) 的函数。如果您改为执行以下操作,那么它似乎有效

> f=as.formula(paste(as.name(colnames(csvfile)[2]),"~I(a*exp(b*",as.name(colnames(csvfile[1])),"))"))
> expo<-nls(f,data=csvfile, start=list(a=exp(a_start),b=b_start))
> expo
Nonlinear regression model
  model: y ~ I(a * exp(b * x))
   data: csvfile
     a      b 
2.7854 0.7079 
 residual sum-of-squares: 4.569

Number of iterations to convergence: 7 
Achieved convergence tolerance: 1.099e-08

其他一些评论:为什么要记录 x? log(a exp(bx)) = log(a) + bx

另外,你可以写得更紧凑,如

initial_model <- lm(log(y) ~ x, data=csvfile)
f <- as.formula(paste(as.name(colnames(csvfile)[2]),"~I(a*exp(b*",as.name(colnames(csvfile[1])),"))"))
expo <- nls(f, data=csvfile, start=list(a=exp(coef(initial_model)[1]),b=coef(initial_model)[2]))