比較する

  • Rには固定周辺度数を引数に分割表を乱数発生する関数r2dtable()がある(こちら)
  • Patefield's algorithmを用いる
  • 地道にやるのとPatefield's でやるのとの違いはどれくらい?
  • ほとんど違わない
Nr<-2
Nc<-2
M<-matrix(sample(1:100,Nr*Nc,replace=TRUE),Nr,Nc)


M
rSum<-apply(M,1,sum)
cSum<-apply(M,2,sum)

Lab1<-Lab2<-c()
for(i in 1:Nr){
	Lab1<-c(Lab1,rep(i,rSum[i]))
}
for(i in 1:Nc){
	Lab2<-c(Lab2,rep(i,cSum[i]))
}
ExpTable<-ExpTable<-outer(rSum,cSum,"*")/sum(M)

Niter<-10000
ChiS<-rep(0,Niter)
ChiP<-rep(0,Niter)
ExPS<-ChiS
ExSS<-ChiS
tPs<-r2dtable(Niter,rSum,cSum)
tSs<-tPs
for(i in 1:Niter){
	tmp<-cbind(Lab1,sample(Lab2))
	tmpM<-matrix(0,Nr,Nc)
	for(j in 1:length(tmp[,1])){
		tmpM[tmp[j,1],tmp[j,2]]<-tmpM[tmp[j,1],tmp[j,2]]+1
	}
	tSs[[i]]<-tmpM
	ChiS[i]<-sum((tSs[[i]]-ExpTable)^2/ExpTable)
	ChiP[i]<-sum((tPs[[i]]-ExpTable)^2/ExpTable)
	ExPS[i]<-fisher.test(tPs[[i]])$p
	ExSS[i]<-fisher.test(tSs[[i]])$p
}

plot(pchisq(sort(ChiS),(Nc-1)*(Nr-1)),pchisq(sort(ChiP),(Nc-1)*(Nr-1)))
plot(sort(ExPS))
plot(sort(ExSS))
par(mfcol=c(1,2))

plot(log(ppoints(Niter,a=0)),cex=0.1,pch=19,log(sort(ExPS)),xlim=c(-8,0),ylim=c(-8,0))
abline(0,1,col=3)
#par(new=TRUE)
plot(log(ppoints(Niter,a=0)),cex=0.1,pch=19,log(sort(ExSS)),col=2,xlim=c(-8,0),ylim=c(-8,0))
abline(0,1,col=3)