全基因组关联分析流程

按照前人的教程,跑了跑GWAS流程,作为初学者,欢迎大家提问,指教。

数据来源:A new regulator of seed size control in Arabidopsis identified by a genome-wide association study

做的是拟南芥191个自交系的籽粒大小的全基因组关联分析,并且对其中一个显著的qtl进行了后续的实验验证。

基因组数据下载

wget http://1001genomes.org/data/GMI-MPI/releases/v3.1/1001genomes_snp-short-indel_only_ACGTN.vcf.gz

表型数据下载:

文章的supplement的pdf文件,可以用R包读取其中三线表中的内容。

vcftools --gzvcf 1001genomes_snp-short-indel_only_ACGTN.vcf.gz \

--remove-indels --min-alleles 2 --max-alleles 2 \

--recode --keep ../sample/sample.txt --out 172sample

#这个vcf文件不只包含文献里面的自交系基因组数据,首先把文献里面的数据基因组数据调出来。remove-indels,min- or max-alleles至少至多多少个等位位点,--recode输出.recode.vcf,--keep file保留file中的自交系,--out输出前缀

#其中sample.txt是表型数据中easyGWAS ID那一列,一行一个ID,有19个材料没有ID,只能用有ID的172个材料。

vcftools --vcf 172sample.recode.vcf --freq --out freq

#--freq,输出等位基因频率,看一下snp基因频率,发现有些snp是的MAF为零。说明这些位点可能在之前的大群体里面是有变异,而在该研究用的这172个自交系里面没有变异。

module load Java/1.8.0_92

module load beagle-lib/2.1.2-foss-2016b

java -Xss5m -Xmx100g -jar $EBROOTBEAGLE/beagle.jar \

nthreads=20 gt=172sample.recode.vcf out=172sample_out ne=172

#基因型填充,从这一步的输出文件来看,SNP个数和前面第一步提取出来的SNP的个数是相同的,说明这一步的作用是:比如有一个SNP在某些材料里面没有被测到,没有基因型,这一步通过单倍型给这些没有分型的位点加上了基因型。

#Xmx*g,用多大内存 nthreads核心数,gt输入的vcf文件,ne=群体大小

vcftools --gzvcf 172sample_out.vcf.gz --maf 0.05 \

--recode --out 172sample_maf_filter

#maf=0.05,maf小于0.05的snp被过滤掉,至此SNP的第一步过滤基本完成。

#后面的步骤主要是要过滤SNP,让标记各自连锁平衡。否则,与真正显著的标记连锁的一大片标记,都会有显著关联。

awk '{FS="\t";OFS="\t"}{if($0~"#"){print $0}else{$3=$1"_"$2;print $0}}' \

172sample_maf_filter.recode.vcf > 172sample_maf_filter_snpID.vcf

#因为后续plink软件的需要,给SNP加上ID。plink中默认用下划线分隔,下划线后面的是SNP的ID号。

plink --vcf 172sample_maf_filter_snpID.vcf --recode --out 172sample

#转成plink格式,生成172sample.log,172sample.map,172sample.ped,172sample.nosex

#其中map和ped参数是基因组和表型数据

plink --file 172sample --indep 50 5 2

#indep是prune时的参数,不太懂模型,第一个是滑动窗口大学,第二个是步长,第三个好像是一个判断是否连锁的阈值吧。

#产生prune.in,prune.out,prune.in文件基本连锁平衡的SNP位点,但是很奇怪,相同的数据和分析流程,我这一步就只剩下了256233个标记了,和我参考的博客差很多,但是没prune之前的标记数和这位师兄做得差不多,我做的是maf过滤后剩下1601218个标记。

plink --file 172sample --extract plink.prune.in \

--recode --out 172sample_maf_filter_snpID_LD_filter

#file输入前缀,--extract根据prune.in提取snp,172sample_maf_filter_snpID_LD_filter.*就是我们需要的数据。但是我们需要二进制的格式,用于后续的关联分析。

plink --file 172sample_maf_filter_snpID_LD_filter \

--make-bed --out clean_snp

#--file,输入文件前缀,--make-bed --out会生成以clean_snp为前缀的bed,bim和fam

#fam存有表型数据,要在fam的第六列加入对应的表型数据

这里我自己写了个python脚本,用来将fam文件和supplement读出来的表格聚合在一起,然后输出一个对应行加上了对应表型值的fam文件。

python3 mergefam_sample.py

###########这是mergefam_sample.py代码

import pandas as pd

sample = pd.read_table("../../sample/sample_list.csv",sep=",")

sample = sample.iloc[:,[1,5]]

#sample有191个样本,easyGWAS这一列为字符

fam = pd.read_table("clean_snp.fam",sep=" ",header=None)

fam.columns = ["ID1","ID2","parent1","parent2","sex","phenotype"]

fam["ID1"] = fam["ID1"].apply(str)

#fam有172个样本,前两列为数字

new_fam = pd.merge(fam,sample,how="inner",left_on="ID1",right_on="easyGWAS ID")

new_fam.phenotype = new_fam["Seed size (mm2)"]

new_fam = new_fam.iloc[:,range(0,6)]

new_fam = new_fam.round(decimals=9)

new_fam.to_csv("clean_snp.fam1",sep=" ",header=False,index=False)

###########这是mergefam_sample.py代码

cp clean_snp* ../../associate

cd clean_snp* ../../associate

rm clean_snp.fam

mv clean_snp.fam1 clean_snp.fam

#转移文件到关联分析的目录下

module load GEMMA/0.98.1

gemma-0.98.1-linux-static -bfile clean_snp -gk 1 -o kinship

#-gk 1或者2,不同计算亲缘关系的方法,一般都用1,官方文档给的说明是,如果一个SNP的maf比较小但是效应值比较大的用2会比较好,如过maf和该SNP的效应值无关就用1。

#-bfile输入为plink的二进制,-o输出前缀,输出一个output的目录.cXX.txt就是亲缘关系的结果

gemma-0.98.1-linux-static -bfile clean_snp -lmm -k ./output/kinship.cXX.txt -o GWAS

#-lmm线性混合模型可以等于1,2,3和4,代表不同的假设检验方法(默认参数为1,文章用的默认参数),-k亲缘关系结果文件,.assoc.txt是结果是需要的结果

#ps SNP物理位置,n_miss SNP缺失个体数,af SNP频率,beta SNP效应值,se beta估计标准误,l_remle 计算该SNP效应时对应的lamda的remle估计值,p_wald wald检验P值。就用最后一列的pvalue挑显著的标记,阈值是0.05/prune之后的标记数。

#最后画图,用r包rMVP,简单好用不愧MVP

rawdf<-read.table("GWAS_results.assoc.txt",header=T,sep="\t")

df<-data.frame(rs=rawdf$rs,chr=rawdf$chr,pos=rawdf$ps,pvalue=rawdf$p_wald)

install.packages("rMVP")

library(rMVP)

MVP.Report(df)

#生成了四张图,qq图,普通和环状的曼哈顿图,标记密度图

参考的几个博客

https://cloud.tencent.com/developer/article/1593313

https://www.jianshu.com/p/9a94b97b4009

https://www.jianshu.com/p/d31404620c9b

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 193,968评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,682评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,254评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,074评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,964评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,055评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,484评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,170评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,433评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,512评论 2 308
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,296评论 1 325
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,184评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,545评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,150评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,437评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,630评论 2 335

推荐阅读更多精彩内容