家系図の演算

  • こちらこちら有性生殖の(行列)演算のことを書いている
  • 個々の親子トリオは線形代数(ベクトル・行列)を使った演算だった
  • 家系図全体の演算はどうなるだろう
  • 家系図はグラフで言う「木」
  • 時間の約束は守っているので、すべてのトリオの生成には順序があるので、すべてのトリオの演算には全順序がありそうだ
  • だからと言って、「家系図」の「木」は一列に並んでいない
  • いわゆる半順序の様相を呈している
  • さて、これはどういう風に考えればよいか
  • いずれにせよ、「家系図〜木」が与えられた時点で、トリオ演算として実行するべき「(全)順序」を定めることができるので、何度も同じ「グラフ〜木」に親子トリオ演算を行うときには、「グラフ」を「直列処理」に直して実行することで、「グラフ」を「直列処理」にする部分を解くオーバーヘッドを省略することはできそうだ
  • ぼんやりしたところでは「多価関数〜グラフ〜グラフ〜順序(こちら)」、「有性生殖による多様性算出〜多価化する線形代数処理?(こちら」、「グラフ〜多次元空間の取引(こちら)」とこの話がつながるようなつながらないような・・・(たぶん、つながる、緩くはつながる)
  • うんちくはさておき、親子関係情報が「思いついた順番」のときに、時系列を考慮してIDづけしなおして並べ替えてみよう
p<-matrix(
c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
  0, 0, 0, 0, 2, 2, 4, 4, 6,  6,  0,  0, 12, 13,
  0, 0, 0, 0, 1, 1, 3, 3, 7,  7,  0,  0, 11, 10,
  0, 1, 0, 1, 0, 1, 0, 1, 0,  0,  0,  1,  1,  1,
  1,1,1,1,2,3,3,1,3,1,1,2,2,1),
  ncol=5)
library(kinship)
MakePedigreeFromFamilyInfo<-function(p){
	ns<-length(p[,1])
	affected<-status<-rep(1,ns)
	affected[which(p[,5]==2)]<-0
	affected[which(p[,5]==3)]<-0
	status[which(p[,5]==1)]<-0
	status[which(p[,5]==2)]<-0
	ptemp<-pedigree(id=p[,1],dadid=p[,3],momid=p[,2],sex=p[,4],affected=affected,status=status)
	if(sum(ptemp$affected)==0)ptemp$affected<-affected
	ptemp
}


s<-sample(1:length(p[,1]))
sbind<-cbind(1:length(p[,1]),s)
p2<-p
# IDをぐちゃぐちゃにする
ReOrder<-function(p,s){
	p2<-p
	for(i in 1:length(p[,1])){
		p2[i,1]<-s[p[i,1]]
		if(p[i,2]!=0)p2[i,2]<-s[p[i,2]]
		if(p[i,3]!=0)p2[i,3]<-s[p[i,3]]
	}
	p2
}
ReOrder2<-function(p,s2){
	p2<-p
	#for(i in 1:length(p[,1])){
	#	p2[i,1]<-s2[ps[i,1],2]
	#	if(p[i,2]!=0)p2[i,2]<-s2[p2[i,2],2]
	#	if(p[i,3]!=0)p2[i,3]<-s2[p2[i,2],3]
	#}
	p2
}
p2<-ReOrder(p,s)

p2sort<-p2[order(p2[,1]),]

ptemp<-MakePedigreeFromFamilyInfo(p2sort)
plot(ptemp)

# 若いIDが親になるようにIDを付け替える
# 元のpでの本人IDが新しいそれで何になったか
SortPedigree<-function(p){
	n<-length(p[,1])
	newid<-rep(-1,n)
	sumfm<-p[,2]+p[,3]
	noparents<-which(sumfm==0)
	withparents<-which(sumfm!=0)
	cnt<-length(noparents)
	newid[p[noparents,1]]<-1:cnt
	#print(newid)
	cnt<-cnt+1
	while(length(withparents>0)){
		for(i in withparents){
			tmpm<-p[i,2]
			tmpf<-p[i,3]
			if(newid[tmpm]!=-1 & newid[tmpf]!=-1){
				newid[p[i,1]]<-cnt
				cnt<-cnt+1
			}
			#print(newid)
			withparents<-which(newid==-1)
		}
		
	}
	cbind(1:n,newid)
	
}
# 
neworder<-SortPedigree(p2sort)
neworder
p3<-ReOrder(p2sort,neworder[,2])
p3sort<-p3[order(p3[,1]),]
p
p2
p2sort
p3

par(mfcol=c(2,3))
plot(MakePedigreeFromFamilyInfo(p))
plot(MakePedigreeFromFamilyInfo(p2))
plot(MakePedigreeFromFamilyInfo(p2sort))
plot(MakePedigreeFromFamilyInfo(p3))
plot(MakePedigreeFromFamilyInfo(p3sort))


par(mfcol=c(1,1))