我正在尝试运行以下代码,但它给了我:
你能帮帮我吗?谢谢!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
答案 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)