分割表の正球化したら、コンビネーションも正球化しよう

  • こちらなどでpermutohedronについて書いた
  • パーミュテーション(順列)はマルチプルテスティングでも用いる
  • 順列が多次元空間でどのように配置されるかは、気にしているところ(こちらなど)
  • そんなパーミュテーションが多次元球面配置されるのだが、その「座標」を求める方法とその図示がこちら
  • たとえば、N=n_1+n_2人のケースコントロールスタディでは\begin{pmatrix}N\\n_1\end{pmatrix}の組み合わせをパーミュテーショナルに発生させる。そのような、組み合わせがもたらす分割表に対応する点も球面に配置できる。

http://www.genome.med.kyoto-u.ac.jp/StatGenet/testRY20110208/Combination-hedron.png

  • それは以下のように
#library(sphere) # CategoryVector()を有する私的パッケージ
CategoryVector<-
function (nc = 3) 
{
    df <- nc - 1
    d <- df + 1
    diagval <- 1:d
    diagval <- sqrt((df + 1)/df) * sqrt((df - diagval + 1)/(df - 
        diagval + 2))
    others <- -diagval/(df - (0:(d - 1)))
    m <- matrix(rep(others, df + 1), nrow = df + 1, byrow = TRUE)
    diag(m) <- diagval
    m[upper.tri(m)] <- 0
    as.matrix(m[, 1:df])
}

n1<-3
n2<-2
N<-n1+n2 # 大きい数字だと、重くなるのは当然…
X<-CategoryVector(N)
library(gtools)
c<-combinations(N,n1)
p<-matrix(0,length(c[,1]),N)
for(i in 1:length(c[,1])){
	p[i,c[i,]]<-1
}
Ph<-p%*%X

library(rgl)
# N-2要素が一致している順列ペアを確認し、辺を描かせる
# 辺数調べの最大値制約を入れる
Emax<-1000000
Ecounter<-0
E<-NULL
DifID<-NULL
for(i in 1:(length(p[,1])-1)){
	for(j in (i+1):length(p[,1])){
		tmp<-p[i,]-p[j,]
		Ecounter<-Ecounter+1
		if(length(which(tmp==0))==N-2 & length(which(abs(tmp)==1))==2){
			E<-rbind(E,Ph[i,])
			E<-rbind(E,Ph[j,])
			DifID<-rbind(DifID,sort(which(abs(tmp)==1)))
		}
		if(Ecounter==Emax){
			break
		}
		
	}
	if(Ecounter==Emax){
			break
		}
}
plot3d(Ph[,1],Ph[,2],Ph[,3])

# 異なる順列位置によって辺の色を変える
C<-DifID%*% matrix(c(1,N+1),2,1)

segments3d(E[,1:3],col=rainbow(C),lwd=3)

image(Ph%*%t(Ph))