我需要在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只采取一系列的价值观...... 另一个错误是关于条件“如果”(停止标准),但我真的不知道问题是什么。
答案 0 :(得分:0)
您的NaN问题来自您的poisson.lik
函数。如果mu为负,则需要log(abs(mu))
。
#
# NEWTON-RAPHSON METHOD
#
#generate the data
lambda <- 3.2
ydata <- rpois(500, lambda)
#declare the log likehood function
poisson.lik <- function(mu = ""){
n <- length(ydata)
loglik <- -n * mu - sum(log(factorial(ydata))) + log(abs(mu)) * sum(ydata)
return(-loglik)
}
#creating the Newton Raphson loop
NR <- function ( mu = "", initval = "", f = "", stoptol = 1e-05, imax = "") {
i = 0
h = .1
mu0 = initval - 0.1
mu1 = initval
df.dx <- double(1) #predeclare your variable types
while ( abs(f(mu) - f(mu1)) > stoptol && i <= imax ) {
mu0 <- mu1
df.dx <- (f(mu0 + h) - f(mu0)) / h
mu1 <- mu0 + (mu - mu1) / abs(df.dx)
i <- i + 1
}
return(list("nstep" = i, "Final" = mu1, "fctval" = f(mu1)))
}
mu <- 3.2
initval <- 1
f <- poisson.lik
stoptol <- 0.0001
imax <- 10^4
NR(mu, initval, f, stoptol, imax)
我看到的主要问题是您需要知道函数要转到的位置。当您了解有关数据的某些方面时,通常使用它。例如,如果您知道想要的对数似然性,偏度或某种类型的统计信息,那么您可以求解产生相同统计信息的参数。上面的代码解决了这个问题。希望这可以帮助。