如何在R语言中提取加性遗传关系矩阵A的指定元素
方法1:针对pedigreemm包生成的dsCMatrix格式A矩阵
你得到的matrizA是对称压缩稀疏矩阵,支持常规矩阵的索引操作,也有适配的专用函数:
- 提取单个指定元素:如果矩阵的行/列名对应系谱个体ID,直接按名称或位置索引即可:
# 按ID提取个体1和个体2372的加性遗传相关值 matrizA["1", "2372"] # 按位置提取第2行第3列的元素 matrizA[2,3]
- 提取全部上三角元素:
library(Matrix) # 提取上三角元素(不含对角线) upper_tri_values <- matrizA[upper.tri(matrizA)] # 提取上三角元素(包含对角线) upper_tri_values_with_diag <- matrizA[upper.tri(matrizA, diag = TRUE)] # 如果需要保存上三角对应的个体对和数值,可转成数据框导出 upper_tri_index <- which(upper.tri(matrizA), arr.ind = TRUE) upper_tri_df <- data.frame( ID1 = rownames(matrizA)[upper_tri_index[,1]], ID2 = colnames(matrizA)[upper_tri_index[,2]], add_relation = as.numeric(matrizA[upper_tri_index]) ) # 导出为csv write.csv(upper_tri_df, "A矩阵上三角元素.csv", row.names = FALSE)
方法2:修正pedigree包makeA的用法
你之前的代码没有得到矩阵是因为用法错误:which参数需要传入要提取的个体的索引值,且你没有给生成的矩阵赋值,才会返回逻辑判断结果。正确用法如下:
library(pedigree) # 提取所有个体的全A矩阵 A_full <- makeA(pedigree_renum) # 提取ID为"1-2372"的个体对应的A矩阵子集 A_sub <- makeA(pedigree_renum, which = which(pedigree_renum$ID == "1-2372"))
生成矩阵后,提取元素的方法和上述dsCMatrix的操作完全一致。
补充优化思路
如果你的系谱规模极大,不需要生成全A矩阵就能提取指定个体的亲缘系数,可以用pedigree包的getGenRel函数直接计算指定个体对的加性遗传相关,大幅节省内存和计算时间。
内容的提问来源于stack exchange,提问作者Victoria Topayan
相关产品推荐
相关产品推荐

