Nr<-sample(2:10,1)
Nc<-sample(2:10,1)
library(MCMCpack)
Pr<-rdirichlet(1,rep(1,Nr))
Pc<-rdirichlet(1,rep(1,Nc))
Pmat<-t(Pr) %*% Pc
Pmat
qr(Pmat)$rank
- m次元分割表の正確確率検定について考える
- m次元ある
- 各次元に
カテゴリある
- 複合カテゴリは
ある
- この
種類あるカテゴリの生起確率を
とすれば、
であって、これは、
正単体(頂点数が
で
次元空間にある正単体)の内部として表される
- 今、m次元分割表があって、その周辺度数が与えられたとき、
上のどこの点なら、OKかには制約があるはず
- その制約を数学的に書き記すことを考える
- 簡単な例から入る方がわかりやすいので、
の例で考える
![\begin{pmatrix}p_{1,1}&p_{1,2}&p_{1,3}\\p_{2,1}&p_{2,2}&p_{2,3}\end{pmatrix}](https://chart.apis.google.com/chart?cht=tx&chl=%5Cbegin%7Bpmatrix%7Dp_%7B1%2C1%7D%26p_%7B1%2C2%7D%26p_%7B1%2C3%7D%5C%5Cp_%7B2%2C1%7D%26p_%7B2%2C2%7D%26p_%7B2%2C3%7D%5Cend%7Bpmatrix%7D)
- 今、周辺が決まっていれば、
なる
がある
- 行列
の代わりに、その対数をとったものを成分とする行列
を考える
に気を付ければ
![\log(p)=\begin{pmatrix}\log(s_1)+\log(t_1)&\log(s_1)+\log(t_2)&\log(s_1)+\log(t_3)\\\log(s_2)+\log(t_1)&\log(s_2)+\log(t_2)&\log(s_2)+\log(t_3)\end{pmatrix}](https://chart.apis.google.com/chart?cht=tx&chl=%5Clog%28p%29%3D%5Cbegin%7Bpmatrix%7D%5Clog%28s_1%29%2B%5Clog%28t_1%29%26%5Clog%28s_1%29%2B%5Clog%28t_2%29%26%5Clog%28s_1%29%2B%5Clog%28t_3%29%5C%5C%5Clog%28s_2%29%2B%5Clog%28t_1%29%26%5Clog%28s_2%29%2B%5Clog%28t_2%29%26%5Clog%28s_2%29%2B%5Clog%28t_3%29%5Cend%7Bpmatrix%7D)
- さらに
![\log(p)=](https://chart.apis.google.com/chart?cht=tx&chl=%5Clog%28p%29%3D)
![\log(s_1)\begin{pmatrix}1&1&1\\0&0&0\end{pmatrix}+\log(s_2)\begin{pmatrix}0&0&0\\1&1&1\end{pmatrix}+\log(t_1)\begin{pmatrix}1&0&0\\1&0&0\end{pmatrix}+\log(t_2)\begin{pmatrix}0&1&0\\0&1&0\end{pmatrix}+\log(t_3)\begin{pmatrix}0&0&1\\0&0&1\end{pmatrix}](https://chart.apis.google.com/chart?cht=tx&chl=%5Clog%28s_1%29%5Cbegin%7Bpmatrix%7D1%261%261%5C%5C0%260%260%5Cend%7Bpmatrix%7D%2B%5Clog%28s_2%29%5Cbegin%7Bpmatrix%7D0%260%260%5C%5C1%261%261%5Cend%7Bpmatrix%7D%2B%5Clog%28t_1%29%5Cbegin%7Bpmatrix%7D1%260%260%5C%5C1%260%260%5Cend%7Bpmatrix%7D%2B%5Clog%28t_2%29%5Cbegin%7Bpmatrix%7D0%261%260%5C%5C0%261%260%5Cend%7Bpmatrix%7D%2B%5Clog%28t_3%29%5Cbegin%7Bpmatrix%7D0%260%261%5C%5C0%260%261%5Cend%7Bpmatrix%7D)
- と変形できる
- ここで、0,1でできた行列は成分数が
である。これを、その長さのベクトルに見立てて考えれば
と
を使って
と表すことができる(
も長さ
のベクトルにしてある)
- 周辺度数を等しくするm次元分割表が2つあるとき、その表成分を長さ
のベクトルにしてものは
となる。このような表の集合は
のfiberと呼ぶ
- 対数が出てきたのは、確率の積を和の計算に変えて、行列計算に持ち込めるから(でもある)
- 途中からの説明は、
に限定していないので、
がは任意の説明として受け取れるだろう
- さて。実際の観測表が
であるとする。これと周辺度数を等しくする表は
を等しくするものとする
- そのような観測をする生起確率は
- これは、行列とベクトルの計算について、少し気を付けて式変形をすると得られる
- 正確な生起確率が計算できた
- これを、fiberの成分のすべての表の生起確率の和に対する比率にすると、
の出てこない式が得られる
- 言い換えると、観察テーブルのセルの値と、fiberに含まれるテーブルのセルの値とだけで計算できることになる
- まず、fiberの成分のすべての表の生起確率の和
を出そう
- であるから
![P\frac{(U=u)}{P(AU=Au)}=\frac{1/(\pi_{i=1}^R u_i!)}{\sum_{v\in F(u)} 1/(\pi_{i=1}^R v_i!)}](https://chart.apis.google.com/chart?cht=tx&chl=P%5Cfrac%7B%28U%3Du%29%7D%7BP%28AU%3DAu%29%7D%3D%5Cfrac%7B1%2F%28%5Cpi_%7Bi%3D1%7D%5ER%20u_i%21%29%7D%7B%5Csum_%7Bv%5Cin%20F%28u%29%7D%201%2F%28%5Cpi_%7Bi%3D1%7D%5ER%20v_i%21%29%7D)
- ここで
として0,1からなる特殊な行列を使ったが、すべてのセルが分割表的に平等な扱いになるような条件を満足すればよく、その条件は、行列Aのすべての列の和が等しいという条件(らしい)
- ちょっとRメモ
n<-2
rs<-sample(2:4,n,replace=TRUE)
R<-prod(rs)
A<-matrix(0,n,R)
N<-100
for(i in 1:R){
s<-sample(1:n,N,replace=TRUE)
A[,i]<-c(tabulate(s,nbins=n))
}
A
Arr<-array(0,rs)
address<-which(Arr==0,arr.ind=TRUE)
A<-matrix(0,sum(rs),R)
counter<-1
for(i in 1:n){
for(j in 1:rs[i]){
these<-which(address[,i]==j)
A[counter,these]<-1
counter<-counter+1
}
}
A
g<-rnorm(length(A[,1]))
logp<-t(A)%*%g
p<-exp(logp)
p<-p/sum(p)
p
- 正確確率は、場合の数が大きすぎてできないが、モンテカルロで近似はできる
- その時に使うのが、マルコフ基底、メトロポリス-ヘイスティング サンプリング
- 周辺度数を守るようにしか動けないので、そのような動きを取りまとめたのがマルコフ基底
- OKな動きのうち、どの動きをするかをランダムに決め、そのうえで、動くか動かないかに関して、位置の相対的な生起確率に基づいて確率的に決める動きが、メトロポリス-ヘイスティング。これをすることで、
をくまなく、生起確率に応じてサンプリングすることができる
- こちらに続く