本篇笔记整理于邓飞大佬的GWAS学习教程,他在B站上发布了一系列教学课程,推荐大家去看看
plink的bfile格式,二进制不方便查看,我们将其转化为文本map和ped的格式。
plink --bfile [bfile格式的二进制文件] --recode --out test
最后的–out代表输出为test文件.
结果:
PLINK v1.90b7 64-bit (16 Jan 2023) www.cog-genomics.org/plink/1.9/
(C) 2005-2023 Shaun Purcell, Christopher Chang GNU General Public License v3
Logging to plink.log.
Options in effect:
--bfile HapMap_3_r3_1
--recode
14204 MB RAM detected; reserving 7102 MB for main workspace.
1457897 variants loaded from .bim file.
165 people (80 males, 85 females) loaded from .fam.
112 phenotype values loaded from .fam.
Using 1 thread (no multithreaded calculations invoked).
Before main variant filters, 112 founders and 53 nonfounders present.
Calculating allele frequencies... done.
Warning: 225 het. haploid genotypes present (see plink.hh ); many commands
treat these as missing.
Total genotyping rate is 0.997378.
1457897 variants and 165 people pass filters and QC.
Among remaining phenotypes, 56 are cases and 56 are controls. (53 phenotypes
are missing.)
--recode ped to plink.ped + plink.map ... done.
我们来查看生成的结果
ls test.*
wc -l test.map test.ped
我们可以看到map文件中有1457897行,代表有1457897个SNP数据
ped文件中有165行,代表有165个基因型个体
我们分别预览一下两个文件
less -S test.ped #点击q退出
格式说明链接:link
map格式的文件, 主要是图谱文件信息, 主要包括染色体名称, 所在的染色体和所在染色体的坐标.
map文件包括:
Example
1 snp1 0 1
1 snp2 0 2
1 snp3 0 3
格式说明链接:link
bed格式的文件, 主要包括SNP的信息, 包括个体ID, 系谱信息, 表型和SNP的分型信息.
.ped 文件主要有 6 列,后面都是基因型:
Example
1 1 0 0 1 0 G G 2 2 C C
1 2 0 0 2 0 A A 0 0 A C
1 3 1 2 1 2 0 0 1 2 A C
2 1 0 0 1 0 A A 2 2 0 0
2 2 0 0 2 2 A A 2 2 0 0
2 3 1 2 1 2 A A 2 2 A A
缺失指控,一般用两个参数
–geno筛选SNP; --mind筛选个体
GWAS分析时,拿到基因型数据,拿到表型数据,要首先做到以下几点
然后再进行建模,得到显著性SNP以及可视化结果,清洗数据的时间占80%的时间,可见清洗数据很重要.
那么问题来了,为什么要对缺失的数据进行筛选呢?
无论是测序还是芯片,得到的基因型数据要进行质控,而对于缺失数据进行筛选,可以去掉低质量的数据.
如果一个个体,共有50万个SNP数据,发现20%的SNP数据(10万)都缺失,所以我们可以把它去除掉.
同样的道理,如果某个SNP,在500个样本中,缺失率为20%(即该SNP在199个个体中都没有分型结果),我们也可以认为该SNP质量交叉,将它去除掉.
当然,这里的20%是过滤的标注,可以改变质控标准.
我们下面的质控标准是2%
首先,我们查看一下个体缺失的位点数目,每个SNP缺失的个体数
命令:
plink --file test --missing
结果:
$ plink --file test --missing
PLINK v1.90b7 64-bit (16 Jan 2023) www.cog-genomics.org/plink/1.9/
(C) 2005-2023 Shaun Purcell, Christopher Chang GNU General Public License v3
Logging to plink.log.
Options in effect:
--file test
--missing
14204 MB RAM detected; reserving 7102 MB for main workspace.
.ped scan complete (for binary autoconversion).
Performing single-pass .bed write (1457897 variants, 165 people).
--file: plink-temporary.bed + plink-temporary.bim + plink-temporary.fam
written.
1457897 variants loaded from .bim file.
165 people (80 males, 85 females) loaded from .fam.
112 phenotype values loaded from .fam.
Using 1 thread (no multithreaded calculations invoked).
Before main variant filters, 112 founders and 53 nonfounders present.
Calculating allele frequencies... done.
Warning: 225 het. haploid genotypes present (see plink.hh ); many commands
treat these as missing.
Total genotyping rate is 0.997378.
--missing: Sample missing data report written to plink.imiss, and variant-based
missing data report written to plink.lmiss.
–missing
–missing: Sample missing data report written to plink.imiss, and variant-based missing data report written to plink.lmiss.
结果生成了两个文件,分别是一个个体ID上SNP缺失的信息,另一个是每个SNP在个体ID中缺失的信息
个体缺失位点统计预览:
SNP缺失的个体数文件预览
# 先要设置工作路径
indmiss = read.table(file="plink.imiss", header=TRUE)
snpmiss = read.table(file="plink.lmiss", header=TRUE)
# read data into R
summary(indmiss)
summary(snpmiss)
# 显示图片
hist(indmiss[,6],main="Histogram individual missingness") #selects column 6, names header of file
hist(snpmiss[,5],main="Histogram SNP missingness")
# 保存图片
pdf("histimiss.pdf") #indicates pdf format and gives title to file
hist(indmiss[,6],main="Histogram individual missingness") #selects column 6, names header of file
dev.off()
pdf("histlmiss.pdf")
hist(snpmiss[,5],main="Histogram SNP missingness")
dev.off() # shuts down the current device
先展示summary的结果
我们可以查看到indmiss和snpmiss的数据信息,对应的是:
输出为pdf
个体缺失位点的频率分别在20,40,60,80对应的概率
首先,我们对SNP缺失率进行筛选,先过滤掉SNP缺失率高于2%的SNP
plink --bfile [你的genoType文件] --geno 0.02 --make-bed --out [输出的文件]
看不懂嘛?那就翻译一下,凑活看吧
接着,我们转化为map和ped的形式
plink --bfile [上个输出文件作为这里的输入文件] --recode --out test
查看一下过滤之后的行数,之前的是:
现在的是:
我们可以看到这里过滤掉了2万多个位点
从当时的log日志里面其实也可以看出这一点
可以看到–geno,过滤掉了27454个位点
对样本缺失率进行筛选,过滤掉缺失率高于2%的个体(在之前过滤掉的基础上进行筛选)
plink --bfile HapMap_3_r3_2 --mind 0.02 --make-bed --out HapMap_3_r3_3
我们注意到日志中的这句话:
0 people removed due to missing genotype data(–mind)
代表没有过滤掉个体,所以剩余个体:165;剩余SNP:1430443
同时我们对个体和SNP的缺失率进行筛选,要注意,在正式分析的时候,一般先进行SNP的质控,然后再进行样本的质控.
意思就是:在运行代码的时候,先运行"–geno",再运行’–mind’,不能两步合成一步.
这个问题在邓飞老师的公众号中有提到.
无论是SNP的缺失率,还是样本的缺失率,都是针对检出率进行的质控。如果一个群体中有些亚群对某些片段没有分型(片段缺失),这种情况下,对于样本进行质控或者样本和SNP同时质控,会将样本删除,而这些样本不是由于DNA质量差或者实验室的原因导致的缺失,而是由于这些样本本身的片段缺失导致的缺失,这种情况下,先对样本或者样本和SNP同时质控,会导致较大的错误。
为了避免这种情况,可以先对SNP的缺失率进行质控,这样由于某些亚群片段缺失导致的缺失,就会在SNP质控时将其删除,就不会影响后续的样本缺失质控的结果。
上面案例中,有一个样本,如果先进行SNP缺失质控再进行样本质控就不会被删除。而先进行样本质控或者同时质控,就会被删除。
看不懂的话可以这样理解:
SNP太多了,如果先进行样本的缺失SNP筛选,那么因为SNP的数量庞大,造成的SNP缺失的样本数量也会很大,导致被删掉的样本就会很多
相反,如果事先将一些缺失率很高的SNP去掉,就使得一些样本解决了"最后一公里的问题",使它们得以"存活下来".
总结:如果单独过滤和合并过滤的差异较大的话,建议使用单独过滤的方法,即先过滤SNP,再过滤样本
两步合在一起的操作:
和上面我们得到的结果就不太一样了
可以看出,合并质控和单独质控是有区别的,在这种情况之下,建议先进行SNP质控,再进行样本质控
(重要的事情说三遍!)