计算给定的 Lambda

Calculate Lambda given

我正在使用 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

不幸的是,我不认为有一个内置函数,但我们可以很容易地编写一个函数来使用数字方法。

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

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 内(实际上在 epsilon/2 内)具有所需 q 的概率。为了使用它,我们必须使用 ppois 函数在 lambda 区间 [0,infinity) 上单调递减的事实。如果函数是单调递增的,它仍然可以通过修改工作,但是在我们的解决方案附近需要单调性才能使二分法工作。

使用这个

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 列,我们可以像这样使用应用函数:

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

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