無性生殖集団の親子鑑定
- 倍々で増える無性生殖生物集団を考える
- すべての個体は不死であって、増殖を続けると仮定する
- 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)