【问题标题】:Why does nls return "Missing value or an infinity produced when evaluating the model" in this instance?在这种情况下,为什么 nls 会返回“评估模型时产生的缺失值或无穷大”?
【发布时间】:2019-08-22 12:22:37
【问题描述】:

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

y=ae^(bx)

我通过取两边的对数然后从线性回归模型中找到系数来获得估计的起点,然后将它们传递给 nls。当我这样做时,nls 会抛出“评估模型时产生的缺失值或无穷大”错误。

当我使用手动设置的值(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 的结果,这是我手动输入起始值时得到的结果。

感谢您提供任何和所有帮助/建议。

【问题讨论】:

    标签: r nls


    【解决方案1】:

    欢迎来到 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
    

    其他一些cmets:你为什么要记录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]))
    

    【讨论】:

    • 谢谢!这似乎解决了问题!我记录了 x,因为我被告知通过找到 log(x)~log(y) 的回归线,您可以将这些系数用作良好的起点
    猜你喜欢
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多