本文主要介绍hapFLK(FLK统计量)、LEA软件包(LFMM模型)和PCADAPT软件如何检测选择信号
总体的思想就是通过这几款软件、不同的算法计算出每一个位点的z-score,然后对z-score进行整合、筛选位点
FST的计算方法
##对每一个SNP变异位点进行计算
vcftools--vcf test.vcf--weir-fst-pop1_population.txt--weir-fst-pop2_population.txt--outp_1_2—single
##按照区域来计算
vcftools--vcf test.vcf--weir-fst-pop1_population.txt--weir-fst-pop2_population.txt--outp_1_2_bin--fst-window-size500000--fst-window-step50000
# test.vcf是SNP calling 过滤后生成的vcf 文件;
# p_1_2_3 生成结果的prefix
# 1_population.txt是一个文件包含同一个群体中所有个体,一般每行一个个体。个体名字要和vcf的名字对应。
# 2_population.txt 包含了群体二中所有个体。
#计算的窗口是500kb,而步长是50kb (根据你的需其可以作出调整)。我们也可以只计算每个点的Fst,去掉参数(--fst-window-size 500000 --fst-window-step 50000)即可。
vcftools --vcf final_Taxodium_noMxg308.recode.vcf \
--weir-fst-pop Cs.txt \
--weir-fst-pop Dfs.txt \
--weir-fst-pop Lys.txt \
--weir-fst-pop Mxg.txt \
--weir-fst-pop Zss.txt
作者:Koalaemu
链接:https://www.jianshu.com/p/943af58890bd
来源:
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
hapFLK
FLK和Fst同类,都是评估群体分化过程中的选择效应的。
FLK的分析的介绍和方法:
http://membres-timc.imag.fr/Michael.Blum/summer_school_2013/Main_talks/Servin_SSMPG2013.pdf
Fst的公式为: Fst=(Ht-Hs)/Ht
其中,Ht为种群预期杂合度(假设这个种群中不存在亚群,达到哈温平衡的杂合度),Hs为亚群预期杂合度(假设这个种群中每一个亚群内部独立自由交配,相互之间无交配,达到哈温平衡后,几个亚群杂合度的加权平均值)
因此Fst是从这两种假设之间的“相似度”出发的统计量,而hapFLK则是从“差异”出发的统计量。开发者认为FLK比Fst更能够表现出群体之间的差异性。
hapFLK安装
## install
sudo pip install hapflk
## upgrade
sudo pip install hapflk --upgrade
或直接下载
下载链接:https://files.pythonhosted.org/packages/51/c4/ed7b823aa136185d750d60f53268cfb6804dcc87183dbe216135e63aa583/hapflk-1.4.tar.gz
网址:
https://pypi.org/project/hapflk/#files
https://forge-dga.jouy.inra.fr/projects/hapflk
hapFLK运行
hapFLK的输入文件是PLINK文件,包括ped/map,或者bed/bim/fam。文件的第一行必须是种群的名字(FID)。
hapflk --bfile NorthernSheep --outgroup Soay
# 基本使用方法
具体使用方法 hapflk -h
usage: hapflk [-h] [--ped FILE] [--map FILE] [--file PREFIX] [--bfile PREFIX]
[--miss_geno C] [--miss_pheno C] [--miss_parent C]
[--miss_sex C] [--chr C] [--from x] [--to x] [--other_map]
[-p PREFIX] [--ncpu N] [--eigen] [--kinship FILE]
[--reynolds-snps L] [--outgroup POP] [--keep-outgroup] [-K K]
[--nfit NFIT] [--phased]
optional arguments:
-h, --help show this help message and exit
-p PREFIX, --prefix PREFIX
prefix for output files (default: hapflk)
--ncpu N Use N processors when possible (default: 1)
--eigen Perform eigen decomposition of tests (default: False)
--reynolds Force writing down Reynolds distances (default: False)
--annot Shortcut for --eigen --reynolds --kfrq (default:
Input Files:
Available formats
--ped FILE PED file (default: None)
--map FILE MAP file (default: None)
--file PREFIX PLINK file prefix (ped,map) (default: None)
--bfile PREFIX PLINK bfile prefix (bim,fam,bed) (default: None)
Data format options:
--miss_geno C Missing Genotype Code (default: 0)
--miss_pheno C Missing Phenotype Code (default: -9)
--miss_parent C Missing Parent Code (default: 0)
--miss_sex C Missing Sex Code (default: 0)
SNP selection:
Filter SNP by genome position
--chr C Select chromosome C (default: None)
--from x Select SNPs with position > x (in bp/cM) Warning :
does not work with BED files (default: 0)
--to x Select SNPs with position < x (in bp/cM) Warning :
does not work with BED files (default: inf)
--other_map Use alternative map (genetic/RH) (default: False)
Population kinship :
Set parameters for getting the population kinship matrix
--kinship FILE Read population kinship from file (if None, kinship is
estimated) (default: None)
--reynolds-snps L Number of SNPs to use to estimate Reynolds distances
(default: 10000)
--outgroup POP Use population POP as outgroup for tree rooting (if
None, use midpoint rooting) (default: None)
--keep-outgroup Keep outgroup in population set (default: False)
hapFLK and LD model:
Switch on hapFLK calculations and set parameters of the LD model
-K K Set the number of clusters to K. hapFLK calculations
switched off if K<0 (default: -1)
--nfit NFIT Set the number of model fit to use (default: 20)
--phased, --inbred Haplotype data provided (default: False)
--kfrq Write Cluster frequencies (Big files) (default: False)
LFMMs模型(latent factor mixed models)/LEA package
LEA软件官网:http://membres-timc.imag.fr/Olivier.Francois/LEA/tutorial.htm
tutorial:http://membres-timc.imag.fr/Olivier.Francois/LEA/files/LEA_1.html
library(LEA)
LEA包主要有两个重要的function:snmf() 和 lfmm()
需要两种格式的输入文件
第一是基因型文件,如官方提供的genotype.lfmm文件
0 0 1 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 0 0 2 0 0 0 0 0 0 0 0 1 1 2 0 2 0 0 0 0 0 2 2 0 0 0 0 2 0 0 0 0 0 1 0 0 0 0 0 2 0 0 0 0 0 0 2 0
1 0 1 0 0 2 0 0 0 0 0 0 0 0 0 2 1 0 1 2 0 2 0 0 0 1 0 0 1 0 0 0 1 1 2 0 2 0 0 0 0 0 2 2 0 1 0 0 2 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 2 0
1 0 1 0 0 2 0 0 0 0 0 0 0 0 0 2 1 0 1 2 0 2 0 0 0 1 0 0 1 0 0 0 1 1 2 0 2 0 0 0 0 0 2 2 0 1 0 0 2 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 2 0
...
每一行代表一个个体,012代表基因型(SNPs)
第二是环境因子向量文件,如 gradient.env,有多少个体就有多少行
-7.86345637580724
-0.77898414155103
-1.63128052555653
2.06376301313332
0.80270905131277
1.84265215979298
10.249483491269
9.69112362600386
11.8551811248261
没有环境变量的,可以设置为0和1。如1代表高原,0代表平原。
snmf()
snmf()类似于STRUCTURE,都是群体结构分析,但snmf()运行速度更快
genotype = lfmm2geno("genotype.lfmm")
# 将lfmm格式转换为geno格式
obj.snmf = snmf(genotype, K = 1:12, entropy = T, ploidy = 2, project="new")
# 运行程序,K设置1到12,每个跑一边
plot(obj.snmf)
#绘制熵图,熵最低的K是最合理、有序度最高的
barplot(t(Q(obj.snmf, K = 6)), col = 1:6)
# 绘制structure barplot(根据上一步已知k=6是最合适的)
lfmm()
lfmm模型用于探究潜在的环境因子对基因型的影响
obj.lfmm = lfmm("genotype.lfmm", "gradient.env", K = 6, rep = 5, project="new")
K值根据snmf结果来设置,在本例中是6。rep是运算重复次数,越多越好,可以设为10。
#Record z-scores from the 5 runs in the zs matrix
#整合多次运行的结果,以zscore的形式,取中位数
zs = z.scores(obj.lfmm, K = 6)
#Combine z-scores using the median
zs.median = apply(zs, MARGIN = 1, median)
#Compute the GIF
lambda = median(zs.median^2)/qchisq(0.5, df = 1)
lambda
# compute adjusted p-values from the combined z-scores
adj.p.values = pchisq(zs.median^2/lambda, df = 1, lower = FALSE)
#histogram of p-values
hist(adj.p.values, col = "red")
绘制出的柱状图要尽量平整,而在接近0点位置尽量陡峭而高,如下图所示。否则需要手动调整lambda值,例如调到0.55。lambda是基因组膨胀系数,小于1是最好的,大于1说明存在低质量位点。
linux下统计方法https://blog.csdn.net/qq_35242986/article/details/68945981?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.not_use_machine_learn_pai&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.not_use_machine_learn_pai
接下来需要对loci进行筛选,找到真正差异的基因位点,有两种方法:Benjamini-Hochberg算法和直接计算Storey's q-values 。
1、用Benjamini-Hochberg算法来调整、筛选多样本的candidate loci
## FDR control: Benjamini-Hochberg at level q
## L = number of loci
L = 500
#fdr level q
q = 0.1
w = which(sort(adj.p.values) < q * (1:L)/L)
candidates.bh = order(adj.p.values)[w]
如此,candidate loci被储存在candidates.bh文件中
实际科研中,FDR level可以设置为q=0.01
2、直接用qvalue包计算q-value
## FDR control: Storey's q-values
library(qvalue)
plot(qvalue(adj.p.values))
candidates.qv = which(qvalue(adj.p.values, fdr = .1)$signif)
q-value即通过FDR矫正后的p-value,可参见https://www.jianshu.com/p/9e97e9b351fd
最后,将candidates.bh 和candidates.qv 中的loci合并,就是筛选得到的差异位点。
PCADAPT软件(Principal Component Analysis for outlier detection)
此软件基于贝叶斯因子模型
官网:https://cran.r-project.org/web/packages/pcadapt/index.html
输入文件为bed或者matrix,都可以
pcadapt(
input,
K = 2,
method = c("mahalanobis", "componentwise"),
min.maf = 0.05,
ploidy = 2,
LD.clumping = NULL, pca.only = FALSE,
tol = 1e-04 )
实际研究中,我设置为k=1,min.maf=0.05
mahalanobis (default): the robust Mahalanobis distance is computed for each genetic marker using a robust estimate of both mean and covariance matrix between the K vectors of z-scores.
componentwise: returns a matrix of z-scores.
如果要把bed转化为matrix:bed2matrix,但没必要
bed2matrix(bedfile, n = NULL, p = NULL)
#bedfile: Path to a bed file.
#n: Number of samples. Default reads it from corresponding fam file.
#p: Number of SNPs. Default reads it from corresponding bim file.
最后一步
整合三个软件跑出来的z-score,计算calibrated P value,然后用Benjamini–Hochberg FDR矫正,生存loci列表。