如何利用系譜計算近交係數和親緣關係係數
- 2019 年 12 月 6 日
- 筆記
《線性模型在動物育種值預測中的應用》 第二章:親屬間的遺傳協方差,P19
1, 概念定義
近交係數: 近交係數(inbreeding coefficient)是指根據近親交配的世代數,將基因的純化程度用百分數來表示即為近交係數,也指個體由於近交而造成異質基因減少時,同質基因或純合子所佔的百分比也叫近交係數,個體中兩個親本的共祖係數。
親緣係數: 是指兩個個體間加性基因效應間的相關.
兩者的區別和聯繫:
- 近交係數是個體的值
- 親緣係數是兩個個體之間的值
兩者的計算方法:
- 可以使用通徑分析的方法進行計算
- 也可以採用由系譜構建親緣關係A矩陣的形式進行計算, 這種方法在數據比較大時更為方便
2, 系譜數據
這裡我們模擬了四個個體的系譜關係, 想要計算一下每個個體的近交係數, 以及個體間的親緣係數, 使用R語言實現.
ped <- data.frame(ID=c(3,4,5,6),Sire=c(1,1,4,5),Dam=c(2,NA,3,2)) ped
ID |
Sire |
Dam |
---|---|---|
3 |
1 |
2 |
4 |
1 |
NA |
5 |
4 |
3 |
6 |
5 |
2 |
首先, 我們看到個體1和2的親本未知, 所以我們先將系譜補充完整, 使用nadiv的prepPed函數.
library(nadiv) pped = prepPed(ped) pped
完整的系譜如下, NA表示親本未知.

3, 計算親緣關係A矩陣
as.matrix(makeA(pped))
這裡我們使用makeA函數, A矩陣如下:
|
1 |
2 |
3 |
4 |
5 |
6 |
---|---|---|---|---|---|---|
1 |
1.00 |
0.000 |
0.5000 |
0.5000 |
0.5000 |
0.2500 |
2 |
0.00 |
1.000 |
0.5000 |
0.0000 |
0.2500 |
0.6250 |
3 |
0.50 |
0.500 |
1.0000 |
0.2500 |
0.6250 |
0.5625 |
4 |
0.50 |
0.000 |
0.2500 |
1.0000 |
0.6250 |
0.3125 |
5 |
0.50 |
0.250 |
0.6250 |
0.6250 |
1.1250 |
0.6875 |
6 |
0.25 |
0.625 |
0.5625 |
0.3125 |
0.6875 |
1.1250 |
4, 計算近交係數
用親緣關係矩陣A的對角線-1,即是個體的近交係數
diag(A)-1

可以看出, 1,2,4,3的近交係數為0. 個體5和6的近交係數為0.125.
5, 計算親緣係數
根據計算的親緣關係A矩陣,這個矩陣時個體間的方差協方差矩陣, 對角線為每個個體的方差, 非對角線為個體間的協方差. 公式為:
rij = cov(i,j)/sqrt(var(i)*var(j))
因此如果我們要計算個體1和2的親緣係數, 可以用A12/(sqrt(A11*A22)) = 0/sqrt(1*1) = 0, 因此個體1和2 的親緣係數為0.
因為共有6個個體, 1和2的親緣係數 = 2和1的親緣係數, 因此他們之間的親緣係數一共有6*5/2 = 15個. 這裡我們都計算, 共有36行.
第一種方案:
n = dim(A)[1] #1 id = row.names(A) #2 mat = matrix(0,n,n) #3 for(i in 1:n){ #4 for(j in i:n){ mat[i,j] = A[i,j]/(sqrt(A[i,i]*A[j,j])) mat[j,i] = mat[i,j] } } mat #5 re = data.frame(ID1= rep(id,n),ID2=rep(id,each = n),y = round(as.vector(mat))) #6 re#7
這裡我們的編程思路如下:
#1 計算出矩陣的行, 確定循環數
#2 計算出個體的ID名在矩陣中的順序, 因為有些ID可能是字元或者沒有順序, 主要用於後面的個體編號的確定
#3 為了計算更快, 我們生成一個6*6的矩陣
#4 寫一個循環, 因為矩陣時對稱的, 所以我再第二個for循環時從i開始, 而不是從1開始, 後面mat[j,i] = mat[i,j]再賦值, 這樣更快.
#5 生成的mat矩陣查看
#6 根據ID生成兩列, 表示他們之間的親緣係數, 這個和矩陣變為向量後一一對應.
#7 查看結果
結果如下:
ID1 |
ID2 |
r |
---|---|---|
1 |
1 |
1.0000 |
1 |
2 |
0.0000 |
1 |
3 |
0.5000 |
1 |
4 |
0.5000 |
1 |
5 |
0.4714 |
1 |
6 |
0.2357 |
2 |
1 |
0.0000 |
2 |
2 |
1.0000 |
2 |
3 |
0.5000 |
2 |
4 |
0.0000 |
2 |
5 |
0.2357 |
2 |
6 |
0.5893 |
3 |
1 |
0.5000 |
3 |
2 |
0.5000 |
3 |
3 |
1.0000 |
3 |
4 |
0.2500 |
3 |
5 |
0.5893 |
3 |
6 |
0.5303 |
4 |
1 |
0.5000 |
4 |
2 |
0.0000 |
4 |
3 |
0.2500 |
4 |
4 |
1.0000 |
4 |
5 |
0.5893 |
4 |
6 |
0.2946 |
5 |
1 |
0.4714 |
5 |
2 |
0.2357 |
5 |
3 |
0.5893 |
5 |
4 |
0.5893 |
5 |
5 |
1.0000 |
5 |
6 |
0.6111 |
6 |
1 |
0.2357 |
6 |
2 |
0.5893 |
6 |
3 |
0.5303 |
6 |
4 |
0.2946 |
6 |
5 |
0.6111 |
6 |
6 |
1.0000 |
第二種方案:
這裡也可以用我寫的learnasreml包的: mat_2_coefficient函數, 更方便.
library(learnasreml) re2 = mat_2_coefficient(mat) head(re2)

結果和上面是一致的.
所有程式碼匯總如下:
ped <- data.frame(ID=c(3,4,5,6),Sire=c(1,1,4,5),Dam=c(2,NA,3,2)) ped library(nadiv) pped = prepPed(ped) pped A = as.matrix(makeA(pped)) round((diag(A) -1),3) A n = dim(A)[1] id = row.names(A) mat = matrix(0,n,n) for(i in 1:n){ for(j in i:n){ mat[i,j] = A[i,j]/(sqrt(A[i,i]*A[j,j])) mat[j,i] = mat[i,j] } } mat re = data.frame(row = rep(id,n),col=rep(id,each = n),y = round(as.vector(mat))) re library(learnasreml) re2 = mat_2_coefficient(mat) head(re2)
希望可以幫到你.
轉發朋友圈是最大的支援.