無性生殖集団の親子鑑定

  • 倍々で増える無性生殖生物集団を考える
  • すべての個体は不死であって、増殖を続けると仮定する
  • DNA配列はポアッソン乱数で変異が入る
  • Infinite modelを仮定し、変異は必ず新規なものとする
  • グラフオブジェクトに納めることで
    • グラフ上の距離(パスの長さ)が親等に
    • エッジに変異の数の重みを与えて、グラフ上の重み付き距離(重み付きパス長)を取れば、それが、DNA配列の異なる塩基数になる
  • このような単純な集団において、親等と配列の違いとの関係を考慮することは、生殖集団におけるDNA配列の差による、親等の鑑別の(もっとも)基礎的な枠組みに相当する
  • Rでのグラフ理論(igraphパッケージ)についての基礎はこちら





library(igraph)

# 無性生殖生物の親子鑑定

# 倍々で増える
# 変異は増えるだけ infinite site model
Ngen<-6
poisl<-5

# グラフのエッジリストである2列の行列
edges<-NULL
# グラフのエッジの重みを格納するベクトル
edge.weight<-NULL
cnt<-1
#v<-c(0)
for(i in 1:Ngen){
	# 変異数はポアッソン乱数
	rs<-rpois(cnt*2,poisl)
	#v<-c(v,rep(v,2)+rs)
	edges<-rbind(edges,matrix(c(rep(1:cnt,2),(cnt+1):(cnt*3)),ncol=2)-1)
	edge.weight<-c(edge.weight,rs)
	cnt<-cnt+length(rs)
}
# グラフオブジェクト化
g<-graph.edgelist(edges)
# グラフをプロット
plot(g,layout=layout.circle)
# ノード間の距離(親等に相当)
sh<-shortest.paths(g)
# ノード間の配列の違う箇所数は重み付き距離
sh.weight<-shortest.paths(g,weights=edge.weight)
#dna.dist<-abs(outer(v,v,FUN="+"))
# 親等の最小・最大
path.len.range<-range(sh)
# ノード間の親等別ペア数
hist(c(sh))
# ノード間の配列の違いの度数分布
hist(c(sh.weight))

# 親等ごとに配列の違いを度数分布
par(ask=TRUE)
dist.per.kinship<-list()
for(i in 1:(path.len.range[2]-path.len.range[1]+1)){
	dist.per.kinship[[i]]<-sh.weight[which(sh==path.len.range[1]+i-1)]
	hist(dist.per.kinship[[i]])
}
# 親等別に配列の違いをボックスプロット
boxplot(dist.per.kinship)
par(ask=FALSE)