ポアソン対数正規分布

library(poilog)
my.dpslnorm2 <- function(x,mean=0,sd=1,k=1){
	z <- seq(from=0,to=50,length=10^k+1)
	#d <- dlnorm(z,log(mean),log(sd))
	d <- dlnorm(z,mean,sd)
	Lambda <- z
	D <- dpois(x,Lambda)*(z[2]-z[1])
	sum(D*d)
}


xs <- 0:10
ret <- ret1 <- rep(0,length(xs))
for(i in 1:length(xs)){
x <- xs[i]
mea <- 3
sd <- 2
ret[i] <- dpoilog(x,mea,sd)
ret2[i] <- my.dpslnorm2(x,mean=mea,sd=sd)
}

ret
ret2
> ret
 [1] 0.06086260 0.05421382 0.04571094 0.03902130 0.03388362 0.02986360
 [7] 0.02664534 0.02401495 0.02182648 0.01997801 0.01839654
> ret1
 [1] 0.06086266 0.05421384 0.04571095 0.03902131 0.03388363 0.02986361
 [7] 0.02664535 0.02401495 0.02182648 0.01997801 0.01839654
    • rpoilog()は0という観測をデフォルトでは「返さない」ので、ちょっと気持ち悪い
> rpoilog(10,0,1)
[1] 3 1 1 2 1 4
> rpoilog(10,0,1,keep0=TRUE)
 [1] 0 0 0 3 3 0 4 2 1 0

  • ついでに、RにはC実装の離散積分関数Rdqagsというのがあるらしいことが、poilogのコードからわかりました(こちら)
  • さて。昨日と同じで、対数正規分布のパラメタ指定は、対数正規分布の期待値となっていなくて、「元となる」正規分布のそれなので面倒くさい
  • 対数正規分布の期待値と「最頻値」とを基準にポアソン対数正規分布のd/r関数を作っておこう
  • ポアソン分布の期待値はそのパラメタλに等しいから、要するに対数正規分布の期待値をいくつにするか、とポアソン対数正規分布の期待値をいくつにするかは同じ
  • まず、rpoilog()関数から乱数の期待値を確認しておこう
mea <- 0.5
sd <- 1
n <- 10^6
rr <- rpoilog(n,mea,sd,keep0=TRUE)
mean(rr)
exp(mea+sd^2/2)
    • 精度はこんなもの(大きい数値が出るので…)
> mean(rr)
[1] 2.726748
> exp(mea+sd^2/2)
[1] 2.718282 # 対数正規分布の期待値の理論値
    • 対数正規分布の期待値と最頻値を引数とする関数を作る
my.dpoislnorm <- function(x,mea=1,mod=0.5){
	S <- sqrt(2/3*log(mea/mod))
	M <- log(mod) + S^2
	dpoilog(x,M,S)
}

my.rpoislnorm <- function(n,mea=1,mod=0.5){
	S <- sqrt(2/3*log(mea/mod))
	M <- log(mod) + S^2
	rpoilog(n,M,S,keep0=TRUE)
}
n <- 10^4
Mea <- 50
Mod <- 30
RR <- my.rpoislnorm(n,Mea,Mod)
mean(RR)

tab.cnt <- tabulate(RR+1) # 0をカウント
plot(0:max(RR),tab.cnt,type="l")
abline(v=Mod,col=2)