计算给定的Lambda

时间:2016-01-20 09:15:55

标签: r poisson

我正在使用R并试图计算一个未知的lambda。已知泊松分布区域。

x <- cbind("q" = rpois(n = 4, lambda = 3),  "ppois" = runif(n = 4), "lambda_unknown" = rep(NA, times = 4))
x
#      q      ppois lambda_unknown
# [1,] 4 0.05207818             NA
# [2,] 5 0.61127960             NA
# [3,] 3 0.83317758             NA
# [4,] 4 0.94495935             NA

我想要一个能帮我计算未知lambda的函数,所以“ppois”= ppois(q = q,“lambda_unknown”)

期望(粗略)输出:

x
#      q  ppois  lambda_unknown
# [1,] 4   0.05           ~9.15
# [2,] 5   0.61           ~5.02
# [3,] 3   0.83            ~1.4
# [4,] 4   0.94           ~2.05

最后一行作为例子:

ppois(4, 2.05)
# [1] 0.9427231

1 个答案:

答案 0 :(得分:2)

不幸的是,我认为没有内置功能,但我们可以轻松地编写一个函数来使用数字方法。

例如,使用二分法,我们可以

approx<-function(q,p,epsilon) {
  lower<-0
  upper<-1
  while(ppois(q,upper)>p) {upper<-upper*2}
  while (upper-lower>epsilon) {
    middle<-(upper+lower)/2
    if (ppois(q,middle)<p) {upper<-middle}
    else {lower<-middle}
  }
  return ((upper+lower)/2)
}

该函数将找到lambda的近似值,其导致p在某个期望的epsilon内具有期望q的概率(实际上在epsilon / 2内)。为了使用它,我们必须使用ppois函数在区间[0,无穷大]的λ中单调递减的事实。如果函数单调增加,它仍然可以通过修改工作,但在我们的解决方案附近需要单调性才能使二分法工作。

使用此

approx(4,0.05,0.01) # 9.152344
approx(5,0.61,0.01) # 5.035156
approx(3,0.83,0.01) # 2.144531
approx(4,0.94,0.01) # 2.082031

有关二分法的更多信息,请参阅here。其他数字方法更快,但编码更难。

为了用所需的值替换lambda_unknown列,我们可以像这样使用apply函数:

x[,"lambda_unknown"]<-apply(x,1,function(z){approx(z["q"],z["ppois"],0.01)})

这将内联函数应用于矩阵x的每一行(1表示按行应用,2表示按列应用)。内联函数采用给定的行并计算从行中输入正确参数的近似函数。