漸化式っぽいものでNinning回の得点に拡張

MikuHatsune2010-12-12

1イニングあたりの得点確率から、Ninning回に増やしたときの得点確率。
 
前の記事で、Resultというのが1イニングあたりの得点確率。
n項目にはn-1点を取る確率p_{n-1}が収まっている。
P_{Result}=(p_{0},\hspace{5}p_{1},\hspace{5}p_{2},\hspace{5},,,,\hspace{5}p_{n-1})
1イニングで取ることのできる最高得点は決まっているので、Ninning回で取れる得点も決まる。
これをtで用意しておく。
Ninning目でx点取る確率をP_{Ninning,x}とか書くと
P_{Ninning-1,x}は、P_{Result}の項数分だけ分岐して
P_{Ninning,x}\hspace{20}=P_{Ninning-1,x}\hspace{3}p_{0} そのイニングは0点だった。
P_{Ninning,x+1}=P_{Ninning-1,x}\hspace{3}p_{1} そのイニングは1点だった。
P_{Ninning,x+2}=P_{Ninning-1,x}\hspace{3}p_{2} そのイニングは2点だった。

P_{Ninning,x+(n-1)}=P_{Ninning-1,x}\hspace{3}p_{n-1} そのイニングはn-1点だった。
という感じでガチャガチャ。

library(MCMCpack)
Result<- t(t(c(4/10,3/10,2/10,1/10)))
Ninning<- 3
t<- rep(0,(length(Result)-1)*Ninning+1)
t[c(1:length(Result))]<- Result
SM<- mapply(seq,0:((length(Result)-1)*(Ninning-1)),(length(Result)-1):((length(Result)-1)*Ninning))   
for(i in 1:(Ninning-1)){
  w<- Result%*%t
  t<- rep(0,(length(Result)-1)*Ninning+1)
  for(p in 0:max(SM)){
    t[p+1]<- sum(w[which(SM==p)])
  }
}
t                              # 欲しいもの。
sum(t)                         # 1であることを確認。
cumsum(t)                      # 0.9999くらいまででいいかな?
plot(t,type="s")               # あまりにも小さいものが多かったら、t[which(cumsum(t)<0.99999)]とか。

これですんばらすぃと思ったのが、mapply。

mapply(seq,0:3,3:6)
     [,1] [,2] [,3] [,4]
[1,]    0    1    2    3
[2,]    1    2    3    4
[3,]    2    3    4    5
[4,]    3    4    5    6

例えば上のResultを使うと

Result%*%t(Result)
            前の回 前の回 前の回 前の回
               0123[,1]   [,2]   [,3]   [,4]0点→[1,]   0.16   0.12   0.08   0.041点→[2,]   0.12   0.09   0.06   0.032点→[3,]   0.08   0.06   0.04   0.023点→[4,]   0.04   0.03   0.02   0.01

上のmapplyの値が、前のイニングの得点から次にどう推移したかを表している。
mapply上で一致する値同士をガチャガチャ足し合わせるとよさげ。