打油诗

题目:plink666

不用不知道

一用忘不掉

朝思暮也想

真的好奇妙

1. 背景

一个朋友之前问过这个问题,问题可以分为:

  • 基因组选择中如何将ATCG的数据转化为012的形式
  • 如何进行基因组数据的过滤筛选
  • 有没有示例代码可以演示

今天我将用一份模拟的芯片下机数据,演示一下如何进行基因组数据的筛选。

2. 数据筛选的几个标准

  • 1,去除缺失率大于10%的SNP位点

这句话的意思是,比如有50K个SNP位点,有1000个体,如果某一个SNP位点在1000个体中,缺失率达到10%以上,即有超过100的个体在这个SNP位点上没有分型结果,就把这个位点删除。因为缺失率大的SNP,后期填充准确性不高。

    1. 样本检出率大于90%

这里的样本检出率,比如共有50K的芯片,需要个体的芯片分型数要大于45K,否则去掉该样本

  • 3,最小等位基因频率(MAF)大于1%

我们在进行基因组选择(SSGBLUP)时,需要构建G矩阵和H矩阵,构建G矩阵是利用SNP的分型信息。构建好的G矩阵描述的是个体间的关系,如果一个位点在999个个体上都为A,在1个个体上为G,即MAF为0.1%,这种SNP位点在计算中意义不大,去掉可以节约计算资源。

    1. 去除哈迪温伯格平衡检验(HWE)P值小于10的-6次方的SNP

位点进行哈温平衡检验时,去除P值小于10的-6次方的SNP

3. PLINK格式

3.1 map文件

格式说明链接: http://zzz.bwh.harvard.edu/plink/data.shtml#map

map格式的文件, 图谱信息文件, 主要包括染色体名称, SNP名称,所在染色体的遗传坐标和物理坐标.

map文件没有行头

map文件包括四列: 染色体, SNP名称, SNP位置, 碱基对坐标

  • 染色体编号为数字, 未知为0
  • SNP名称为字符或数字, 如果不重要, 可以从1编号, 注意要和bed文件SNP列对应
  • 染色体的摩尔位置(如果未知,可以用0表示)
  • SNP物理坐标

如果只有SNP名称, 可以手动构建map文件, 第二列为SNP名称, 其它几列如果未知,可以写为0.

基因组选择中如何清洗基因组数据_数据分析

3.2 ped文件

格式说明链接:http://zzz.bwh.harvard.edu/plink/data.shtml#ped

bed格式的文件, 主要包括SNP的信息, 包括个体ID, 系谱信息, 表型和SNP的分型信息.

数据没有行头, 空格或者tab隔开的文件

前六列必须有, 包括系谱信息, 表型信息

  • 第一列: Family ID # 如果没有, 可以用个体ID代替
  • 第二列: Individual ID # 个体ID编号
  • 第三列: Paternal ID # 父本编号
  • 第四列: Maternal ID # 母本编号
  • 第五列: Sex (1=male; 2=female; other=unknown) # 性别, 如果未知, 用0表示
  • 第六列: Phenotype # 表型数据, 如果未知, 用0表示
  • 第七列以后: 为SNP分型数据, 可以是AT CG或11 12, 或者A T C G或1 1 2 2

前六列, 必须要有, 如果没有相关数据, 用0表示.

基因组选择中如何清洗基因组数据_数据分析_02

4. PLINK过滤命令

4.1 缺失大于10%

--geno 0.1

4.2 样本call rate大于90%

--mind 0.1

4.3 最小等位基因频率大于0.01

--maf 0.01

4.4 哈温平衡P值大于1e-6

--hwe 1e-6

4.5 输出过滤后的012形式的文件

--recodeA

4.6 将过滤后的文件命名为c

--out c

5. 测试数据

测试数据为QMSim生成的模拟数据,经过处理之后生成b.map和b.ped文件,处理流程如下

5.1 预览文件

(base) [dengfei@localhost test]$ ls
b.map  b.ped

5.2 使用plink进行处理

plink --file b --chr-set 30 --geno 0.1 --mind 0.1 --maf 0.01 --hwe 1e-6 --recodeA --out c

5.3 处理结果日志

PLINK v1.90b6.5 64-bit (13 Sep 2018)           www.cog-genomics.org/plink/1.9/
(C) 2005-2018 Shaun Purcell, Christopher Chang   GNU General Public License v3
Note: --recodeA flag deprecated.  Use 'recode A ...'.
Logging to c.log.
Options in effect:
  --chr-set 30
  --file b
  --geno 0.1
  --hwe 1e-6
  --maf 0.01
  --mind 0.1
  --out c
  --recode A

63985 MB RAM detected; reserving 31992 MB for main workspace.
.ped scan complete (for binary autoconversion).
Performing single-pass .bed write (50000 variants, 1200 samples).
--file: c-temporary.bed + c-temporary.bim + c-temporary.fam written.
50000 variants loaded from .bim file.
1200 samples (0 males, 0 females, 1200 ambiguous) loaded from .fam.
Ambiguous sex IDs written to c.nosex .
0 samples removed due to missing genotype data (--mind).
Using 1 thread (no multithreaded calculations invoked).
Before main variant filters, 1200 founders and 0 nonfounders present.
Calculating allele frequencies... done.
0 variants removed due to missing genotype data (--geno).
--hwe: 2 variants removed due to Hardy-Weinberg exact test.
0 variants removed due to minor allele threshold(s)
(--maf/--max-maf/--mac/--max-mac).
49998 variants and 1200 samples pass filters and QC.
Note: No phenotypes present.
--recode A to c.raw ... done.

5.3 查看c.raw的012形式的文件

基因组选择中如何清洗基因组数据_数据分析_03

6. plink速度666

我最初是使用R语言进行编程转化,花费很长时间,然后使用python和perl进行编程转化,最后使用plink,plink不用不知道,一用忘不了,很方便。不同编程语言速度对比:

  • R语言:2个小时
  • Python: 20分钟
  • Perl:15分钟
  • plink:15秒

7. 如何重复上面的代码

  • 回复公众号:plink,获得下载数据和代码链接
  • 安装plink软件
  • 执行code.sh的命令
  • 查看c.raw文件,转化后的012形式
  • 愉快的进行G矩阵构建和后续分析

基因组选择中如何清洗基因组数据_数据分析_04