【问题标题】:non-numeric argument to binary operator error in nlsnls中二元运算符错误的非数字参数
【发布时间】:2016-12-16 23:40:17
【问题描述】:

我正在尝试运行以下代码,但它给了我:

qr.default(.swts * attr(rhs, "gradient")) 中的错误: 外部函数调用中的 NA/NaN/Inf (arg 1) 另外:警告信息: 在 log(.expr4) 中:产生了 NaN

你能帮我一下吗?谢谢!

model <- deriv( ~ c*(1+b*(q-1)*t)^(1/(1-q)),  c("c", "b", "q"), function (t, c, b,q){})

nls(Frequency ~ model(t, c, b, q), data=DF,start=list(c = 1, b = 1.5, q =0.5))

接下来您可以看到一部分数据,正如我上面解释的那样,我正在尝试拟合一个 q 指数分布函数。 我在 R 中使用 nls 函数来获得给定数据的估计值(q-指数)。

t 频率 0 195746 1 93938 2 53181 3 31853 4 19856 5 12182 6 7847 7 5459 8 4325 9 3203 10 2750

【问题讨论】:

  • 欢迎来到 Stack Overflow!能否请您提供可以为我们提供reproducible example 的数据?
  • 只是猜测,但对于您的起始参数,t>4/3 的指数底数为负;任何涉及负值的分数幂的计算都会给出NaN ...
  • 您能否编辑您的问题以包含数据(而不是仅在评论中)?

标签: r nls


【解决方案1】:

tl;dr您需要更加努力地思考/找到合理的起始值。

设置数据和模型:

 dd <- data.frame(t=0:10,
            Frequency=c(195746,93938,53181,31853,19856,12182,
                        7847,5459,4325,3203,2750))
model <- deriv( ~ c*(1+b*(q-1)*t)^(1/(1-q)),
               c("c", "b", "q"), function (t, c, b,q){})

如果您仅在初始参数处评估 model(),您会看到一些关于 q 的导数是 NaN(尝试评估目标函数总是值得并在起始值处渐变以确保它们有意义)。除此之外,如果您查看目标函数的值,您会发现它们与数据相差甚远(它们从 1 增加到 42,而数据从 200000 减少到 3000 ...)

par0 <- list(c = 1, b = 1.5, q =0.5)
with(par0,model(dd$t,c,b,q))
##  [1]  1.0000  0.0625  0.2500  1.5625  4.0000  7.5625 12.2500 18.0625 25.0000
## [10] 33.0625 42.2500
## attr(,"gradient")
##             c     b         q
##  [1,]  1.0000  0.00 0.0000000
##  [2,]  0.0625 -0.25 0.4034264
##  [3,]  0.2500  1.00       NaN
##  [4,]  1.5625  3.75       NaN
...

问题在于,将负值提高到分数幂会得到NaN。当q t 足够大时,基数将变为负数...

with(par1,model(dd$t,c,b,q))

我尝试设置q=0(使指数的基值为1),但仍然遇到同样的问题。

如果我们从 q-1 大于 0 的值开始,这样基数就会是正数?

par2 <- list(c = 1, b = 1.5, q =2)
nls(Frequency ~ model(t, c, b, q), data=dd,start=par2)

nls 中的错误(频率 ~ 模型(t,c,b,q),数据 = dd,开始 = par2):步长因子 0.000488281 降低到 0.000976562 的“minFactor”以下

好的,情况有所好转,但仍然失败。如果我们尝试从更合理的规模开始,即将c 设置为 100000,该怎么办?

par3 <- list(c = 1e5, b = 1.5, q =2)
fit3 <- nls(Frequency ~ model(t, c, b, q), data=dd,start=par3)

绘制结果:

par(las=1,bty="l")
plot(Frequency/1000~t,data=dd)
newdat <- data.frame(t=seq(0,10,length=51))
lines(newdat$t,predict(fit3,newdata=newdat)/1000)

【讨论】:

  • 正如我所说,我正在为我的数据拟合一个 q 指数函数,并且对于这个 00。我试图弄清楚你的答案。以防我给你回信。非常感谢。
  • 它似乎运作良好。另一个问题是我怎样才能有一个自启动的估计,我的意思是为参数提供凝视值?谢谢!
  • 为了得出一个自启动估计,您需要提出自己的算法来找到近似的初始起始值(例如,查看现有的自启动函数,apropos("^SS[[:lower:]]")) .您可以按照这些思路提出另一个问题(但您应该先看看自己能走多远)。如果此答案有用,您可以投票(如果您有足够的声誉),无论如何,如果它令人满意地回答了您的问题,我们鼓励您单击复选标记接受它。
  • 好吧,我开发了另外两个非线性模型。现在,我想比较三个模型的健身效果,看看哪一个更合适。 “残差平方和”在这方面是否是一个很好的指标(越低越好)?或者是否有一些技术可以对非线性回归模型进行此类比较?谢谢!
  • 如果模型的参数数量相同,残差平方和是合理的,否则会变得复杂。那肯定是CrossValidated 问题,而不是 SO 问题...
猜你喜欢
  • 1970-01-01
  • 2021-03-24
  • 1970-01-01
  • 2016-11-15
  • 1970-01-01
  • 2019-05-03
  • 1970-01-01
  • 2021-12-22
相关资源
最近更新 更多