R-fisher评分中递归函数的实现问题

R-fisher评分中递归函数的实现问题,r,recursion,R,Recursion,我试图在模拟I.I.d.泊松数据上实现Fisher评分,但我得到了堆栈溢出错误。我对函数做了一些简单的打印,发现在第一次迭代后猜测值没有改变 fs_pois <- function(data, true, guess) { if (abs(guess-true) < 0.01) return(guess) else return(fs_pois(data, true, guess + (mean(data)*exp(-guess))-1)) } data <- rpois(1

我试图在模拟I.I.d.泊松数据上实现Fisher评分,但我得到了堆栈溢出错误。我对函数做了一些简单的打印,发现在第一次迭代后猜测值没有改变

fs_pois <- function(data, true, guess) {
if (abs(guess-true) < 0.01) return(guess)
else return(fs_pois(data, true, guess + (mean(data)*exp(-guess))-1))
}

data <- rpois(100,lambda=0.34)
fs_pois(data, 0.34, 0.36)
有人知道发生了什么事吗?
非常感谢您使用
(平均值(数据)*exp(-guess))-1更新
guess
,您在
abs(guess-true)
中使用了哪些
true
来决定退出。在您的情况下,7970416步后未达到退出条件,典型零件
(平均值(数据)*exp(-guess))-1
达到
0
。也许您应该使用
(平均值(数据)*exp(-guess))-1
来做出退出决策

fs_pois <- function(data, guess) {
  d <- (mean(data)*exp(-guess))-1
  if (abs(d) < 0.01) return(guess)
  fs_pois(data, guess + d)
}

set.seed(7)
data <- rpois(100,lambda=0.34)
fs_pois(data, 0.36)
#[1] -0.9326207

fs\u pois谢谢您的建议。在考虑了收敛性之后,我回顾了数学模型,发现我遗漏了一个日志,并且将收敛到真参数值与收敛到ML估计混淆了。我的修订代码如下:

fs_pois <- function(data, MLE, guess) {
  cat(guess,"\n")
  if (abs(guess-MLE) < 0.01) return(guess)
  else return(fs_pois(data, MLE, guess + (mean(data)*exp(-guess))-1))
}
set.seed(111)
data <- rpois(25,lambda=2)
fs_pois(data, log(mean(data)), -1)

fs_pois感谢您的回复,但fisher评分的目标是尽可能接近真实值,这就是为什么函数和退出条件中实现了“真实”值。是的,但它们必须相关。否则,它可能不会像您的示例中那样找到一个结束。
fs_pois <- function(data, MLE, guess) {
  cat(guess,"\n")
  if (abs(guess-MLE) < 0.01) return(guess)
  else return(fs_pois(data, MLE, guess + (mean(data)*exp(-guess))-1))
}
set.seed(111)
data <- rpois(25,lambda=2)
fs_pois(data, log(mean(data)), -1)