2016-01-20 53 views
3

我正在使用R并试图计算未知的lambda。已知是泊松分布中的一个区域。计算给定的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 

我想一个功能,可以帮助我计算我未知的拉姆达如此 “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 

回答

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) 
} 

该函数将查找拉姆达的近似值,其与获得想要的Q导致p的概率某些期望的ε-内(实际上内的ε-/2)。为了使用这个,我们必须使用这样的事实,即ppois函数在区间[0,无穷大)上的lambda单调递减。如果函数是单调增加的,它仍然可以工作,但修改后,但是我们的解决方案需要单调性以使分叉方法能够工作。

使用这种

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表示按列应用)。内联函数获取给定的行并计算来自该行的正确参数的近似函数。

+0

完美的作品,非常感谢!一个问题,我可能会错过一些东西,但我想使用这样的功能。 x $ lambda < - approx(q = x $ q,p = x $ ppois,epsilon = 0.01)。这个命令只给我第一行的lambda和后面的14条错误消息。我是否必须创建一个循环才能工作? –

+0

您将不得不使用apply函数来工作。例如,当你的x是一个矩阵时,我们可以做'x [,'lambda_unknown'] < - apply(x,1,function(x){approx(x [1],x [2],0.01)}) '。 – Matthew

+0

我编辑了答案来添加这个额外的细节。 – Matthew