家系データをシミュレーションで作る3

  • 3. 組換え体を作る
    • 同一の染色体上に複数の多型があるときに、伝達にあたって、多型間で組換えがおきるかどうかを考慮した上で、同一染色体上のアレルはまとまって(ハプロタイプとして)伝達される
    • 組換えが起きるかどうかは確率的であるので、その起きやすさを値で指定する必要がある
    • 「遺伝的距離」で与えることとする
    • 「遺伝的距離」がわからないときは「物理的距離」から、適当に推定することになる
    • "モルガンは、遺伝学的方法で定められた、染色体の上での遺伝子間の距離を表す単位。生殖細胞ができる減数分裂1回当たり、相同染色体間に平均1回の交叉が起こる距離を1モルガンとし、その1/100を1センチモルガン(cM)とする。1cMは約1000キロベースペア(1000kbp、100万塩基対)に相当するといわれている。"(こちらから)

# 組換えをシミュレーションするために、2本のハプロタイプを作る
# Ns個のマーカーの(Ns-1)個の「間」について、モルガン単位で遺伝的距離を定める
Dg<-runif(Ns-1)
# 組換えを起こして2つの組換え体を作ろう
# マーカー間ごとに、交叉がおきるかどうかを確率的に決める
rands.crossing<-runif(length(Dg))
# 交差がおきた箇所を取り出す
Cross<-which((Dg-rands.crossing)>0)
Cross
# 交差が起きたかどうかの情報を用いて組換え体を作る
hap1<-Haps[1,]
hap2<-Haps[2,]
rec.hap1<-hap1
rec.hap2<-hap2
if(length(Cross)>0){
  for(i in 1:length(Cross)){
    # 交差箇所より尾部について、rec.hap1,rec.hap2で交換する
    tmp.tail1<-rec.hap1[(Cross[i]+1):Ns]
    tmp.tail2<-rec.hap2[(Cross[i]+1):Ns]
    rec.hap1[(Cross[i]+1):Ns]<-tmp.tail2
    rec.hap2[(Cross[i]+1):Ns]<-tmp.tail1
  }
}
Cross
hap1
hap2
rec.hap1
rec.hap2
    • Crossの情報がhap1,hap2,rec.hap1,rec.hap2のハプロタイプ状態と合致するかどうかを目視で確認する
    • これを関数化する
# 2本のハプロタイプと、多型間遺伝的距離から、組換え体2本を返す
Rec.Haplotype<-function(hap1,hap2,d){
	Ns<-length(hap1)
	rands.crossing<-runif(length(d))
	# 交差がおきた箇所を取り出す
	Cross<-which((d-rands.crossing)>0)
	# 交差が起きたかどうかの情報を用いて組換え体を作る
	rec.hap1<-hap1
	rec.hap2<-hap2
	if(length(Cross)>0){
		for(i in 1:length(Cross)){
			# 交差箇所より尾部について、rec.hap1,rec.hap2で交換する
			tmp.tail1<-rec.hap1[(Cross[i]+1):Ns]
			tmp.tail2<-rec.hap2[(Cross[i]+1):Ns]
			rec.hap1[(Cross[i]+1):Ns]<-tmp.tail2
			rec.hap2[(Cross[i]+1):Ns]<-tmp.tail1
		}
	}
	matrix(c(rec.hap1,rec.hap2),byrow=TRUE,nrow=2)
}
# 使ってみる

rec.haps<-Rec.Haplotype(Haps[1,],Haps[2,],Dg)
rec.haps