- 5日目。一昨昨日、一昨日と昨日(記事はこちらとこちらとこちらとこちら)の続き
- 多次元球面上に均一分布を発生させることはできるので、ピアソンのカイ自乗値の式をM軸に伸縮させてやることで、特定のカイ自乗値をとるテーブルを多次元球面上の点とすることとし、それを利用して、同一カイ自乗値をとるテーブルをランダムに発生させる
- この処理はここでもできる
makeTblSameChi2<-function(t=matrix(c(10,20,30,40,50,60),nrow=2,byrow=TRUE),K=1,N=1000){
df<-length(t[1,])-1
# marginal counts
m1<-apply(t,1,sum)
m2<-apply(t,2,sum)
ms<-sum(t)
#expected table
et<-outer(m1,m2,FUN="*")/ms
etone<-c(et[1,],et[2,])
weight<-m2*m1[1]*m1[2]/(ms^2)
rs<-matrix(rnorm((df+1)*N),nrow=N)
rssq<-rs^2
ds<-sqrt(apply(rssq,1,sum))
rs<-rs/ds*sqrt(K)
tmp<-t(t(sqrt(weight))%*%t(rs))/sum(weight)
rs<-rs-tmp%*%t(sqrt(weight))
rssq<-rs^2
ds<-sqrt(apply(rssq,1,sum))
rs<-rs/ds*sqrt(K) # ここまでが球
rs<-t(t(rs)*sqrt(weight)) # ここからは楕(円)球
rs<-as.matrix(cbind(rs,-rs))
t(t(rs)+etone)
}