2ローカス間の組換え
- 同じ染色体上の2ローカス間の組換えのシミュレーション
- それぞれのローカスに存在するアレル数は一般化してある
- 仮定など
- 染色体は1本
- アレルの存在するローカスは2カ所
- アレルの本数は一般: N1, N2
- はじめのallotypeの存在確率の分布: p
- 世代: T
- 組換え率: s
- 方針として
- はじめに各ローカスのアレルの頻度ではなく、その組であるallotypeの存在確率を仮定した
- allotypeの頻度から2倍体の頻度を計算する
- 2倍体が次の世代へ遺伝子を伝えるときに組換えが起きる
- さらに具体的には
- が2倍体の存在確率の行列
- 行列Bがallotypeが2倍体からつくられる時の確率を係数にした行列
- 上の二つを掛け合わせるとあるアレルの次世代の存在確率が計算できる
- 行列Bは確率を計算する次世代のallotypeごとに異なる
N1<-3 #ローカス1に存在するアレル数 N2<-3 #ローカス2に存在するアレル数 p<-rep(0,N1*N2) #pは第一世代のallotypeの存在確率 p[c(1,5,9)]<-c(1/2,1/4,1/4) R<-q<-c() #最終的に行列Rにallotypeの世代ごとの存在確率を並べて書く R<-cbind(R,p) #第一世代のR T<-20 #世代数 s<-0.3 #組換え率 A<-matrix(0,N1*N2,N1*N2) #行列Bをつくる準備 #n<-N1*i0+j0 #この法則でallotypeに0から順の番号をつける (つまりはN1,N2進法) while (ncol(R)<T){ for (i0 in 0:(N1-1)){ #ローカス1のアレルがi0 for(j0 in 0:(N2-1)){ #ローカス2のアレルがj0 A<-matrix(0,N1*N2,N1*N2) #ここからが係数行列Bを作る操作 A[N1*i0+j0+1,]<-c(1/2) #この行に1/2をいれておく for (i1 in 0:(N1-1)){ for (j1 in 0:(N2-1)){ if (i0 != i1 && j1 == j0){ A[N1*i0+j0+1,N1*i1+j0+1]<-1/2 #j(locus2)が一致しているので1/2 }else if ( i0 != i1 && j1 != j0){ A[N1*i0+j0+1,N1*i1+j1+1]<-(1-s)/2 #同じ染色体に(i0,j0)があるので組み換わらなければ(j0,i0)ができる A[N1*i0+j1+1,N1*i1+j0+1]<-s/2 #i0とj0が別の染色体にあるので、組み換わると(i0,j0)が作られる } } } B<-A+t(A) #これでBができる q<-append(q,t(p)%*%B%*%p) #このqに(i0,j0)のalleleの次世代の存在確率がはいっていく } } R<-cbind(R,q) #この時点でqは次世代のallotypeの存在確率のベクトル p<-q q<-c() } persp(R,xlab="allotype",ylab="generation",zlab="probability",col="green",theta=15,phi=30,shade=0.3)
library(rgl) plot3d(row(R),col(R),R,col=rainbow(N1*N2),xlab="allotype",ylab="generation",zlab="probability")
- 世代を経て平になると思ったらならなかった
- 計算で確かめられるか
- ローカスをふやすと独立ではなくなるし、交差回数の偶奇性もsに入ってきそう...