根据系谱计算近交系数和亲缘关系系数(How to)

用到的软件包:asreml

运行GetASremlInfor函数

将此代码在R语言里面运行即可

GetASremlInfor<-function(ped){
  require(asreml)
  ainv <- asreml.Ainverse(ped)$ginv
  ani <- ainv
  head(ani)
  n<-max(ani$Row,ani$Column)###查看逆矩阵中最大的号
  mat=matrix(0,n,n)###生成N阶值为的0矩阵
  mat_xiang_guan=matrix(0,n,n)###生成N阶值为的0矩阵
  mat[cbind(ani$Row,ani$Column)]<-ani$Ainverse####把行号和列号对应的值赋给空矩阵
  mat[upper.tri(mat)]=t(mat)[upper.tri(t(mat))]####生成对称矩阵生成A-1(asreml生成的逆矩阵)
  nnn_biao_ni<-mat
  biao_zhun_xi_pu_ju_zhen<-solve(nnn_biao_ni)###把原来的逆矩阵变换成系谱相关矩阵A
  ##############################求近交系数###################################
  inbreeding_coefficient<-diag(biao_zhun_xi_pu_ju_zhen)-1#求出矩阵的对角线,-1就是近交系数
  inbreeding_coefficient[inbreeding_coefficient < 0.000000001] <- 0
  matrix_number<-(1:n)###生成矩阵位置编号
  animal_code<-ped[,1]
  data<-data.frame(matrix_number,animal_code,inbreeding_coefficient)###生成一个数据框,包括序号和近交系数
  write.csv(data,"inbreeding_coefficient_ data.csv")
  ################################下面是求相关系数###############################
  nnn<-biao_zhun_xi_pu_ju_zhen
  for (a in (1:n)){
    for (b in (1:n)){
      x<-nnn[a,b]/sqrt(nnn[a,a]*nnn[b,b])
      mat_xiang_guan[a,b]<-x
      }
  }
  xiang_guan_xi_shu<-mat_xiang_guan
  dim(xiang_guan_xi_shu)<-NULL###把矩阵编程变量,一维的
  hang<-rep(animal_code,each=n)####生成行
  lie<-rep(animal_code,n)######生成列
  length(lie);length(hang);length(xiang_guan_xi_shu)
  xiang_guan_xi_shu
  en<-data.frame(hang,lie,xiang_guan_xi_shu)######生成一个数据框,包括行、列、相关系数
  real_xishu<-en[which(en$xiang_guan_xi_shu >= 0.0000001),]##把近亲系数为0的列去掉
  colnames(real_xishu)<-c("animal_code_1","animal_code_2","coefficient_of_coancestry")  
  real_xishu  
  write.csv(real_xishu,"coancestry_file.csv")
}

构建系谱信息

ped <- data.frame(ID = c(1,2,3,4,5,6), Sire = c("NA","NA",1,1,4,5), Dam =c("NA","NA",2,"NA",3,2))
ped

<table>
<thead><tr><th scope=col>ID</th><th scope=col>Sire</th><th scope=col>Dam</th></tr></thead>
<tbody>
<tr><td>1 </td><td>NA</td><td>NA</td></tr>
<tr><td>2 </td><td>NA</td><td>NA</td></tr>
<tr><td>3 </td><td>1 </td><td>2 </td></tr>
<tr><td>4 </td><td>1 </td><td>NA</td></tr>
<tr><td>5 </td><td>4 </td><td>3 </td></tr>
<tr><td>6 </td><td>5 </td><td>2 </td></tr>
</tbody>
</table>

调用GetASremlInfor函数,会在工作路径下输出两个Excel

近交系数:inbreeding_coefficient_ data.csv

亲缘关系系数:coancestry_file.csv

打印近交系数前6行

inbreeding_value <- read.csv("inbreeding_coefficient_ data.csv")
head(inbreeding_value)

<table>
<thead><tr><th scope=col>X</th><th scope=col>matrix_number</th><th scope=col>animal_code</th><th scope=col>inbreeding_coefficient</th></tr></thead>
<tbody>
<tr><td>1 </td><td>1 </td><td>1 </td><td>0.000</td></tr>
<tr><td>2 </td><td>2 </td><td>2 </td><td>0.000</td></tr>
<tr><td>3 </td><td>3 </td><td>3 </td><td>0.000</td></tr>
<tr><td>4 </td><td>4 </td><td>4 </td><td>0.000</td></tr>
<tr><td>5 </td><td>5 </td><td>5 </td><td>0.125</td></tr>
<tr><td>6 </td><td>6 </td><td>6 </td><td>0.125</td></tr>
</tbody>
</table>

打印亲缘关系系数前6行

jinjiaoxishu <- read.csv("coancestry_file.csv")
head(jinjiaoxishu)

<table>
<thead><tr><th scope=col>X</th><th scope=col>animal_code_1</th><th scope=col>animal_code_2</th><th scope=col>coefficient_of_coancestry</th></tr></thead>
<tbody>
<tr><td>1 </td><td>1 </td><td>1 </td><td>1.0000000</td></tr>
<tr><td>3 </td><td>1 </td><td>3 </td><td>0.5000000</td></tr>
<tr><td>4 </td><td>1 </td><td>4 </td><td>0.5000000</td></tr>
<tr><td>5 </td><td>1 </td><td>5 </td><td>0.4714045</td></tr>
<tr><td>6 </td><td>1 </td><td>6 </td><td>0.2357023</td></tr>
<tr><td>8 </td><td>2 </td><td>2 </td><td>1.0000000</td></tr>
</tbody>
</table>


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容