2016-01-20 55 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