【问题标题】:Finding NLS for multiple series为多个系列寻找 NLS
【发布时间】:2017-05-03 14:40:38
【问题描述】:

我想使用 70 系列拟合模型/查找功能形式。我对它们中的每一个都有 30 个值。该图显示趋势不是线性的,因此我尝试使用 NLS。

不确定这是否是正确的方法。我以前没有实现过这个。我应该使用其他东西来建模吗?我收到以下错误:

nls 中的错误(y ~ a * exp(b * x), start = list(a = a_start, b = b_start)) :
奇异梯度

x 的值为 1:30,重复 70 次。 Y 值在 0 和 1 之间变化。我应该使用 71 个向量(长度为 30)还是应该将它们全部收集在两列中。目前,我已将它们全部收集在两列中。

数据看起来像这样:


a_start<-0.2
b_start<-2*log(2)/a_start

【问题讨论】:

  • 我对@9​​87654324@ 相对缺乏经验,但从我使用它的时间来看,最棘手的部分之一是为其提供足够接近的起始值,以便它可以找到解决方案.我不确定这个错误是否相关,但这将是尝试自动拟合许多系列的问题。为此,您可能会研究自启动模型。请参阅?selfStart 和链接。
  • 尝试记录双方的日志并使用 lm 进行拟合,然后将结果转换为起始值,或者 lm 对您来说就足够了。

标签: r curve-fitting nls


【解决方案1】:

问题是您的公式不是准确反映您的数据的形式。 y ~ a * exp(b * x) 永远不会像你的数据,所以你会得到没有任何意义的尖锐梯度。

试试这个:

#some made up data, since none provided
x <- runif(1000) * 30
y <- -0.9 * exp(-0.5 * x) + 1.1 + rnorm(length(x), sd=0.1)

fit <- nls(y ~ a * exp(b * x) + c, start = list(a = -1, b=-.1, c=1))

plot(x,y)
lines(x[order(x)], predict(fit)[order(x)], col="red", lwd=4)

【讨论】:

  • 谢谢@thc。我了解,该错误是由于功能不正确造成的。使用您指定的功能,我确实很适合。我希望开始接近 0.2。可能,我需要使用参数来达到预期的结果。
  • @NKaz,很高兴它有帮助。我建议的功能只是基于数据形状的示例。我建议尝试从科学的角度找出一个有意义的方程式。模型中的所有参数都应该具有科学意义。
  • 您能否建议任何有关使用数据科学地寻找非线性方程的阅读/链接。我确实尝试使用 y 值的日志并应用 lm。但是残差是自动相关的。我尝试过的其他事情是 nls2 (蛮力)。但它是关于找到更好的参数值 - 基于我指定的公式。
  • 我的意思是根据生成数据的内容而不是数据本身来确定方程式。如果您还没有看到数据,您认为哪种模型合适?在不知道您的项目是什么的情况下,我无法给您任何建议。
  • 其销售数据来自 Google Analytics。转化价值会在 30 天内发生变化(主要是增加)。我有一个从第 1 天到第 30 天报告的转化值的历史数据集,我想开发一个模型来预测(使用一些 CI)30 天后的增长量。我试图模拟每日差异,而不是实际销售价值。如图所示,大部分变化发生在第 1 天到第 10 天。由于不同的市场表现不同,我正在尝试分别开发每个市场的模型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-22
  • 2013-07-19
  • 2022-01-23
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多