データ分析メモと北欧生活

旧Untitled Note. データ分析、計量経済・統計とR、水産管理、英語勉強、海外生活などについて備忘録や自分の勉強のOutputの場所として

MENU

【R】有限の台を持つポワソン分布っぽい分布を書く

ポワソン分布に基づいているけど、台(support)が無限ではなく任意の有限値で区切るような確率分布関数をR関数で書いて、
結局使わなかったけど、ここに供養しておこう。

普通のポワソン分布

普通のポワソン分布は台に非負の整数を取る確率関数である。
たとえばパラメーター(ラムダ)が2で、0から10までのポワソン分布の確率質量関数は

> dpois(0:10,2)
 [1] 1.353353e-01 2.706706e-01 2.706706e-01 1.804470e-01 9.022352e-02 3.608941e-02
 [7] 1.202980e-02 3.437087e-03 8.592716e-04 1.909493e-04 3.818985e-05

となるが、理論上はポワソン分布の台は無限なので、10までの確率質量関数を合計しても1にはならない。

> sum(dpois(0:10,2))
[1] 0.9999917

有限の台を持つポワソン分布に基づいた分布

なんでこんな分布がほしかったかというと、有限離散のサンプルを取るときに、sample()関数だと一様分布に基づいたサンプルになってしまうが、いい感じのウェイトを付けたかったからである。

ようするに、任意の台の範囲で合計が1になればいいので

 Prob(X=x) = \frac{Pois(x,\lambda=2)}{\sum_{i=1}^{10}  Pois(i,\lambda=2)}

という感じで合計の確率質量で割って確率を定義するだけ。

dpois_bnd <- function(x,lam) {dpois(x,lam)/ppois(max(x),lam)}


これに基づいた疑似乱数生成を行うと

rpois_bnd <- function(lam,maxval){
  if(is.na(lam)){
    NA
  }else{
  sample(0:maxval,1,replace = TRUE, prob = dpois_bnd(0:maxval,lam))
  }
  # This function means: draw from 0 to 10 based on the distribution of Poisson(lambda)
  # The distribution is adjusted so that the sum of prob. is 1 even though truncatetd at 10
  # sum(dpois(0:10,lam)/ppois(10,lam)) = 1 for any lambda
  # sum(dpois_bnd(0:10,lam))
}

まぁ結局使わなかったんですが…

上述のように、離散のサンプリングするときにウェイトをかけたいときに使えるかも、という程度です。



分布からはじめる確率・統計入門

分布からはじめる確率・統計入門