# Social Interaction Model
# Linear Models for the Prediction of Animal Breeding Values, 3rd Edition.
# Raphael Mrode
# Example 8.1 p125

# Introduction to BLUPF90 suite programs
# Standard Edition
# Yutaka Masuda
# University of Georgia
# September 2019

참고

2021.04.15 - [Animal Breeding/R for Genetic Evaluation] - R을 이용한 사회적 관계 모형(Social Interaction Model)의 육종가 구하기

 

R을 이용한 사회적 관계 모형(Social Interaction Model)의 육종가 구하기

# Social Interaction Model # Linear Models for the Prediction of Animal Breeding Values, 3rd Edition. # Raphael Mrode # Example 8.1 p125 하나의 펜(pen) 또는 케이지에 여러 마리를 검정할..

bhpark.tistory.com

 

자료

7 1 4 1 1 5.5 8 9 1
8 1 4 1 2 9.8 7 9 1
9 2 5 1 2 4.9 7 8 2
10 1 4 2 1 8.23 11 12 1
11 2 5 2 2 7.5 10 12 2
12 3 6 2 2 10 10 11 3
13 2 5 3 1 4.5 14 15 2
14 3 6 3 2 8.4 13 15 3
15 3 6 3 1 6.4 13 14 3

1열 : animal

2열 : sire

3열 : dam

4열 : pen

5열 : sex

6열 : 성장율

7 - 8열 : 같은 펜에 있는 동기축 개체

9열 : fullsib 효과

 

주어지는 자료는 6열까지이다. fullsib 효과야 2열과 3열을 붙이면 되는 거니까 어렵지 않다. 문제는 동기축을 자료로 붙이는 일이다. 그리고 리넘된 자료로 해야 하므로 renumf90을 적당히 돌리고, 같은 펜에 있는 동기축의 renumber된 번호를 붙여야 한다. 여기서는 일단 수동으로 자료를 준비하여 분석한다.

혈통

1 0 0
2 0 0
3 0 0
4 0 0
5 0 0
6 0 0
7 1 4
8 1 4
9 2 5
10 1 4
11 2 5
12 3 6
13 2 5
14 3 6
15 3 6

 

blupf90 파라미터 파일

DATAFILE
social2_data.txt
NUMBER_OF_TRAITS
1
NUMBER_OF_EFFECTS
6
OBSERVATION(S)
6
WEIGHT(S)

EFFECTS:
 5 2 cross # sex
 1 15 cross # direct genetic
 7 0 cross # associative genetic 1
 8 15 cross # associative genetic 2
 9 3 cross # common environmental
 4 3 cross # random group (pen)
RANDOM_RESIDUAL VALUES
48.48
RANDOM_GROUP
2 3
RANDOM_TYPE
add_animal
FILE
social_pedi.txt
(CO)VARIANCES
25.7 2.25
2.25 3.60
RANDOM_GROUP
5
RANDOM_TYPE
diagonal
FILE

(CO)VARIANCES
12.5
RANDOM_GROUP
6
RANDOM_TYPE
diagonal
FILE

(CO)VARIANCES
12.12
OPTION solv_method FSPAK

 

보통의 유전평가는 renumf90 프로그램으로 renumber를 하고, renumf90이 만들어낸 파라미터 파일을 약간 수정하여 분석하지만 여기서는 renumer되었으므로 blupf90용 파라미터 파일을 이용한다.

파라미터 파일이 약간 tricky하다.

EFFECTS:
 5 2 cross # sex
 1 15 cross # direct genetic
 7 0 cross # associative genetic 1
 8 15 cross # associative genetic 2

sex 효과, direct genetic 효과는 일반적이다. 그러나 associative genetic 효과의 design matrix는 일반적인 design matrix와는 다르다. 일반적인 design matrix는 한 행에 1이 하나만 들어가나, associative genetic 효과의 design matrix는 한 행에 같은  pen(group)에 있는 동기축들을 1로 해야 한다. 그래서 7열은 레벨을 만들지 말고, 8열로만 레벨을 만들어 한 효과로 처리하고 동기축을 1로 한다는 의미이다.

 

실행화면

blupf90 blupf90_social.par | tee blupf90_social_01.log

 

로그

blupf90_social.par
     BLUPF90 ver. 1.68

 Parameter file:             blupf90_social.par
 Data file:                  social2_data.txt
 Number of Traits             1
 Number of Effects            6
 Position of Observations      6
 Position of Weight (1)        0
 Value of Missing Trait/Observation           0

EFFECTS
 #  type                position (2)        levels   [positions for nested]
    1  cross-classified       5         2
    2  cross-classified       1        15
    3  cross-classified       7         0
    4  cross-classified       8        15
    5  cross-classified       9         3
    6  cross-classified       4         3

 Residual (co)variance Matrix
  48.480    

 correlated random effects     2  3
 Type of Random Effect:      additive animal
 Pedigree File:              social_pedi.txt                                                                                                                                                                                                                                           
 trait   effect    (CO)VARIANCES
  1       2     25.70       2.250    
  1       3     2.250       3.600    

 Random Effect(s)    5
 Type of Random Effect:      diagonal
 trait   effect    (CO)VARIANCES
  1       5     12.50    

 Random Effect(s)    6
 Type of Random Effect:      diagonal
 trait   effect    (CO)VARIANCES
  1       6     12.12    

 REMARKS
  (1) Weight position 0 means no weights utilized
  (2) Effect positions of 0 for some effects and traits means that such
      effects are missing for specified traits
 

 * The limited number of OpenMP threads = 4

 * solving method (default=PCG):FSPAK               
 
 Data record length =            9
 # equations =           38
 G
  25.700      2.2500    
  2.2500      3.6000    
 G
  12.500    
 G
  12.120    
 read            9  records in   0.1406250      s,                     139 
  nonzeroes
  read           15  additive pedigrees
 finished peds in   0.1406250      s,                     250  nonzeroes
 solutions stored in file: "solutions"

 

solutions

trait/effect level  solution
   1   1         1          6.00414149
   1   1         2          8.24268672
   1   2         1          0.29558614
   1   2         2         -0.48338296
   1   2         3          0.18779681
   1   2         4          0.29558614
   1   2         5         -0.48338296
   1   2         6          0.18779681
   1   2         7          0.12478232
   1   2         8          0.52180202
   1   2         9         -0.87358211
   1   2        10          0.53576023
   1   2        11         -0.48764109
   1   2        12          0.39919156
   1   2        13         -0.57230863
   1   2        14          0.15302685
   1   2        15          0.19896884
   1   4         1         -0.04446498
   1   4         2          0.02782802
   1   4         3          0.01663697
   1   4         4         -0.04446498
   1   4         5          0.02782802
   1   4         6          0.01663697
   1   4         7         -0.07597626
   1   4         8         -0.09883240
   1   4         9          0.00894718
   1   4        10         -0.00305127
   1   4        11          0.08331352
   1   4        12          0.05970749
   1   4        13          0.01905137
   1   4        14          0.00474261
   1   4        15          0.00209776
   1   5         1          0.33277773
   1   5         2         -0.51533364
   1   5         3          0.18255591
   1   6         1         -0.26871653
   1   6         2          0.35903349
   1   6         3         -0.09031696

 

그러나 리넘버된 개체의 동기축(same pen or same group)을 옆에 추가한다는 것이 쉽지는 않은 일이다. 그래서 다음과 같은 자료에서 renumf90 과 R을 이용해서 자료를 준비해 본다.

자료

a7 a1 a4 1 1 5.5
a8 a1 a4 1 2 9.8
a9 a2 a5 1 2 4.9
a10 a1 a4 2 1 8.23
a11 a2 a5 2 2 7.5
a12 a3 a6 2 2 10
a13 a2 a5 3 1 4.5
a14 a3 a6 3 2 8.4
a15 a3 a6 3 1 6.4

animal, sire, dam, sex, growth

 

혈통

a1 0 0
a2 0 0
a3 0 0
a4 0 0
a5 0 0
a6 0 0
a7 a1 a4
a8 a1 a4
a9 a2 a5
a10 a1 a4
a11 a2 a5
a12 a3 a6
a13 a2 a5
a14 a3 a6
a15 a3 a6

 

renumf90 파라미터 파일

여기서는 associative effect 는 없고, sex, animal, pen, common environment effect(full-sib) 효과만 있는 것으로 한다.

# Parameter file for program renf90; it is translated to parameter
# file for BLUPF90 family programs.
COMBINE 7 2 3
DATAFILE
social1_data.txt
TRAITS
6
FIELDS_PASSED TO OUTPUT

WEIGHT(S)

RESIDUAL_VARIANCE
48.48
EFFECT
5 cross numer
EFFECT
1 cross alpha
RANDOM
animal
FILE
social1_pedi.txt
FILE_POS
1 2 3
PED_DEPTH
0
(CO)VARIANCES
25.7
EFFECT
4 cross numer
RANDOM
diagonal
(CO)VARIANCES
12.12
EFFECT
7 cross alpha
RANDOM
diagonal
(CO)VARIANCES
12.5
OPTION sol se

 

공통 환경 효과는 2열과 3열을 combine해서 만들었다.

실행

renumf90 renumf90_social1.par

 

실행결과

renadd02.ped

1 12 15 1 0 2 1 0 0 a14
2 10 13 1 0 2 1 0 0 a8
12 0 0 3 0 0 0 3 0 a3
3 11 14 1 0 2 1 0 0 a9
13 0 0 3 0 0 0 0 3 a4
14 0 0 3 0 0 0 0 3 a5
4 12 15 1 0 2 1 0 0 a15
15 0 0 3 0 0 0 0 3 a6
5 10 13 1 0 2 1 0 0 a10
10 0 0 3 0 0 0 3 0 a1
6 11 14 1 0 2 1 0 0 a11
7 12 15 1 0 2 1 0 0 a12
8 10 13 1 0 2 1 0 0 a7
11 0 0 3 0 0 0 3 0 a2
9 11 14 1 0 2 1 0 0 a13

 

renf90.dat

 5.5 1 8 1 1
 9.8 2 2 1 1
 4.9 2 3 1 2
 8.23 1 5 2 1
 7.5 2 6 2 2
 10 2 7 2 3
 4.5 1 9 3 2
 8.4 2 1 3 3
 6.4 1 4 3 3

 

renf90.tables

 Effect group 1 of column 1 with 2 levels, effect # 1
 Value    #    consecutive number
1 4 1 
2 5 2 
 Effect group 3 of column 1 with 3 levels, effect # 3
 Value    #    consecutive number
1 3 1 
2 3 2 
3 3 3 
 Effect group 4 of column 1 with 3 levels, effect # 4
 Value    #    consecutive number
a1a4 3 1 
a2a5 3 2 
a3a6 3 3 

 

renf90.par

# BLUPF90 parameter file created by RENUMF90
DATAFILE
 renf90.dat
NUMBER_OF_TRAITS
           1
NUMBER_OF_EFFECTS
           4
OBSERVATION(S)
    1
WEIGHT(S)
 
EFFECTS: POSITIONS_IN_DATAFILE NUMBER_OF_LEVELS TYPE_OF_EFFECT[EFFECT NESTED]
 2         2 cross 
 3        15 cross 
 4         3 cross 
 5         3 cross 
RANDOM_RESIDUAL VALUES
   48.480    
 RANDOM_GROUP
     2
 RANDOM_TYPE
 add_animal   
 FILE
renadd02.ped                                                                    
(CO)VARIANCES
   25.700    
 RANDOM_GROUP
     3
 RANDOM_TYPE
 diagonal     
 FILE
                                                                                
(CO)VARIANCES
   12.120    
 RANDOM_GROUP
     4
 RANDOM_TYPE
 diagonal     
 FILE
                                                                                
(CO)VARIANCES
   12.500    
OPTION sol se

 

위의 renf90.dat와 renf90.par는 바로 사용할 수가 없다. renf90.dat를 읽어서 same pen( or same group)의 동기축을 추가하는 프로그램이 필요하다.

# Analyse the social interaction model using blupf90
# Add competitors' renum ID in the group after running renumf90

# set working directory 
setwd(".") 

# print working directory 
getwd()

# read renf90.dat after running renumf90
data_01 = read.table("renf90.dat", header = FALSE, sep = "", col.names = c("grow", "sex", "raid", "pen", "ce"))
data_01

# raid by pen
data_02 = data_01[order(data_01$pen),]
data_02

rabp_r = length(unique(data_02$pen))
rabp_r

rabp_c = max(table(data_02$pen)) + 1
rabp_c

rabp = matrix(0, rabp_r, rabp_c)
rabp

j = 1
k = 1
rabp[j, k] = rabp[j, k] = data_02$pen[1]
k = k + 1
rabp[j, k] = rabp[j, k] = data_02$raid[1]

for (i in 2 : nrow(data_02)) {
   # i = 2
    if(data_02$pen[i - 1] == data_02$pen[i]) {
        k = k + 1
        rabp[j, k] = data_02$raid[i]
    }
    else {
        j = j + 1
        k = 1
        rabp[j, k] = rabp[j, k] = data_02$pen[i]
        k = k + 1
        rabp[j, k] = rabp[j, k] = data_02$raid[i]
    }
}

rabp

# data_02에 competitor 열 추가
data_03 = data_02
for (i in 1 : (rabp_c - 2)) {
    print(i)  
    data_03 = cbind(data_03, 0)
}
data_03

# add competitors
for (i in 1 : nrow(data_03)) {
    # pen number of data
    pn = data_03$pen[i]
    
    # row number of pen number in rabp
    rn = which(rabp[,1] == pn)

    # number of columns of data_01
    nc = ncol(data_01)
    for (j in 2 : ncol(rabp)) {
        # if raid is different from competitor
        if (data_03$raid[i] != rabp[rn, j]) {
            nc = nc + 1
            data_03[i, nc] = rabp[rn, j]
        }
    }
}
data_03

write.table(data_03, "renf90_02.dat", sep=" ", row.names = FALSE, col.names = FALSE, quote = FALSE)

 

결과로 생긴 renf90_02.dat는 다음과 같다.

5.5 1 8 1 1 2 3
9.8 2 2 1 1 8 3
4.9 2 3 1 2 8 2
8.23 1 5 2 1 6 7
7.5 2 6 2 2 5 7
10 2 7 2 3 5 6
4.5 1 9 3 2 1 4
8.4 2 1 3 3 9 4
6.4 1 4 3 3 9 1

 

blupf90을 실행하기 위하여 renf90.par를 수정한다. 

# BLUPF90 parameter file created by RENUMF90
DATAFILE
 renf90_02.dat
NUMBER_OF_TRAITS
           1
NUMBER_OF_EFFECTS
           6
OBSERVATION(S)
    1
WEIGHT(S)
 
EFFECTS: POSITIONS_IN_DATAFILE NUMBER_OF_LEVELS TYPE_OF_EFFECT[EFFECT NESTED]
 2         2 cross 
 3        15 cross 
 6         0 cross # associative genetic 1
 7        15 cross # associative genetic 2
 4         3 cross 
 5         3 cross 
RANDOM_RESIDUAL VALUES
   48.480    
 RANDOM_GROUP
     2 3
 RANDOM_TYPE
 add_animal   
 FILE
renadd02.ped                                                                    
(CO)VARIANCES
25.7 2.25
2.25 3.60
 RANDOM_GROUP
     5
 RANDOM_TYPE
 diagonal     
 FILE
                                                                                
(CO)VARIANCES
   12.120    
 RANDOM_GROUP
     6
 RANDOM_TYPE
 diagonal     
 FILE
                                                                                
(CO)VARIANCES
   12.500    
OPTION sol se

 

실행 결과 solutions

trait/effect level  solution          s.e.
   1   1         1          6.00414149          5.87722318
   1   1         2          8.24268672          5.56132372
   1   2         1          0.15302685          4.57296859
   1   2         2          0.52180202          4.52043322
   1   2         3         -0.87358211          4.57571923
   1   2         4          0.19896884          4.53216874
   1   2         5          0.53576023          4.60038547
   1   2         6         -0.48764109          4.57506398
   1   2         7          0.39919156          4.55704542
   1   2         8          0.12478232          4.60557709
   1   2         9         -0.57230863          4.56574172
   1   2        10          0.29558614          4.86839186
   1   2        11         -0.48338296          4.86816815
   1   2        12          0.18779681          4.85815710
   1   2        13          0.29558614          4.86839186
   1   2        14         -0.48338296          4.86816815
   1   2        15          0.18779681          4.85815710
   1   4         1          0.00474261          1.84114013
   1   4         2         -0.09883240          1.83170549
   1   4         3          0.00894718          1.88441482
   1   4         4          0.00209776          1.83375166
   1   4         5         -0.00305127          1.86104141
   1   4         6          0.08331352          1.88132183
   1   4         7          0.05970749          1.85378900
   1   4         8         -0.07597626          1.83835336
   1   4         9          0.01905137          1.88519935
   1   4        10         -0.04446498          1.87204137
   1   4        11          0.02782802          1.89561822
   1   4        12          0.01663697          1.87131689
   1   4        13         -0.04446498          1.87204137
   1   4        14          0.02782802          1.89561822
   1   4        15          0.01663697          1.87131689
   1   5         1         -0.26871653          3.16958408
   1   5         2          0.35903349          3.07874277
   1   5         3         -0.09031696          3.19664443
   1   6         1          0.33277773          3.25808128
   1   6         2         -0.51533364          3.19778089
   1   6         3          0.18255591          3.23629084

 

renadd02.ped를 보고 original ID를 찾아볼 수 있다. 순서가 바뀌었을 뿐 결과가 이전과 같다.

+ Recent posts