Bovine의 경우 여러 종류의 BeadChip이 있다. BovineSNP50 v2와 v3가 있을 뿐만 아니라 한국에서는 HanwooSNP50 v1을 사용하고 있다. 이것을 같이 분석하려면 한 쪽 버전으로 바꾸어야 하는데 이때 없는 유전자형을 추정해야 하는데 이것을 imputation이라고 한다.

 

예를 들어 각 BeadChip에 다음과 같은 SNP가 있다고 하자.

 

SNP Name BovineSNP50 v3 HanwooSNP50 v1
SNP1 v  
SNP2 v v
SNP3   v
SNP4 v v
SNP5 v  
SNP6 v v
SNP7   v
SNP8 v v
SNP9 v v
SNP10   v

 

BovineSNP50 v3를 기준으로 분석을 한다면 HanwooSNP50 v1에는 없는 SNP1, SNP5의 유전자형을 imputation해야 한다. 그리고 BovineSNP50 v3에는 없는 SNP3, SNP7, SNP7 등은 분석에 사용하지 않는다. 즉 HanwooSNP50 v1에 있는 SNP3, SNP7, SNP7 유전자형은 버린다.

 

imputation에 사용할 수 있는 다양한 도구가 있는데 여기서는 FImpute 프로그램을 이용한다.

 

이전에 다운로드 받은 FinalReport의 유전자형을 변환했는데 그 결과는 다음과 같았다.

 

 

유전자형이 나와 있는데 이게 무슨 SNP인지는 snp_map에 있었다.

 

 

snp_map 파일을 통해서 몇 번째가 무슨 SNP인지 알 수 있는 것이다. 두 개 버전의 BeadChip을 이용하므로 어느 버전의 SNP는 사용하고, 어느 버전의 SNP는 사용하지 않을 것이라는 것을 알려주는 파일(snp_info 파일)을 작성해야 한다. FImpute에서 제공하는 예제에는 다음과 같이 나와 있다.

 

 

파일을 보면 염색체, SNP 위치 순으로 SNP를 정렬하고 chip1에 있고 없는 SNP, chip2에 있고 없는 SNP를 표시한 것을 알 수 있다.

 

그리고 어느 개체는 chip1이고 어느 개체는 chip2인지는 다음과 같이 표시한다.

 

 

개체 ID와 SNP 유전자형 사이에 1, 2와 같은 chip 번호가 들어가 있는 것을 알 수 있다.

 

FImpute 프로그램을 이용하여 imputation을 하기 위해서 할 일은 유전자형 파일에 chip 번호를 넣고, snp_info 파일을 만들고, 프로그램을 실행할 때 필요한 control 파일(snp_info 파일, 유전자형 파일, 혈통 파일의 위치와 이름을 알려주고, imputation 옵션을 설정하는 파일)을 작성하는 것이다.

 

여기서는 BovineSNP50v3을 HanwooSNP50v1로 imputation하는 것을 설명한다. 이전 설명을 참고하여 유전자형 변환을 완료한 것으로 본다. 준비한 파일은 다음과 같다.

 

 

BovineSNP50v3 유전자형 변환 파일

 

 

BovineSNP50v3 SNP Map 파일

 

 

HanwooSNP50v1 유전자형 변환 파일

 

 

HanwooSNP50v1 SNP Map 파일

 

 

성별이 표시된 혈통 파일

 

■ 칩번호 넣기

 

위의 파일을 이용하여 HanwooSNP50v1이 reference popluation이므로 다음과 같은 파일을 만들어야 한다.

 

ID Chip Call...
123456789 1 02202020202200222011120200020020 ......
123456790 1 02101011102200222000020200120020 ......

 

다음과 같은 awk 프로그램을 이용한다.

 

insert_chip_number_HanwooSNP50v1.awk

 

BEGIN{
print "ID Chip Call..."
}
{
print $1 " 1 " $2 > "HanwooSNP50v1_for_fimpute_01.txt"
}
END {
}

 

먼저 1행에 “ID Chip Call...”을 출력하고, 이어서 입력파일의 1열과 2열을 읽어 출력하는데 두 열 가운데 “ 1 ” 삽입하고 HanwooSNP50v1_for_fimpute_01.txt로 출력한다는 의미이다. 실행을 편리하게하기 위하여 다음과 같이 배치 파일을 만든다.

 

run_insert_chip_number_HanwooSNP50v1.awk.bat

 

awk -f insert_chip_number_HanwooSNP50v1.awk HanwooSNP50v1_1365_snps2pregs


pause

 

실행하려는 awk 프로그램 이름과 입력파일(HanwooSNP50v1_1365_snps2pregs)이다. 탐색기에서 더블 클릭하여 실행할 수 있다.

 

실행 화면

 

 

실행한 결과는 출력된 HanwooSNP50v1_for_fimpute_01.txt은 다음과 같다.

 

 

칩 번호 1(reference population)이 들어가 있는 것을 볼 수 있다.

 

위와 같은 방식으로 준비한 BovineSNP50v3의 genotype file은 아래와 같다.

 

 

■ snp_info 파일 만들기

 

snp_info.txt 파일의 형태는 위에서 본 바와 같다.

 

SNP_ID는 SNP의 이름, Chr은 염색체 번호, Pos는 염색체위의 SNP의 위치, Chip1은 첫째 칩에서의 SNP의 순서, Chip2는 둘째 칩에서의 SNP의 순서. chip1이 reference population, chip2가 target population.

 

Imputation을 하기 전에 각 BeadChip에 들어 있는 SNP를 파악할 필요가 있다. 다음은 각 BeadChip에 있는 SNP들의 염색체별 분포이다.

 

Chromosome BovineSNP50v3 HanwooSNP50v1
1 3,273 3,225
2 2,671 2,756
3 2,455 2,582
4 2,409 2,479
5 2,177 2,156
6 2,885 3,158
7 2,518 2,481
8 2,326 2,246
9 2,124 2,077
10 2,302 2,357
11 2,163 2,181
12 1,688 1,651
13 1,700 1,684
14 1,689 2,274
15 1,668 1,681
16 1,643 1,599
17 1,560 1,567
18 1,308 1,303
19 1,367 1,380
20 1,587 1,571
21 1,425 1,398
22 1,214 1,212
23 1,106 1,124
24 1,223 1,230
25 915 939
26 1,035 1,032
27 934 918
28 901 905
29 1,012 1,029
30 1,157 947
31 11 11
32 759 700
33 13 13
소계 53,218 53,866

 

 

30번 염색체는 X 염색체를, 31번 염색체는 Y 염색체를, 32번 염색체는 MT를, 33번 염색체는 염색체 번호를 모르는 염색체를  의미한다.

 

Imputation을 하기 위해서는 SNP가 어느 염색체, 어느 위치에 있는지 알아야 하므로, Bovine의 경우 1에서 29번 염색체의 SNP만 사용한다.

 

즉 BovineSNP50v3에서는 51,278개의 SNP만을, HanwooSNP50v1에서는 52,195개의 SNP만을 이용한다.

 

염색체별로 BovineSNP50v3에만, 공통으로, HanwooSNP50v1에만 있는 SNP 개수는 다음과 같다.

 

Chromosome BovineSNP50v3 BovineSNP50v3 + HanwooSNP50v1 HanwooSNP50v1 소계
1 208 3,065 160 3,433
2 155 2,516 240 2,911
3 125 2,330 252 2,707
4 171 2,238 241 2,650
5 156 2,021 135 2,312
6 140 2,745 413 3,298
7 146 2,372 109 2,627
8 182 2,144 102 2,428
9 184 1,940 137 2,261
10 142 2,160 197 2,499
11 159 2,004 177 2,340
12 113 1,575 76 1,764
13 105 1,595 89 1,789
14 84 1,605 669 2,358
15 94 1,574 107 1,775
16 129 1,514 85 1,728
17 85 1,475 92 1,652
18 97 1,211 92 1,400
19 74 1,293 87 1,454
20 71 1,516 55 1,642
21 88 1,337 61 1,486
22 76 1,138 74 1,288
23 47 1,059 65 1,171
24 76 1,147 83 1,306
25 59 856 83 998
26 72 963 69 1,104
27 52 882 36 970
28 43 858 47 948
29 55 957 72 1,084
30 211 946 1 1,158
31 - 11 - 11
32 59 700 - 759
33 - 13 - 13
소계 3,458 49,760 4,106 57,324

 

 

그런데 염색체 번호와 위치가 같은 SNP들이 BovineSNP50v3에는 29쌍(SNP 58개)이 있고, HanwooSNPv1에는 73쌍(SNP 146개)이 있다. 이들을 삭제하여야 한다. 자세한 리스트는 다음과 같다.

 

BovineSNP50v2에서 염색체, 위치 중복인 SNP

 

번호 Name Chromosome Position
1 UA-IFASA-2167 1 59409838
2 ARS-USMARC-Parent-DQ404150-rs29012530 1 59409838
3 Hapmap35832-SCAFFOLD197372_885 1 151349514
4 ARS-USMARC-Parent-DQ404151-rs29019282 1 151349514
5 Hapmap36382-SCAFFOLD210095_19074 2 111155237
6 ARS-USMARC-Parent-DQ786757-rs29019900 2 111155237
7 Hapmap52375-rs29010802 3 58040470
8 ARS-USMARC-Parent-DQ435443-rs29010802 3 58040470
9 Hapmap38870-BTA-01737 3 116448759
10 ARS-USMARC-Parent-DQ839235-rs29012691 3 116448759
11 Hapmap58054-rs29014143 4 17200594
12 ARS-USMARC-Parent-DQ647186-rs29014143 4 17200594
13 Hapmap33892-BES6_Contig314_677 4 94176209
14 ARS-USMARC-Parent-DQ485413-no-rs 4 94176209
15 Hapmap36218-SCAFFOLD41765_2717 7 18454636
16 ARS-USMARC-Parent-DQ786758-rs29024430 7 18454636
17 UA-IFASA-2827 8 88974063
18 ARS-USMARC-Parent-DQ837644-rs29010468 8 88974063
19 Hapmap36391-SCAFFOLD165033_11046 8 106174871
20 ARS-USMARC-Parent-DQ674265-rs29011266 8 106174871
21 UA-IFASA-1922 9 45729853
22 ARS-USMARC-Parent-DQ846689-rs29011985 9 45729853
23 UA-IFASA-2515 9 98483346
24 ARS-USMARC-Parent-DQ786765-rs29009858 9 98483346
25 Hapmap59786-rs29012019 10 55611885
26 ARS-USMARC-Parent-DQ984827-rs29012019 10 55611885
27 Hapmap57799-rs29012894 11 1703612
28 ARS-USMARC-Parent-DQ837646-rs29012894 11 1703612
29 Hapmap36566-SCAFFOLD135238_3808 12 80629629
30 ARS-USMARC-Parent-DQ832700-rs29012872 12 80629629
31 Hapmap36096-SCAFFOLD140080_30362 13 25606469
32 ARS-USMARC-Parent-EF034081-rs29009668 13 25606469
33 Hapmap35881-SCAFFOLD20653_10639 14 48380429
34 ARS-USMARC-Parent-DQ846691-rs29019814 14 48380429
35 Hapmap35077-BES9_Contig405_919 15 21207529
36 ARS-USMARC-Parent-EF042090-no-rs 15 21207529
37 Hapmap34596-BES7_Contig444_1293 15 38078775
38 ARS-USMARC-Parent-DQ866817-no-rs 15 38078775
39 UA-IFASA-5162 15 79187295
40 ARS-USMARC-Parent-DQ866818-rs29011701 15 79187295
41 Hapmap57363-rs29014953 18 1839733
42 ARS-USMARC-Parent-EF028073-rs29014953 18 1839733
43 Hapmap59181-rs29010004 20 676757
44 ARS-USMARC-Parent-DQ984828-rs29010004 20 676757
45 Hapmap34041-BES1_Contig298_838 20 17837675
46 ARS-USMARC-Parent-DQ888313-no-rs 20 17837675
47 Hapmap35417-SCAFFOLD255533_15525 21 65198296
48 ARS-USMARC-Parent-EF026085-rs29021607 21 65198296
49 Hapmap55319-rs29013532 22 56526462
50 ARS-USMARC-Parent-EF034082-rs29013532 22 56526462
51 Hapmap53362-rs29013727 26 8221270
52 ARS-USMARC-Parent-DQ990834-rs29013727 26 8221270
53 Hapmap35000-BES9_Contig272_944 26 38233337
54 ARS-USMARC-Parent-EF034086-no-rs 26 38233337
55 Hapmap36071-SCAFFOLD106623_11509 28 35331560
56 ARS-USMARC-Parent-EF026086-rs29013660 28 35331560
57 Hapmap36794-SCAFFOLD186736_5402 28 44261945
58 ARS-USMARC-Parent-EF042091-rs29014974 28 44261945
59 Hapmap36059-SCAFFOLD50303_4748 29 28647816
60 ARS-USMARC-Parent-EF034080-rs29024749 29 28647816

 

 

BovineSNP50v3에서 염색체, 위치 중복인 SNP

 

번호 Name Chromosome Position
1 ARS-USMARC-Parent-DQ404150-rs29012530 1 59409838
2 UA-IFASA-2167 1 59409838
3 Hapmap35832-SCAFFOLD197372_885 1 151349514
4 ARS-USMARC-Parent-DQ404151-rs29019282 1 151349514
5 Hapmap52375-rs29010802 3 58040470
6 ARS-USMARC-Parent-DQ435443-rs29010802 3 58040470
7 Hapmap58054-rs29014143 4 17200594
8 ARS-USMARC-Parent-DQ647186-rs29014143 4 17200594
9 Hapmap33892-BES6_Contig314_677 4 94176209
10 ARS-USMARC-Parent-DQ485413-no-rs 4 94176209
11 UA-IFASA-2827 8 88974063
12 ARS-USMARC-Parent-DQ837644-rs29010468 8 88974063
13 Hapmap36391-SCAFFOLD165033_11046 8 106174871
14 ARS-USMARC-Parent-DQ674265-rs29011266 8 106174871
15 UA-IFASA-1922 9 45729853
16 ARS-USMARC-Parent-DQ846689-rs29011985 9 45729853
17 UA-IFASA-2515 9 98483346
18 ARS-USMARC-Parent-DQ786765-rs29009858 9 98483346
19 Hapmap59786-rs29012019 10 55611885
20 ARS-USMARC-Parent-DQ984827-rs29012019 10 55611885
21 Hapmap57799-rs29012894 11 1703612
22 ARS-USMARC-Parent-DQ837646-rs29012894 11 1703612
23 Hapmap36566-SCAFFOLD135238_3808 12 80629629
24 ARS-USMARC-Parent-DQ832700-rs29012872 12 80629629
25 Hapmap36096-SCAFFOLD140080_30362 13 25606469
26 ARS-USMARC-Parent-EF034081-rs29009668 13 25606469
27 Hapmap35881-SCAFFOLD20653_10639 14 48380429
28 ARS-USMARC-Parent-DQ846691-rs29019814 14 48380429
29 Hapmap35077-BES9_Contig405_919 15 21207529
30 ARS-USMARC-Parent-EF042090-no-rs 15 21207529
31 Hapmap34596-BES7_Contig444_1293 15 38078775
32 ARS-USMARC-Parent-DQ866817-no-rs 15 38078775
33 UA-IFASA-5162 15 79187295
34 ARS-USMARC-Parent-DQ866818-rs29011701 15 79187295
35 Hapmap57363-rs29014953 18 1839733
36 ARS-USMARC-Parent-EF028073-rs29014953 18 1839733
37 Hapmap59181-rs29010004 20 676757
38 ARS-USMARC-Parent-DQ984828-rs29010004 20 676757
39 Hapmap34041-BES1_Contig298_838 20 17837675
40 ARS-USMARC-Parent-DQ888313-no-rs 20 17837675
41 Hapmap35417-SCAFFOLD255533_15525 21 65198296
42 ARS-USMARC-Parent-EF026085-rs29021607 21 65198296
43 LTF 22 31841994
44 Hapmap40441-BTA-54131 22 31841994
45 Hapmap55319-rs29013532 22 56526462
46 ARS-USMARC-Parent-EF034082-rs29013532 22 56526462
47 Hapmap53362-rs29013727 26 8221270
48 ARS-USMARC-Parent-DQ990834-rs29013727 26 8221270
49 Hapmap35000-BES9_Contig272_944 26 38233337
50 ARS-USMARC-Parent-EF034086-no-rs 26 38233337
51 LYST 28 8508619
52 CHS1 28 8508619
53 Hapmap36071-SCAFFOLD106623_11509 28 35331560
54 ARS-USMARC-Parent-EF026086-rs29013660 28 35331560
55 Hapmap36794-SCAFFOLD186736_5402 28 44261945
56 ARS-USMARC-Parent-EF042091-rs29014974 28 44261945
57 Hapmap36059-SCAFFOLD50303_4748 29 28647816
58 ARS-USMARC-Parent-EF034080-rs29024749 29 28647816

 

 

HanwooSNP50v1에서 염색체, 위치 중복인 SNP

 

번호 Name Chromosome Position
1 GART 1 1277227
2 rs465495560 1 1277227
3 ARS-USMARC-Parent-DQ404150-rs29012530 1 59409838
4 UA-IFASA-2167 1 59409838
5 ARS-BFGL-NGS-12806 1 136603695
6 rs110340232 1 136603695
7 ARS-USMARC-Parent-DQ404151-rs29019282 1 151349514
8 Hapmap35832-SCAFFOLD197372_885 1 151349514
9 ARS-USMARC-Parent-DQ435443-rs29010802 3 58040470
10 Hapmap52375-rs29010802 3 58040470
11 Hapmap27208-BTA-157501 3 71860062
12 NIAS_PAT_00114 3 71860062
13 BTB-01509081 3 76797698
14 rs42624577 3 76797698
15 ARS-USMARC-Parent-DQ647186-rs29014143 4 17200594
16 Hapmap58054-rs29014143 4 17200594
17 ARS-USMARC-Parent-DQ485413-no-rs 4 94176209
18 Hapmap33892-BES6_Contig314_677 4 94176209
19 APAF1 5 63150400
20 rs448942533 5 63150400
21 BovineHD0600016794 6 61079420
22 rs136396635 6 61079420
23 BTB-00986847 7 1071389
24 NIAS_PAT_00012 7 1071389
25 ARS-BFGL-NGS-76601 7 21298998
26 rs110095569 7 21298998
27 BTB-01273492 7 80042191
28 NIAS_PAT_00104 7 80042191
29 ARS-USMARC-Parent-DQ837644-rs29010468 8 88974063
30 UA-IFASA-2827 8 88974063
31 rs456206907 8 95410507
32 SMC2 8 95410507
33 ARS-USMARC-Parent-DQ674265-rs29011266 8 106174871
34 Hapmap36391-SCAFFOLD165033_11046 8 106174871
35 BovineHD0900002683 9 10783460
36 rs111016555 9 10783460
37 BTB-00386288 9 32549297
38 rs43593958 9 32549297
39 ARS-USMARC-Parent-DQ846689-rs29011985 9 45729853
40 UA-IFASA-1922 9 45729853
41 ARS-USMARC-Parent-DQ786765-rs29009858 9 98483346
42 UA-IFASA-2515 9 98483346
43 BTB-00426704 10 49791638
44 NIAS_PAT_00123 10 49791638
45 ARS-USMARC-Parent-DQ984827-rs29012019 10 55611885
46 Hapmap59786-rs29012019 10 55611885
47 ARS-USMARC-Parent-DQ837646-rs29012894 11 1703612
48 Hapmap57799-rs29012894 11 1703612
49 Hapmap34629-BES7_Contig224_786 11 33265117
50 rs43710094 11 33265117
51 ARS-USMARC-Parent-DQ832700-rs29012872 12 80629629
52 Hapmap36566-SCAFFOLD135238_3808 12 80629629
53 ARS-USMARC-Parent-EF034081-rs29009668 13 25606469
54 Hapmap36096-SCAFFOLD140080_30362 13 25606469
55 BTB-01186797 13 49053256
56 NIAS_PAT_00018 13 49053256
57 ARS-BFGL-NGS-28234 14 21343649
58 rs109517821 14 21343649
59 ARS-BFGL-BAC-8052 14 23893220
60 rs110061498 14 23893220
61 Hapmap46735-BTA-86653 14 25401722
62 rs41657755 14 25401722
63 Hapmap27112-BTC-063342 14 27271835
64 rs42893390 14 27271835
65 ARS-BFGL-NGS-2627 14 29987025
66 rs43002316 14 29987025
67 Hapmap50960-BTA-43399 14 31322421
68 rs41639002 14 31322421
69 ARS-USMARC-Parent-DQ846691-rs29019814 14 48380429
70 Hapmap35881-SCAFFOLD20653_10639 14 48380429
71 Hapmap23726-BTC-051363 14 56761589
72 rs43134497 14 56761589
73 Hapmap59332-rs29016542 15 15162470
74 rs29016542 15 15162470
75 rs29012762 15 15190242
76 UA-IFASA-2285 15 15190242
77 Hapmap58058-rs29012133 15 15213319
78 rs29012133 15 15213319
79 ARS-BFGL-NGS-10627 15 15245842
80 rs109677489 15 15245842
81 ARS-BFGL-BAC-31586 15 15305071
82 rs108999006 15 15305071
83 ARS-BFGL-NGS-10723 15 15367990
84 rs109495422 15 15367990
85 Hapmap35322-BES8_Contig457_1759 15 15520367
86 rs43706895 15 15520367
87 ARS-BFGL-NGS-17747 15 15544958
88 rs110050515 15 15544958
89 ARS-BFGL-NGS-17568 15 15656347
90 rs109772143 15 15656347
91 Hapmap35448-SCAFFOLD52197_3147 15 15697628
92 rs29024927 15 15697628
93 ARS-BFGL-NGS-12483 15 15908105
94 rs109546387 15 15908105
95 ARS-BFGL-NGS-69055 15 15949175
96 rs110107689 15 15949175
97 ARS-USMARC-Parent-EF042090-no-rs 15 21207529
98 Hapmap35077-BES9_Contig405_919 15 21207529
99 ARS-USMARC-Parent-DQ866817-no-rs 15 38078775
100 Hapmap34596-BES7_Contig444_1293 15 38078775
101 rs109636878 15 77675440
102 LRP4_3 15 77675440
103 ARS-USMARC-Parent-DQ866818-rs29011701 15 79187295
104 UA-IFASA-5162 15 79187295
105 ARS-BFGL-NGS-112854 16 33671664
106 rs43131245 16 33671664
107 ARS-USMARC-Parent-EF028073-rs29014953 18 1839733
108 Hapmap57363-rs29014953 18 1839733
109 g.43264699G>A 19 43264699
110 NAGLU 19 43264699
111 rs466131011 19 47734925
112 MRC2_1 19 47734925
113 ARS-USMARC-Parent-DQ984828-rs29010004 20 676757
114 Hapmap59181-rs29010004 20 676757
115 ARS-USMARC-Parent-DQ888313-no-rs 20 17837675
116 Hapmap34041-BES1_Contig298_838 20 17837675
117 BTB-00787104 20 51449833
118 rs41948047 20 51449833
119 ARS-USMARC-Parent-EF026085-rs29021607 21 65198296
120 Hapmap35417-SCAFFOLD255533_15525 21 65198296
121 ARS-BFGL-NGS-74728 22 8308367
122 NIAS_PAT_00057 22 8308367
123 Hapmap40441-BTA-54131 22 31841994
124 LTF 22 31841994
125 ARS-USMARC-Parent-EF034082-rs29013532 22 56526462
126 Hapmap55319-rs29013532 22 56526462
127 ARS-BFGL-BAC-42839 24 4118163
128 NIAS_PAT_00131 24 4118163
129 ATP2A1_1 25 26191380
130 g.26191380C>T 25 26191380
131 ATP2A1_4 25 26198573
132 g.26198573G>A 25 26198573
133 ARS-USMARC-Parent-DQ990834-rs29013727 26 8221270
134 Hapmap53362-rs29013727 26 8221270
135 ARS-USMARC-Parent-EF034086-no-rs 26 38233337
136 Hapmap35000-BES9_Contig272_944 26 38233337
137 CHS1 28 8508619
138 LYST 28 8508619
139 ARS-USMARC-Parent-EF026086-rs29013660 28 35331560
140 Hapmap36071-SCAFFOLD106623_11509 28 35331560
141 ARS-USMARC-Parent-EF042091-rs29014974 28 44261945
142 Hapmap36794-SCAFFOLD186736_5402 28 44261945
143 BTB-01008169 29 13695183
144 NIAS_PAT_00031 29 13695183
145 ARS-USMARC-Parent-EF034080-rs29024749 29 28647816
146 Hapmap36059-SCAFFOLD50303_4748 29 28647816

 

 

다음은 illumina2pregs가 만들어 낸 snp_map 파일을 이용하여 FImpute에 사용할 snp_info 파일을 만드는 SAS 프로그램이다.

 

/*
file name : make_snp_info_for_fimpute.sas


FImpute 프로그램을 위한 snp_info.txt 파일 만들기


BovineSNP50v3를 HanwooSNP50v1으로 Imputation할 때 필요한 snp_info.txt 만들기
*/


/* BovineSNP50v3 snp_map 파일 읽기 */
data a1;


infile 'BovineSNP50v3_snp_map';


informat Bv3Index best32. ;
informat Bv3chrmo best32. ;
informat Bv3Pos best32. ;
informat Name $37. ;
informat Bv3OIndex best32. ;


format Bv3Index best32. ;
format Bv3chrmo best32. ;
format Bv3Pos best32. ;
format Name $37. ;
format Bv3OIndex best32. ;


input Bv3Index
Bv3chrmo
Bv3Pos
Name $
Bv3OIndex
;
run;


/* HanwooSNP50v1 snp_map 파일 읽기 */
data b1;


infile 'HanwooSNP50v1_snp_map';


informat Hv1Index best32. ;
informat Hv1chrmo best32. ;
informat Hv1Pos best32. ;
informat Name $37. ;
informat Hv1OIndex best32. ;


format Hv1Index best32. ;
format Hv1chrmo best32. ;
format Hv1Pos best32. ;
format Name $37. ;
format Hv1OIndex best32. ;


input Hv1Index
Hv1chrmo
Hv1Pos
Name $
Hv1OIndex
;
run;


/* 염색체별 SNP 빈도수 */
proc freq data = a1;
table Bv3chrmo;
run;


proc freq data = b1;
table Hv1chrmo;
run;


/* bv3와 hv1 머지하기 위하여 정렬 */
proc sort data = a1;
by name;
run;


proc sort data = b1;
by name;
run;


/* bv3와 hv1 머지하기 */
data c1;
merge a1 b1;
by name;
run;


/* snp_info 파일 만들기 */
data c2;
set c1;
if Bv3index = . then Bv3index = 0;
if Hv1index = . then Hv1index = 0;


chr = Bv3chrmo;
if Bv3chrmo = . then chr = Hv1chrmo;


pos = Bv3pos;
if Bv3pos = . then pos = Hv1pos;


if Bv3index ~= 0 and Hv1index ~= 0 then Bv3_Hv1 = "Bv3_Hv1";
else if Bv3index = 0 and Hv1index ~= 0 then Bv3_Hv1 = "Hv1";
else if Bv3index ~= 0 and Hv1index = 0 then Bv3_Hv1 = "Bv3";
run;


proc freq data = c2;
table chr * Bv3_Hv1 / nocol nopercent;
run;


/* 염색체 위치 순으로 정렬 */
proc sort data = c2;
by chr pos;
run;


data _null_;
set c2;


file "snp_info_for_fimpute.txt";


if _n_ = 1 then put "SNP_ID Chr Pos HV1Index BV3Index";


put name @41 chr @51 pos @61 hv1index @71 bv3index;
run;


/* 제외시킬 SNP 찾기 */
/* 염색체와 위치가 같은 SNP, hv1에 없는 SNP */
/* 30번 이상 염색체는 fimpute에서 제외 */


/* 염색체 29 이하 선택 */
data c3;
set c2;
if chr <= 29 then output;
run;


/* 염색체 위치 순으로 정렬 */
proc sort data = c3;
by chr pos;
run;


/* 같은 염색체와 위치 추출 */
data e1;
set c3;
flag1 = 1;
keep chr pos flag1;
if lag(chr) = chr and lag(pos) = pos then output;
run;


/* 염색체와 위치가 같은 SNP 추출 */
data e1_r1;
merge e1 c3;
by chr pos;
if flag1 = 1 then output;
run;


/* SNP 이름만 남기기 */
data e1_r2;
set e1_r1;
keep name;
run;


/* hv1에 없는 SNP 추출 */
data e2;
set c3;
if hv1index = 0 then output;
run;


/* SNP 이름만 남기기 */
data e2_r1;
set e2;
keep name;
run;


/* 제외할 SNP 합치기 */
data ef1;
set e1_r2 e2_r1;
run;


/* 중복 SNP 삭제 */
proc sort data = ef1;
by name;
run;


data ef2;
set ef1;
by name;
if first.name then output;
run;


/* 출력 */
data _null_;
set ef2;
file "excluded_snp_for_fimpute.txt";
put name;
run;

 

프로그램 실행 순서는 다음과 같다.

 

○ BovineSNP50v3 snp_map 파일 읽기

○ HanwooSNP50v1 snp_map 파일 읽기

○ SNP Name을 기준으로 두 파일 머지하기

○ snp_info 파일 출력(snp_info_for_fimpute.txt)

○ 분석에서 제외할 SNP 추출 및 출력(excluded_snp_for_fimpute.txt)

- 1번에서 29번 염새체 중

- 염색체 번호와 위치가 같은 SNP

- reference popuation을 위한 chip에 없는 SNP를 삭제

 

결과적으로 만들어진 snp_info_for_fimpute.txt는 다음과 같다.

 

 

imputation에서 제외할 1 ~ 29번 염색체의 snp 이름을 담고 있는 excluded_snp_for_fimpute.txt는 다음과 같다. 1 ~ 29번 염색체의 3336개의 SNP를 제외할 것이다.

 

 

<2021.12.2.>

illumina2pregs가 만들어 내는 map file의 형식이 바뀌었다. 그래서 그걸 읽는 SAS 프로그램도 바뀌어야 한다. 여기서는 map file의 컬럼 순서가 snp이름, 염색체, 위치, 원래번호 등 이런 순으로 되어 있을 경우에 snp_info 파일을 만드는 경우를 설명한다. map file의 순서는 illumina2preGS 프로그램을 돌릴 때 --sortmap 옵션을 주어 염색체, 위치 순으로 정렬되어 있다고 가정한다.

bovine version 2의 map file

bovine version 3의 map file

hanwoo version 1의 map file

 

그래서 이번에는 bovine version2, bovine version 3, hanwoo version 1이 있을 때, illumina2preGS Version 1.3으로 변환하고 bovine version 3로 imputation할 경우 필요한  snp_info 파일을 만드는 sas 코드를 다시 만들었다. 전과 크게 다르지 않지만 chip이 세 개 이므로 그에 따른 작업이 조금 더 필요하다.

/*
file name : make_snp_info_for_fimpute.sas

FImpute 프로그램을 위한 snp_info.txt 파일 만들기

BovineSNP50v2, HanwooSNP50v1 -> BOvineSNP50v3로 Imputation할 때 필요한 snp_info.txt 만들기
*/

/* BovineSNP50v2 snp_map 파일 읽기 */
data a1 ;
    infile 'snp_map_bv2' firstobs = 2;

    informat name $37. ;
    informat bv2chrmo best32. ;
    informat bv2pos best32. ;
    informat bv2oindex best32. ;

    format name $37. ;
    format bv2chrmo best32. ;
    format bv2pos best32. ;
    format bv2oindex best32. ;

    input 
            name
            bv2chrmo
            bv2pos
            bv2oindex
    ;

    bv2index = _n_;
run;

/* BovineSNP50v3 snp_map 파일 읽기 */
data b1 ;
    infile 'snp_map_bv3' firstobs = 2;

    informat name $37. ;
    informat bv3chrmo best32. ;
    informat bv3pos best32. ;
    informat bv3oindex best32. ;

    format name $37. ;
    format bv3chrmo best32. ;
    format bv3pos best32. ;
    format bv3oindex best32. ;

    input 
            name
            bv3chrmo
            bv3pos
            bv3oindex
    ;

    bv3index = _n_;

run; 

/* HanwooSNP50v1 snp_map 파일 읽기 */
data c1 ;
    infile 'snp_map_hv1' firstobs = 2;

    informat name $37. ;
    informat hv1chrmo best32. ;
    informat hv1pos best32. ;
    informat hv1oindex best32. ;

    format name $37. ;
    format hv1chrmo best32. ;
    format hv1pos best32. ;
    format hv1oindex best32. ;

    input 
            name
            hv1chrmo
            hv1pos
            hv1oindex
    ;

    hv1index = _n_;

run;
 

/* 염색체별 SNP 빈도수 */

proc freq data = a1;
    table bv2chrmo;
run;

proc freq data = b1;
    table bv3chrmo;
run;

proc freq data = c1;
    table hv1chrmo;
run;

 
/* bv2, bv3, hv1 머지하기 */
    /* sort */
proc sort data = a1;
    by name;
run;

proc sort data = b1;
    by name;
run;

proc sort data = c1;
    by name;
run;

    /* 머지하기 */
data t1;
    merge a1 b1 c1;
    by name;
run;

/* snp_info 파일 만들기 */
/* 각 snp의 염색체 번호와 위치 저장 */
data t2;
    set t1;

    /* 각 칩에 없는 SNP index는 0 */
    if bv2index = . then bv2index = 0;
    if bv3index = . then bv3index = 0;
    if hv1index = . then hv1index = 0;

    /* 각 SNP의 염색체 번호 */
    chr = bv2chrmo;
    if bv2chrmo   = . then chr = bv3chrmo;
    if bv2chrmo   = . and bv3chrmo = . then chr = hv1chrmo;

    /* 각 SNP의 위치 */
    pos = bv2pos;
    if bv2pos   = . then pos = bv3pos;
    if bv2pos   = . and bv3pos = . then pos = hv1pos;

    /* 각 SNP는 어느 칩에 있는가 */
    /* snp_info.txt 만드는 거와 상관은 없지만 그냥 궁금해서 */
    if bv2index ~= 0 and bv3index ~= 0 and hv1index ~= 0 then bv2_bv3_hv1 = 'bv2_bv3_hv1';
    if bv2index ~= 0 and bv3index ~= 0 and hv1index  = 0 then bv2_bv3_hv1 = 'bv2_bv3';
    if bv2index ~= 0 and bv3index  = 0 and hv1index ~= 0 then bv2_bv3_hv1 = 'bv2_hv1';
    if bv2index  = 0 and bv3index ~= 0 and hv1index ~= 0 then bv2_bv3_hv1 = 'bv3_hv1';
    if bv2index ~= 0 and bv3index  = 0 and hv1index  = 0 then bv2_bv3_hv1 = 'bv2';
    if bv2index  = 0 and bv3index ~= 0 and hv1index  = 0 then bv2_bv3_hv1 = 'bv3';
    if bv2index  = 0 and bv3index  = 0 and hv1index ~= 0 then bv2_bv3_hv1 = 'hv1';
run;

/* 염색체 번호와 포지션 번호가 잘 들어갔는지 dataset을 열어서 확인 */
proc sort data = t2;
    by chr pos;
run;

/* 각 SNP는 어느 비드칩에 있는가. 그냥 궁금해서 */
proc freq data = t2;
    table bv2_bv3_hv1 chr * bv2_bv3_hv1 / nocol nopercent;
run;

/* snp_info 출력 */
    /* sort */
proc sort data = t2;
    by chr pos;
run;

data _null_;
    set t2;
    file 'snp_info_for_fimpute.txt';
    if _n_ = 1 then put "SNP_ID                                  Chr       Pos       BV3Index  HV1Index  BV2Index";
    put name @41 chr @51 pos @61 bv3index @71 hv1index @81 bv2index ;
run;

/* 제외시킬 SNP 찾기 */
/* 염색체와 위치가 같은 SNP, bv3에 없는 SNP */
/* 30번 이상 염색체는 fimpute에서도 제외 */

/* 염색체 29이하 추출했으나 다시 안 하는 걸로 수정 */
/* 필요없는 부분이나 지우기 뭐 해서 놔 둠 */
data t3;
    set t2;

    /*
    if chr <= 29 then output;
    */
run;

/* 염색체, 위치 순으로 정렬 */
proc sort data = t3;
    by chr pos;
run;

/* 염색체 번호와 위치가 같은 SNP 추출 */
data te1;
    set t3;
    flag1 = 1;
    keep chr pos flag1;
    if lag(chr) = chr and lag(pos) = pos then output;
run;

data te1_r1;
    merge te1 t3;
    by chr pos;
    if flag1 = 1 then output;
run;

data te1_r2;
    set te1_r1;
    keep name;
run;

/* bovine version 3에 없는 SNP */
   /* bovine version 3로 imputation을 하기 때문. 
      만일 hanwoo version 1으로 한다면 hv1에 없는 SNP 추출 후 제외 */
data te2;
    set t3;
    if bv3index = 0 then output;
run;

data te2_r1;
    set te2;
    keep name;
run;

/* 제외할 SNP 목록 합치기 */
data tef1;
    set te1_r2 te2_r1;
run;

/* 중복 SNP 제거 */
proc sort data = tef1;
    by name;
run;

data tef2;
    set tef1;
    by name;
    if first.name then output;
run;

/* 출력 */
data _null_;
    set tef2;
    file "excluded_snp_for_fimpute.txt";
    put name;
run;

 

결과 파일 :

snp_info_for_fimpute.txt

excluded_snp_for_fimpute.txt

 

illumina2pregs가 만들어 내는 map file의 컬럼 순서가 바뀜에 따라 SAS 프로그램 변경 사항을 추가하였다.

<2021.12.2. 끝.>

 

■ 혈통 파일 준비

 

다음과 같이 혈통 파일을 준비한다.

 

 

Male이 dam 열에 나타나거나, Female이 sire 열에 나타나면 에러를 일으키므로 사전에 검토하는 것이 바람직하다.

 

■ control 파일의 준비

 

control 파일은 준비한 파일의 위치와 이름, imputation 옵션, 출력 폴더 등을 지정하는 파일이다. 다음과 같은 control 파일을 준비한다.

 

title="BovineSNP50v3 -> HanwooSNP50v1 imputation";
genotype_file="HanwooSNP50v1_for_fimpute_01.txt" "BovineSNP50v3_for_fimpute_01.txt";
snp_info_file="snp_info_for_fimpute.txt";
ped_file="pedigree.txt";
output_folder="output1";
exclude_snp = "excluded_snp_for_fimpute.txt";
exclude_chr = 30 31 32 33;
//parentage_test /ert_mm=0.02 /remove_conflict;
save_genotype;
njob=6;

 

control 파일 설명은 다음과 같다.

 

title="BovineSNP50v3 -> HanwooSNP50v1 imputation";

- imputation 제목

 

genotype_file="HanwooSNP50v1_for_fimpute_01.txt" "BovineSNP50v3_for_fimpute_01.txt";

- imputation에 사용할 genotype file

 

snp_info_file="snp_info_for_fimpute.txt";

- snp_info 파일

 

ped_file="pedigree.txt";

- 혈통 파일

 

output_folder="output1";

- 결과를 출력할 폴더

 

exclude_snp = "excluded_snp_for_fimpute.txt";

- imputation에서 제외할 snp 이름이 들어있는 파일

 

exclude_chr = 30 31 32 33;

- imputation에서 제외할 염색체 번호

 

//parentage_test /ert_mm=0.02 /remove_conflict;

- 친자감정을 할 수 있음. 여기서는 무시

 

save_genotype;

- haplotype이 아니라 genotype을 저장

 

njob=6;

- 6개의 process를 이용하여 작업 수행. cpu의 core가 많을 경우 그에 따라 증가

 

■ FImpute의 실행

 

리눅스에서만 FImpute를 실행할 수 있다. 실행하기 위하여 필요한 파일을 리눅스 컴퓨터의 폴더에 복사한다. 여기서는 윈도우즈 10의 Windows Subsystem for Linux 중 Ubuntu를 설치하고 실행한 화면이다.

 

 

imputation에 필요한 파일을 볼 수 있다. 다음은 FImpute를 실행한 화면이다.

 

 

output1 폴더에 imputation된 결과를 볼 수 있다. genotypes_imp.txt 파일이다.

 

 

새로운 snp_info파일이 생성되었는데 다음과 같다. 51857개의 snp가 최종적임을 알 수 있다.

 

 

■ genotype 파일 되돌리기

 

imputation 된 genotype 파일에는 header와 chip 번호가 있어서 이것을 제거해야 한다. header와 chip 번호를 제거하는 awk 프로그램이다.

 

delete_chip_number_50k.awk

 

BEGIN{
}
{
if( NR >= 2 )print $1, $3 > "50k_for_gs.txt"
}
END {
}

 

2행 이상에 대해 1열과 3열을 출력.

 

실행을 간편하게 하기 위하여 다음과 같이 배치 파일을 작성한다.

 

run_delete_chip_number_50k.awk.bat

 

awk -f delete_chip_number_50k.awk ./output1/genotypes_imp.txt


pause

 

awk 프로그램 이름과 처리하려는 파일 이름

 

윈도우즈 탐색기에서 run_delete_chip_number_50k.awk.bat 파일을 더블클릭하여 실행할 수 있다. 다음은 실행 화면이다.

 

 

결과적으로 생성된 파일은 다음과 같다.

 

 

■ snp_map 파일 되돌리기

 

output1 폴더의 snp_info.txt의 1행을 삭제하고 열 순서를 바꾸어 준다. 다음과 같은 awk 프로그램을 이용한다.

 

make_snp_map_after_fimpute.awk

 

BEGIN{
}
{
if( NR >= 2 ) print $4, $2, $3, $1, $4> "snp_map_for_gs.txt"
}
END {
}

 

2행 이상에 대하여 4열, 2열, 3열, 1열, 다시 4열 순으로 snp_map_for_gs.txt 파일에 쓰기

 

위 프로그램을 실행하기 편하게 하기 위하여 다음과 같은 배치 파일을 만든다.

 

run_make_snp_map_after_fimpute.awk.bat

 

awk -f make_snp_map_after_fimpute.awk ./output1/snp_info.txt


pause

 

윈도우즈 탐색기에서 run_make_snp_map_after_fimpute.awk.bat 파일을 더블클릭하여 실행할 수 있다. 다음은 실행 화면이다.

 

 

프로그램 실행 후 결과 파일은 다음과 같다.

 

 

<2021.12.2. 시작>

illumina2pregs가 만들어 내는 map file 형식이 바뀌었다. fimpute 가 만들어낸 snp_info.txt 파일을 가지고 illumina2pregs가 만들어 낸 것과 같은 형식의 map file을 만들어야 한다.

다음은 bovine version 2, bovine version 3, hanwoo version 1을 bovine version 3로 imputation한 결과의 snp_info.txt이다.

염색체 29번까지 남았다. 총 51171개의 SNP만 남았다.

전과 차이가 나는 것은 header가 있고, 순서가 snp_id(이름), chr(염색체), pos(위치), index(순서)이다. 위 snp_info파일을 그대로 써도 문제 없을 것 같고, chip_1의 index만 남기고 싶으면 다음과 같이 한다.

make_snp_map_after_fimpute.awk

BEGIN{
}
{
    print $1, $2, $3, $4 > "snp_map_for_gs.txt"
}
END {
}

run_make_snp_map_after_fimpute.awk.bat 파일을 만들어 실행을 쉽게 한다.

awk -f make_snp_map_after_fimpute.awk ./output1/snp_info.txt

pause

output1 폴더의  snp_info.txt 파일을 재료로 하여 make_snp_map_after_fimpute.awk를 실행한다.윈도우 탐색기에서 run_make_snp_map_after_fimpute.awk.bat 을 더블 클릭하여 실행할 수 있다.

실행 결과 생긴 snp_map_for_gs.txt

<2021.12.2. 끝>

 

서로 다른 버전의 coded SNP genotype과 snp_map을 이용하여 하나의 SNP genotype과 snp_map을 만들었다. 다음은 이것을 유전능력 평가에 이용하는 것이다.

Advice : Call rate 가 낮은 개체의 유전자형을 포함하여 분석을 하지 마세요. 처음에는 call rate가 낮아도 imputation하면 되겠지라고 생각했는데 역시 되지 않습니다.. call rate가 낮은면 call 된 유전자형도 믿을 수가 없고 믿을 수 없는 유전자형을 이용하면 전체 imputation이 엉망이 될 것입니다. 경험적으로 90% 미만이든, 이하든 사용하지 않는게 정신건강에 좋을 것입니다.

FImpute : 이게 유료화 되었습니다. 새로운 버전이 업로드 안되어 메일을 쓰니 유료화되었답니다. 일년에 몇 번 안하는 거면 컴퓨터 날짜를 바꾸시고, 주기적으로 업무에 사용하시는 거라면 돈주고 사시는 것이 좋을 것 같습니다. 저도 안 사 봐서 얼마인지 모르겠습니다. 윈도우즈에서 wsl2를 설치하시고, 윈도우즈 설정의 날짜 및 시간 자동으로 하는 거 좀 꺼 주시고, wsl2에서 date 명령으로 날짜를 바꾸시면 시간이 지난 FImpute가 ... 정상적인 방법이 아니니 하라 말라 못하겠습니다.

+ Recent posts