- こちらの整理記事
- 次元の表がある
- th()次元のカテゴリ数をとする
- のセルの総数はである
- には、複体で表される周辺度数制約がある
- ここでは(正)単体であり、の頂点はの部分集合である
- による周辺度数制約とは、が作る、の部分表に相当する周辺度数が与えられていることを意味する
- 長さのベクトルは表のセルの値とする
- 今、の構成であるが与えられているとき、を同長のベクトルに1対1対応で移す行列()を次のような条件を満足するようにとることができる
- 2つの表があり、それらはで表される部分表に相当する周辺度数が等しいとすると、この2表に対応するはであって、長さのベクトルの値は、部分表のセルの数だけ一致する
- ここで、が与えられ、に対応して周辺度数表が定まるとき、その条件に合致する表の集合が得られる
- を考え、その差を取る
- 対応するベクトル,はの関係にあり、は制約が定める要素数が等しいから、は制約が定める要素数だけ、値が0であるようなベクトルである
- このようにであるとき、の要素のうち必ず0となるような要素の数をとすれば、は、の自由度である
- であるときに
- 長さの正数からなるベクトルとを定め、その成分の平方根の逆数を対角成分とする対角行列を定め、スカラー量を定義する
- であるから、である。ただし
- ここでについての個の成分はであるから、その成分を除去した長さのベクトルをとし、からそれに対応する列ベクトルのみを抽出した行列をとすると、
- これを書き換えてとなるが、であることに注意すれば、なる行列を用いてと表せることがわかる
- ここでと固有値分解することでとなり、これは長さのベクトルのノルムの二乗である
- の定義に戻ると、が期待値表に対応していると見れば、これは期待値からの逸脱に関するカイ二乗統計量であり、周辺度数制約を満足する表のセルの値のベクトルの線形代数変換によって得られた自由度の長さのベクトルのノルムの二乗として表せることが示された
- 言い換えると、周辺度数制約を満足する表のうち、を等しくするものを、自由度次元空間の球表面へと写す座標変換ができたことになる
- 実行
NFacets<-10
Niter<-10
S1<-S2<-S3<-rep(0,NFacets*Niter)
cnt<-1
for(ii in 1:NFacets){
Nv<-5
Rs<-sample(2:3,Nv,replace=TRUE)
Vs<-1:Nv
ns<-Rs
Nf<-3
Faces<-list()
maxN<-3
Ns<-sample(1:maxN,Nf,replace=TRUE)
for(i in 1:Nf){
tmpVs<-sample(Vs,Ns[i])
Faces[[i]]<-as.set(tmpVs)
}
Facets<-MakeFacets(Faces)
g<-GraphFacets(Nv,Facets,plot=FALSE)
Obs<-array(runif(prod(ns)),ns)
Obs<-Obs/sum(Obs)
m.e.out<-MakeExpected4(Obs,ns,Facets)
Etable<-m.e.out$Etable
X<-m.e.out$X
Z<-m.e.out$Z
v2<-c(Obs-Etable)
P<-X%*%v2
print(Z)
Xinv<-solve(X)
XinvPartial<-Xinv[,which(Z==1)]
XinvPartialt<-t(Xinv)[which(Z==1),]
W<-XinvPartialt%*%diag(1/c(Etable))%*%XinvPartial
eigen.out<-eigen(W)
V<-eigen.out$vectors
S<-diag(eigen.out$values)
E<-diag(1/sqrt(c(Etable)))
Einv<-diag(sqrt(c(Etable)))
Q<-E%*%Xinv%*%P
Qz<-diag(sqrt(eigen.out$values))%*%solve(V)%*%P[which(Z==1)]
S1[cnt]<-sum(Q^2)
S2[cnt]<-sum(Qz^2)
S3[cnt]<-sum((v2^2)/c(Etable))
cnt<-cnt+1
for(jj in 2:Niter){
QzRandom<-rnorm(length(Qz))
QzRandom<-QzRandom/sqrt(sum(QzRandom^2))
QzRandom<-QzRandom*sqrt(sum(Qz^2))
PzRandom<-V%*%diag(1/sqrt(eigen.out$values))%*%QzRandom
PRandom<-rep(0,length(P))
PRandom[which(Z==1)]<-PzRandom
QRandom2<-E%*%Xinv%*%PRandom
DRandom<-Xinv%*%PRandom
S1[cnt]<-sum(QRandom2^2)
S2[cnt]<-sum(QzRandom^2)
S3[cnt]<-sum(DRandom^2/c(Etable))
cnt<-cnt+1
}
}
plot(as.data.frame(cbind(S1,S2,S3)))