使用EMMAX做GWAS分析

EMMAX是一款非常高效和使用简单的GWAS分析软件,使用者可以进行模型设置,比如一般线性模型和混合线性模型,操作简单,只需要准备几个必须的文件即可。本博客记录本人在使用改软件的一些步骤。由于使用的基因型数据是已经过滤好的数据,我们在此就不在进行数据指控方面的操作;GWAS基因型质控的一款非常强大的软件是PLINK,可以设置多个参数来对样本和SNP进行过滤。使用EMMAX需注意几个方面:(1)基因型数据要求是PLINK的转置格式,在群体结构控制的文件中,需要多加一列1,表示截距值。群体结构控制的文件可以采用STRUCTURE或者ADMIXTURE,PCA软件的输出值,值得注意的是,在用STRUCTURE和ADMIXTURE软件输出的文件中,协变量的要减少最后一个变量,比如STRUCTURE分析后,得到群体的亚群个数是3,那么每个样品对会对应3个相应的系数,以此来表示这个个体属于这三个假定的祖先亚群的概率;3个系数的总和是1;在用这个协变量文件的时候,要删除最后一列,并在文件的第三列写1,表示截距。这样就可以进行EMMAX分析了。

(1) 准备基因型数据,这部分需要在PLINK软件中操作,本分析中,我从916分样本的数据中,提取本项目分析的320个个体的基因型数据,--keep参数后边接需要提取的样品名字,格式如下:-9表示样本的family ID是缺失的,后边的是每个材料的名字。最后输出的是三个带有后缀的文件,如:genotype_millet320.tfam, genotype_millet320.tped,genotype_millet320.map

-9	Ci007
-9	Ci012
-9	Ci013
-9	Ci021
-9	Ci026
-9	Ci032
-9	Ci046

命令如下:

plink --noweb --bfile ~/GWAS_foxmilt/plink/foxtail916 --keep sample_names.txt --nonfounders --recode12 --output-missing-genotype 0 --transpose --out genotype_millet320  # --transpose 表示输出数据转置,这个是PLINK软件的一种特殊的格式。

(2)计算样品的亲缘关系矩阵,这个工作可以直接用EMMAX软件自带的来计算,根据PLINK输出的基因型文件进行,文件输入的后缀名就是前一个步骤输出的后缀名,emmax-kin计算后会生成一个大的矩阵文件,用于后续MLM分析。

# 使用EMMAX自带的软件计算亲缘关系矩阵
~/software/emmax-beta-07Mar2010/emmax-kin -v -h -s -d 10 genotype_millet320

(3)计算协变量文件,可以用STRUCTURE分析后的协变量文件,也可以用主成分分析的协变量,这里我们用PLINK 的PCA来进行分析,并用前三个主成分作为协变量,计算命令如下:

# 使用PLINK软件计算群体结构的协变量,这里选择前三个主成分作为协变量,具体需要多少个协变量需要根据你的群体结构来进行判断,在本项目中,基因型数据的群体分层并不明显,选择前三个主成分就可以控制群体结构了
plink --noweb --tfile genotype_millet320 --pca 3 --out pca_320

协变量文件可根据上面的PCA分析结果进行准备,用AWK方便操作

#输出的协变量文件进行格式整理,这里第三列是截距值,前两列是family ID和 individual ID, 后边的三列是三个主成分
awk '{print $1"\t"$2"\t"1"\t"$3"\t"$4"\t"$5"\t"}' pca_320.eigenvec > pca_structure_320.txt # 展示如下:
-9	Ci007	1	-0.0540318	0.0158467	-0.0271305	
-9	Ci012	1	-0.0457195	0.0141429	-0.126416	
-9	Ci013	1	-0.0502624	0.00835785	-0.133798	
-9	Ci021	1	-0.055962	-0.00897986	0.0241683	
-9	Ci026	1	-0.0641019	-0.0368972	0.0350536	
-9	Ci032	1	-0.0508938	0.0761431	0.0161454	
-9	Ci046	1	-0.0531549	0.0864745	0.0476195	
-9	Ci053	1	-0.0547984	0.0798894	0.0657235	

(4)准备表型文件。EMMAX软件要求每一个表型一个单独的文件,所以这里对每个表型都准备一个单独的文件,如果表型很多,就可以在R中一次性操作;表型文件有三列,分别是family ID,individual ID和phenotype,三列都不需要表头,如下:

-9	Ci007	0.44
-9	Ci012	0.626666666666667
-9	Ci013	0.44
-9	Ci021	0.62
-9	Ci026	0.56
-9	Ci032	0.753333333333333
-9	Ci046	0.62
-9	Ci053	0.753333333333333
-9	Ci054	0.793333333333333
-9	Ci055	0.866666666666667

(5)利用MLM模型进行全基因组关联分析。根据上面准备的文件,这里就可以使用混合线性模型进行分析了,代码如下:

~/software/emmax-beta-07Mar2010/emmax -v -d 10 -t genotype_millet320   -p final_data/phenotype_seed_germination_308.txt -k genotype_millet320.hIBS.kinf  -c pca_structure_320.txt  -o seed_germination_320

如果表型文件非常多,就可以写一个shell循环,如下边的分析中有68个表型文件:

ls *.txt | while read id; do trait_name=${id%.*}; ~/software/emmax-beta-07Mar2010/emmax -v -d 10 -t  ../genotype_499_transpose  -p $id -k ../genotype_499_transpose.hIBS.kinf  -c ../pca_structure_pca_genotype_499_transpose.txt  -o $trait_name;done

(6)结果查看和数据可视化。EMMAX输出的文件有三个,分别是一个日志文件,一个关联结果的p值文件(.ps 后缀)和一个包含似然值文件,里边包含样品的遗传力。三个文件中,关联结果文件一般有三列或者四列构成,不同的操作系统下EMMAX软件输出会有差异,如我在Linux中,采用旧版本的就输出三列,分别是标记名称,标准差以及p值,标准差是对标记效应的标准差。需要根据前面基因型的map文件,展示每个标记的分布以及具体的p值,可以用qqman这个软件包进行操作。为了方便,我写了一个R脚本 plot_emmax.R:

#!/usr/bin/Rscript 
library(optparse)
library(qqman)
option_list = list(make_option(c("-m","--map"), help="map file",type='character'),make_option(c("-e","--emmax"), help = "the emmax results",type='character'),make_option(c("-o","--output"), help = "the output name", type='character'),make_option(c("-p","--significant"), help = "p value for significant signals", default = -log10(1e-8), type = 'numeric' )
)opts = parse_args(OptionParser(option_list=option_list))
map_df = read.table(file=opts$map, header = F,sep="\t")
names(map_df) = c('CHR','SNP',"Genetic_distance","BP")
emmax_df = read.table(file=opts$emmax, header = F,sep="\t")
names(emmax_df) = c('SNP','SE',"P")
merge_map_emmax = merge(map_df, emmax_df, by="SNP")
merge_map_emmax_sort = merge_map_emmax[order(merge_map_emmax$CHR, merge_map_emmax$BP),]
out_manhattan = paste(opts$output,'.manhattan.pdf')
pdf(out_manhattan)
manhattan(merge_map_emmax_sort,col = c("blue4", "orange3"),main = "Manhattan Plot", suggestiveline = FALSE, genomewideline = opts$significant)
dev.off()
qq_name = paste(opts$output,'.qq.pdf')
pdf(qq_name)
qq(merge_map_emmax_sort$P)
dev.off()

最后通过一个循环运行每个结果文件,输出曼哈顿图和QQ图:

ls *.ps | while read id; do sample_name=${id%.*};Rscript plot_emmax.R -m ../genotype_499.plk.map  -e $id -o $sample_name  -p 7.16; done
# -p 是显著性p值的-log10(p threshold)的数,p值显著性可以用FDR来控制


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部