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

  • 6. 家系図の情報を使って、ジェノタイプを作る
    • 両親の不明な個人のジェノタイプは、HWEを仮定したMake.Haplotype()関数を使う
    • 両親がわかっている個人のジェノタイプは、MakeOffspring()関数を使う
    • 親子関係行列を作るときに、子のIDが親のIDより大きいように作ってあるので、親子関係行列の上の行から下の行へと順番にジェノタイプを作っていけばよい
    • 順番に処理するときにはループ処理を使う
# M.cousins[,1]はM.cousings[,1]の第1列のこと
n.rows<-length(M.cousins[,1]) # nrows<-nrow(M.cousins)でも同じこと
# 人数=n.rows 分のジェノタイプは マーカー数 x 2 行列が人数分あるので、それを納めるリストを作る
sim.G<-list()

# 第1行から第n.rows行まで、順番に処理するループ
for(i in 1:n.rows){
  # ここで処理される人はi行目の人
  # その人の両親は
  tmp.father<-M.cousins[i,1]
  tmp.mother<-M.cousins[i,2]
  # tmp.father,tmp.motherのジェノタイプは
  if(tmp.father==0){
    father.genotype<-MakeHaplotype(NaS,PaS,2)
  }else{
    # 親のジェノタイプはこのループ処理ですでに決まっている
    father.genotype<-sim.G[[tmp.father]]
  }
  if(tmp.mother==0){
    mother.genotype<-MakeHaplotype(NaS,PaS,2)
  }else{
    mother.genotype<-sim.G[[tmp.mother]]
  }
  # 両親のジェノタイプが決まったので、この人のジェノタイプを決める
  sim.G[[i]]<-MakeOffspring(father.genotype,mother.genotype,Dg)
}
sim.G
M.cousins
    • 親子関係からsim.Gが適切かどうかを目視で確認してみる
    • 関数化する
# 引数はM.cousins,NaS,PaS,Dg
Simulate.Genotype<-function(M,NaS,PaS,Dg){
  # M.cousins[,1]はM.cousings[,1]の第1列のこと
  n.rows<-length(M.cousins[,1]) # nrows<-nrow(M.cousins)でも同じこと
  # 人数=n.rows 分のジェノタイプは マーカー数 x 2 行列が人数分あるので、それを納めるリストを作る
  sim.G<-list()

  # 第1行から第n.rows行まで、順番に処理するループ
  for(i in 1:n.rows){
    # ここで処理される人はi行目の人
    # その人の両親は
    tmp.father<-M.cousins[i,1]
    tmp.mother<-M.cousins[i,2]
    # tmp.father,tmp.motherのジェノタイプは
    if(tmp.father==0){
      father.genotype<-MakeHaplotype(NaS,PaS,2)
    }else{
      # 親のジェノタイプはこのループ処理ですでに決まっている
      father.genotype<-sim.G[[tmp.father]]
    }
    if(tmp.mother==0){
      mother.genotype<-MakeHaplotype(NaS,PaS,2)
    }else{
      mother.genotype<-sim.G[[tmp.mother]]
    }
    # 両親のジェノタイプが決まったので、この人のジェノタイプを決める
    sim.G[[i]]<-MakeOffspring(father.genotype,mother.genotype,Dg)
  }
  sim.G
}
# 使ってみる
sim.G<-Simulate.Genotype(M.cousins,NaS,PaS,Dg)
sim.G