nls中二进制运算符错误的非数字参数

时间:2016-12-16 23:40:17

标签: r nls

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

  

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

你能帮帮我吗?谢谢!

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中的uiung nls函数,用于获得给定数据的估计值(q-指数)。

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

1 个答案:

答案 0 :(得分: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 <1时,当t足够大时,基数将为负数...

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

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

如果我们从q-1为&gt; 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),data = dd,start = par2):步长系数0.000488281降低到'minFactor'以下0.000976562

好的,这会好一点但仍然失败。如果我们尝试以更合理的比例开始,即将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)

enter image description here