野球 確率の計算

  • 得点と確率を計算する
  • 純化のため全員同じ打率
  • xはリスト
    • 状況を表す{1,0}のベクトル をおさめたリスト
x[[1]]
    • ヒットの確率を掛け合わせた確率 をおさめたベクトル
x[[2]]
  • 確率を計算するにはあとアウトの確率とアウトがどこに入るかの係数をかける必要がある
  • baseの数は得点者、残塁者にのみ影響する
p<-c(0.3,0.2,0.1,0.05)   #ヒットの確率
q<-1-sum(p)    #アウトの確率

a<-list(list(c()),1)   #初期条件
b<-list(list(c(1)),c(p[1]))
c<-list(list(c(1,0),c(1,1)),c(p[1]*p[1],p[2]))
d<-list(list(c(1,0,0),c(1,0,1),c(1,1,0),c(1,1,1)),c(p[3],p[2]*p[1],p[1]*p[2],p[1]^3))
N<-10   #漸化式を計算する回数

x<-list(c(0,b[[1]],c[[1]],d[[1]]),c(1,b[[2]],c[[2]],d[[2]]))
for (i in 1:N){
	
	a1<-lapply(a[[1]],append,c(1,0,0,0),after=FALSE)
	b1<-lapply(b[[1]],append,c(1,0,0),after=FALSE)
	c1<-lapply(c[[1]],append,c(1,0),after=FALSE)
	d1<-lapply(d[[1]],append,c(1),after=FALSE)
	a2<-a[[2]]*p[4]
	b2<-b[[2]]*p[3]
	c2<-c[[2]]*p[2]
	d2<-d[[2]]*p[1]
	
	u<-list(c(a1,b1,c1,d1),c(a2,b2,c2,d2))  
	a<-b
	b<-c
	c<-d
	d<-u
	x<-list(c(x[[1]],u[[1]]),c(x[[2]],u[[2]]))
	}
#x
#得点を数える関数score(v,Nb)を作る
Nb <-3   #baseの数

score <- function (v,Nb=Nb){
	if ( length(v) > Nb){
		return(sum(v[1:(length(v)-Nb)]))
		}else{
			return(0)
			}
	}
Nout<-3 #1イニングのアウト数
A<-matrix(0,2,length(x[[1]]))
for(i in 1:length(x[[1]])){
	A[1,i]<-score(x[[1]][[i]],Nb)
	A[2,i]<-choose(sum(x[[1]][[i]])+Nout-1,Nout-1)*q^3*x[[2]][[i]]
	}
  • 行列Aの1行A[1,]は1イニングの得点,A[2,]はその確率
  • あとは得点ごとに確率を足し合わせればよい