分割表の位置・自由度・座標変換のまとめ 分割表の正単体・複体座標表現によるカイ二乗検定

  • こちらの整理記事
  • k次元の表tがある
  • i-th(i=1,2,...,k)次元のカテゴリ数を\mathbf{r}=\{r_i\}とする
  • tのセルの総数はR=\prod_{i=1}^k r_iである
  • tには、複体\mathbf{S}=\{S_j\}で表される周辺度数制約がある
    • ここでS_jは(正)単体であり、S_jの頂点は\{1,2,...,k\}の部分集合である
    • \mathbf{S}による周辺度数制約とは、S_jが作る、Tの部分表に相当する周辺度数が与えられていることを意味する
  • 長さRのベクトルaは表tのセルの値とする
  • 今、tの構成であるk,\mathbf{r}が与えられているとき、aを同長のベクトルbに1対1対応で移すR\times R行列X(b=Xa,a=X^{-1}b)を次のような条件を満足するようにとることができる
    • 2つの表t_1,t_2があり、それらはS_xで表される部分表に相当する周辺度数が等しいとすると、この2表に対応するa_1,a_2,b_1,b_2bB_1=Xa_1,b_2=Xa_2であって、長さRのベクトルb_1,b_2の値は、部分表のセルの数R(S_x)だけ一致する
  • ここで、k,\mathbf{r},\mathbf{S}が与えられ、\mathbf{S}に対応して周辺度数表\mathbf{\tau(\mathbf{S})}が定まるとき、その条件に合致する表の集合\mathbf{T}=\{t|k,\mathbf{r},\mathbf{S},\mathbf{\tau(\mathbf{S})}\}が得られる
  • t_i,t_j \in \mathbf{T}を考え、その差d_{i,j}=t_i-t_jを取る
  • 対応するベクトルa_i,a_j,\alpha_{i,j}=a_i-a_j,b_i,b_j,\beta_{i,j}b_i=Xa_i,b_j=Xa_j,\beta_{i,j}=X\alpha_{i,j}の関係にあり、b_i,b_jは制約\mathbf{S}が定める要素数が等しいから、\beta_{i,j}は制約\mathbf{S}が定める要素数だけ、値が0であるようなベクトルである
  • このようにt_i,t_j\in \mathbf{T}であるとき、\beta_{i,j}の要素のうち必ず0となるような要素の数をgとすれば、f=R-gは、\mathbf{T}の自由度である
  • \beta_{i,j}=X\alpha_{i,j},\alpha_{i,j}=X^{-1}\beta_{i,j}であるときに
  • 長さRの正数からなるベクトルとe\in \mathbf{T}を定め、その成分の平方根の逆数を対角成分とするR\times R対角行列Eを定め、スカラーK^2=(E\alpha_{i,e})^{T}(E\alpha_{i,e})を定義する
  • \alpha_{i,e}=X^{-1}\beta_{i,e}であるから、K^2=(EY\beta_{i,e})^{T}(EY\beta_{i,e})である。ただしY=X^{-1}
  • ここで\forall iについて\beta_{i,e}g個の成分は0であるから、その成分を除去した長さfのベクトルを\beta_{i,e}'とし、Yからそれに対応する列ベクトルのみを抽出したR\times f行列をY'とすると、K^2=(EY'\beta_{i,e}')^{T}(EY'\beta_{i,e}')
  • これを書き換えてK^2=\beta_{i,e}'^{T} (Y'^{T}E^TEY')\beta_{i,e}'となるが、E^T=Eであることに注意すれば、W=Y'^{T}E^2Y'なるf \times f行列を用いてK^2=\beta_{i,e}'^{T} W)\beta_{i,e}'と表せることがわかる
  • ここでW=V\Sigma \Sigma V^{-1}固有値分解することでK^2=(\Sigma V^{-1}\beta_{i,e}')^T(\Sigma V^{-1}\beta_{i,e}')となり、これは長さfのベクトルQ=\Sigma V^{-1}\beta_{i,e}'のノルムの二乗である
  • K^2の定義に戻ると、eが期待値表に対応していると見れば、これは期待値からの逸脱に関するカイ二乗統計量であり、周辺度数制約\mathbf{S}を満足する表t_iのセルの値のベクトルa_i線形代数変換によって得られた自由度の長さのベクトルQのノルムの二乗として表せることが示された
  • 言い換えると、周辺度数制約\mathbf{S}を満足する表t \in \mathbf{T}のうち、K^2を等しくするものを、自由度f次元空間の球表面へと写す座標変換ができたことになる
  • 実行
###############xxx###########
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
	# Facesをランダムに作る
	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にする
	Facets<-MakeFacets(Faces)
	# グラフにしてみる

	g<-GraphFacets(Nv,Facets,plot=FALSE)
	##############
	#Facets<-set(1:Nv)
	# 観測表をランダムに作る
	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
#Etable-Etable2
# ObsとFacetsとから、期待値表を得よう

v2<-c(Obs-Etable)
#out.makeX2<-MakeX2(ns,Facets)
#X<-out.makeX2$matrixX
#Z<-out.makeX2$zeros
	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)))