特定の2xMピアソンカイ自乗値を取るテーブルをランダムに作る

  • 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)
}