Pedigree

nr_animal <- 6
tbl_pedigree <- tibble::tibble(Calf = c(1:nr_animal),
                               Sire = c(NA, NA, NA, 1 ,3, 4),
                               Dam = c(NA, NA, NA, 2, 2, 5))
tbl_pedigree

Numerator Relationship Matrix

We call the numerator relationship matrix \(A\). The computation of the elements of \(A\) are done separately for

  1. the diagnoal elements \((A)_{ii}\) and
  2. the off-diagonal elements \((A)_{ij}\) for \(i \ne j\)

First all elements of the matrix \(A\) are initialized to \(0\)

A = matrix(0, nrow = nr_animal, ncol = nr_animal)
A
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    0    0    0    0    0    0
[2,]    0    0    0    0    0    0
[3,]    0    0    0    0    0    0
[4,]    0    0    0    0    0    0
[5,]    0    0    0    0    0    0
[6,]    0    0    0    0    0    0

Diagonal Elements

Computation: \((A)_{ii} = (1 + F_i)\) and \(F_i = 1/2 (A)_{sd}\)

i <- 1
s <- tbl_pedigree$Sire[i]
d <- tbl_pedigree$Dam[i]

Fi <- ifelse((is.na(s) | is.na(d)), 0, 0.5 * A[s,d])
A[i,i] <- 1+Fi
A
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    0    0    0    0    0
[2,]    0    0    0    0    0    0
[3,]    0    0    0    0    0    0
[4,]    0    0    0    0    0    0
[5,]    0    0    0    0    0    0
[6,]    0    0    0    0    0    0

Off-diagonal Elements

Off-diagonal \((A)_{ij} = 1/2 (A)_{io} + 1/2 (A)_{iq}\) where \(o\) and \(q\) are parents of \(j\)

for (j in (i+1):6){
  o <- tbl_pedigree$Sire[j]
  q <- tbl_pedigree$Dam[j]
  Aio <- ifelse(is.na(o), 0, A[i,o])
  Aiq <- ifelse(is.na(q), 0, A[i,q])
  A[i,j] <- 0.5 * Aio + 0.5 * Aiq
}
A[(i+1):6,i] <- A[i,(i+1):6]
A
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1.00    0    0  0.5    0 0.25
[2,] 0.00    0    0  0.0    0 0.00
[3,] 0.00    0    0  0.0    0 0.00
[4,] 0.50    0    0  0.0    0 0.00
[5,] 0.00    0    0  0.0    0 0.00
[6,] 0.25    0    0  0.0    0 0.00

Problem 1: Numerator Relationship Matrix

Use the above steps of computation for the complete matrix.

Hint

  • Construct a loop with loop-variable \(i\) that runs over all the rows of the matrix \(A\).

Solution

Check Result

The function getA() of the pedigreemm package can be used to check the result

LS0tCnRpdGxlOiAiTGl2ZXN0b2NrIEJyZWVkaW5nIGFuZCBHZW5vbWljcyAtIEV4Y2VyY2lzZSA3IgphdXRob3I6ICJQZXRlciB2b24gUm9ociIKZGF0ZTogJzIwMjEtMTEtMTknCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAoKIyBQZWRpZ3JlZQoKYGBge3J9Cm5yX2FuaW1hbCA8LSA2CnRibF9wZWRpZ3JlZSA8LSB0aWJibGU6OnRpYmJsZShDYWxmID0gYygxOm5yX2FuaW1hbCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaXJlID0gYyhOQSwgTkEsIE5BLCAxICwzLCA0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhbSA9IGMoTkEsIE5BLCBOQSwgMiwgMiwgNSkpCnRibF9wZWRpZ3JlZQpgYGAKCgojIE51bWVyYXRvciBSZWxhdGlvbnNoaXAgTWF0cml4CldlIGNhbGwgdGhlIG51bWVyYXRvciByZWxhdGlvbnNoaXAgbWF0cml4ICRBJC4gVGhlIGNvbXB1dGF0aW9uIG9mIHRoZSBlbGVtZW50cyBvZiAkQSQgYXJlIGRvbmUgc2VwYXJhdGVseSBmb3IgCgoxLiB0aGUgZGlhZ25vYWwgZWxlbWVudHMgJChBKV97aWl9JCBhbmQKMi4gdGhlIG9mZi1kaWFnb25hbCBlbGVtZW50cyAkKEEpX3tpan0kIGZvciAkaSBcbmUgaiQKCgpGaXJzdCBhbGwgZWxlbWVudHMgb2YgdGhlIG1hdHJpeCAkQSQgYXJlIGluaXRpYWxpemVkIHRvICQwJAoKYGBge3J9CkEgPSBtYXRyaXgoMCwgbnJvdyA9IG5yX2FuaW1hbCwgbmNvbCA9IG5yX2FuaW1hbCkKQQpgYGAKCgojIyBEaWFnb25hbCBFbGVtZW50cwoKQ29tcHV0YXRpb246ICQoQSlfe2lpfSA9ICgxICsgRl9pKSQgYW5kICRGX2kgPSAxLzIgKEEpX3tzZH0kIAoKYGBge3J9CmkgPC0gMQpzIDwtIHRibF9wZWRpZ3JlZSRTaXJlW2ldCmQgPC0gdGJsX3BlZGlncmVlJERhbVtpXQoKRmkgPC0gaWZlbHNlKChpcy5uYShzKSB8IGlzLm5hKGQpKSwgMCwgMC41ICogQVtzLGRdKQpBW2ksaV0gPC0gMStGaQpBCgpgYGAKCgojIyBPZmYtZGlhZ29uYWwgRWxlbWVudHMKCk9mZi1kaWFnb25hbCAkKEEpX3tpan0gPSAxLzIgKEEpX3tpb30gKyAxLzIgKEEpX3tpcX0kIHdoZXJlICRvJCBhbmQgJHEkIGFyZSBwYXJlbnRzIG9mICRqJAoKCmBgYHtyfQpmb3IgKGogaW4gKGkrMSk6Nil7CiAgbyA8LSB0YmxfcGVkaWdyZWUkU2lyZVtqXQogIHEgPC0gdGJsX3BlZGlncmVlJERhbVtqXQogIEFpbyA8LSBpZmVsc2UoaXMubmEobyksIDAsIEFbaSxvXSkKICBBaXEgPC0gaWZlbHNlKGlzLm5hKHEpLCAwLCBBW2kscV0pCiAgQVtpLGpdIDwtIDAuNSAqIEFpbyArIDAuNSAqIEFpcQp9CkFbKGkrMSk6NixpXSA8LSBBW2ksKGkrMSk6Nl0KQQpgYGAKCgojIFByb2JsZW0gMTogTnVtZXJhdG9yIFJlbGF0aW9uc2hpcCBNYXRyaXgKVXNlIHRoZSBhYm92ZSBzdGVwcyBvZiBjb21wdXRhdGlvbiBmb3IgdGhlIGNvbXBsZXRlIG1hdHJpeC4gCgoKIyMgSGludAoKKiBDb25zdHJ1Y3QgYSBsb29wIHdpdGggbG9vcC12YXJpYWJsZSAkaSQgdGhhdCBydW5zIG92ZXIgYWxsIHRoZSByb3dzIG9mIHRoZSBtYXRyaXggJEEkLgoKCiMjIFNvbHV0aW9uCgoKIyMgQ2hlY2sgUmVzdWx0ClRoZSBmdW5jdGlvbiBgZ2V0QSgpYCBvZiB0aGUgcGVkaWdyZWVtbSBwYWNrYWdlIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSByZXN1bHQKCgoKCgoKCgoKCgoKCgoK