检测选择信号/位点

本文主要介绍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说明存在低质量位点。

3

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列表。

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