【问题标题】:Non Linear Regression Troubleshooting非线性回归故障排除
【发布时间】:2019-09-15 07:54:07
【问题描述】:

以下是我的数据集的摘录:相对频率和大小。从空心圆可以看出,这是一个高斯分布。我在 R 中使用 nls 包来拟合非线性曲线。 我的方程式是

或纯文本:c * e^(-(x - z)^2/l)

我是这样来的

fit <- as.formula(y~c*(exp((-(x-z)^2/l))))
preview(fit_partial, data=mydata, start=list(c=0.005, x=mydata$x_values, z=130,l=2000))

起始值似乎合理。所以我尝试获得非线性拟合

nls_fit <- nls(fit, data=mydata, start=list(c=0.005, x=mydata$x_values, z=130, l=2000))

但是,我遇到了一个错误

numericDeriv(form[[3L]], names(ind), env) 中的错误: 评估模型时产生的缺失值或无穷大

这可能是因为我的起始值很差。不过,一定还有其他问题。感谢任何帮助。

【问题讨论】:

  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。但我不认为x 应该在你的开始列表中。如果您使用带有data= 参数的公式,它将能够在data.frame 中找到值。您不想估计x 的值。这些是给定的。
  • @MrFlick 好的,我将努力为我的示例添加更多内容。是的,我不想预测 x; x 来自我的数据集。如果我从开始列表中删除 x,我会收到错误 parameters without starting value in 'data': x 我对编程和 R 的总体掌握非常薄弱;你能澄清一下你的意思吗?
  • 我认为这个例子写得很好,但是如果不了解你的数据是什么样子就很难排除故障。您能否从中抽取一个小样本,在样本上重现问题,并在您的帖子中分享该样本数据(使用 dput(my_data) 等函数)?

标签: r nls non-linear-regression


【解决方案1】:

据我所知,您唯一的问题是将x 包含在您的参数列表中,这使 R 感到困惑(我无法确切地告诉您为什么......关于事实上它实际上不是模型的参数......)。 nls(fit, data=mydata, start=pars) 对我来说很好用。

模拟数据:

fit <- as.formula(y~c*(exp((-(x-z)^2/l))))
mydata <- data.frame(x=80:200)
pars <- list(c=0.005, z=130,l=2000)
set.seed(101)
mydata$y_det <- eval(fit[[3]],
                     env=c(pars,as.list(mydata)))
mydata$y <- rnorm(nrow(mydata),mean=mydata$y_det,sd=0.0002)
plot(y~x,data=mydata) ## check

试试原来的合身:

nls_fit <- nls(fit, data=mydata, start=c(pars,list(x=mydata$x)))

numericDeriv(form[[3L]], names(ind), env) 中的错误: 评估模型时产生的缺失值或无穷大

仅适合参数(不是x)。

nls_fit <- nls(fit, data=mydata, start=pars)
lines(mydata$x,predict(nls_fit),col=2)
coef(nls_fit)
##           c            z            l 
## 4.963097e-03 1.302308e+02 2.035007e+03 

【讨论】:

  • 优秀的解决方案。我将 x 包含在启动参数列表中,这是错误的根源。我按照你的例子得到了与你上一个图相似的结果(仅使用我的真实数据)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2013-07-15
  • 2010-11-30
  • 2021-09-11
  • 2012-02-18
  • 2011-03-07
  • 1970-01-01
相关资源
最近更新 更多