【发布时间】:2017-07-29 17:40:44
【问题描述】:
我需要在 R 中编写 Newton-Raphson 方法来估计泊松分布的参数。我刚刚开始使用编程和 R。当我使用模拟数据运行程序时,R 返回一些错误。
Error in if (abs(x1 - x0) < stoptol) break :
missing value where TRUE/FALSE needed
In addition: Warning messages:
1: In log(mu) : NaNs produced
2: In log(mu) : NaNs produced
3: In log(mu) : NaNs produced
这是我目前所拥有的:
#
# NEWTON-RAPHSON METHOD
#
#generate the data
lambda=3.2
y=rpois(500,lambda)
#declare the log likehood function
poisson.lik<-function(mu,ydata=y){
n<-length(ydata)
logl<-sum(ydata)*log(mu)-n*mu-sum(lfactorial(ydata))
return(-logl)
}
## Newton-Raphson
NR<-function(initval, f, stoptol=1e-05, imax=25){
i=0
h=1e-05
x0=initval-0.1
x1=initval
while(i<=imax){
df.dx=(f(x0+h)-f(x0))/h
x1=(x0-(f(x0)/df.dx))
i=i+1
if(abs(x1-x0)<stoptol) break
x0=x1
}
list(nstep=i, initial=initval, final=x1, fctval=f(x1))
}
NR(initval=3,poisson.lik)
据我了解,一个问题来自参数 mu 在 NR 函数的迭代和对数计算中所取的值。也许我应该强制 mu 只采用一系列值... 另一个错误是关于条件“如果”(停止标准),但我真的不知道问题是什么。
【问题讨论】:
-
您看到的错误与您在
poisson.lik函数中执行的log操作有关。在你的“while”循环中,当x0为负数时,f(x0)将返回NaN,因为负数的log是不可能的,给你NaN(不是数字)。对NaN的操作将给您另一个NaN,因此您的if语句将失败。 (例如尝试if(NaN < 0) 1+1)
标签: r optimization poisson newtons-method