Мне нужно запрограммировать метод Ньютона-Рафсона в R для оценки параметра распределения Пуассона. Я только начинаю программировать и работать с 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 принимать только диапазон значений... Другая ошибка связана с условием "если" (критерий остановки), но я действительно не знаю, в чем проблема.
log
, которую вы выполняете в функцииpoisson.lik
. В вашем цикле while, когдаx0
отрицательное,f(x0)
вернетNaN
, потому чтоlog
отрицательного числа невозможно, давая вамNaN
(не число). Операция надNaN
даст вам еще одинNaN
, так что ваш операторif
потерпит неудачу. (например, попробуйтеif(NaN < 0) 1+1
) - person ialm   schedule 09.03.2017