我正在使用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
答案 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表示按列应用)。内联函数采用给定的行并计算从行中输入正确参数的近似函数。