染色体グラフ

  • 家系図がある
  • 常染色体の場合は、子の染色体は母方・父方の2本ある
  • ●方の染色体は親●の2本の染色体のいずれかである
    • いずれかであるけれど、そのどちらかがわからないとき、両方と辺でつなぐ
  • このようにすると、個人間の血縁関係で作ったグラフが複数のグラフに分離する(血族婚がない場合)
  • どのように分離するか
    • 「母方」のグラフと「父方」のグラフ
    • 子を産むと、その生まれた子の「親」の母方グラフと父方グラフが連結する
  • このようなグラフを2通りの表現で作ってみる
    • 個人の家系情報は3列の行列にあるとする(第1列はシーケンシャルID、第2列は母ID,第3列は父ID)
    • 染色体グラフは、人数の2倍のノードに関する正方行列で表現すれば、こちら
MakeHaplotypeGraph<-function(p){
	ns<-length(p[,1])
	m<-matrix(0,2*ns,2*ns)
	# 2*i-1,2*iはi番個人の母方と父方の染色体
	for(i in 1:ns){
		tmpmom<-p[i,2]
		tmpdad<-p[i,3]
		if(tmpmom!=0){
			m[2*i-1,2*tmpmom-1]<-m[2*i-1,2*tmpmom]<-1
		}
		if(tmpdad!=0){
			m[2*i,2*tmpdad-1]<-m[2*i,2*tmpdad]<-1
		}
	}
	#print(m)
	sign(m+t(m))
}
MakeHaplotypeGraph(p)
MakeHaplotypeGraph(p)
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    0    0    0    0    0    1    0    1    0     1
 [2,]    0    0    0    0    0    1    0    1    0     1
 [3,]    0    0    0    0    1    0    1    0    1     0
 [4,]    0    0    0    0    1    0    1    0    1     0
 [5,]    0    0    1    1    0    0    0    0    0     0
 [6,]    1    1    0    0    0    0    0    0    0     0
 [7,]    0    0    1    1    0    0    0    0    0     0
 [8,]    1    1    0    0    0    0    0    0    0     0
 [9,]    0    0    1    1    0    0    0    0    0     0
[10,]    1    1    0    0    0    0    0    0    0     0
  • 染色体本数のノードの親側染色体ノード2列に納めた、「染色体本数」x「2」行列なら
MakeHaplotypeGraph2<-function(p){
	ns<-length(p[,1])
	ret<-matrix(0,ns*2,2)
	# 2*i-1,2*iはi番個人の母方と父方の染色体
	for(i in 1:ns){
		tmpmom<-p[i,2]
		tmpdad<-p[i,3]
		ret[2*i-1,1]<-2*tmpmom-1
		ret[2*i-1,2]<-2*tmpmom
		ret[2*i,1]<-2*tmpdad-1
		ret[2*i,2]<-2*tmpdad
	}
	ret[which(ret<0)]<-0
	ret
}
MakeHaplotypeGraph2(p)
> MakeHaplotypeGraph2(p)
      [,1] [,2]
 [1,]    0    0
 [2,]    0    0
 [3,]    0    0
 [4,]    0    0
 [5,]    3    4
 [6,]    1    2
 [7,]    3    4
 [8,]    1    2
 [9,]    3    4
[10,]    1    2