本文介绍的方法都是基于Extended Haplotype Homozygosity (EHH)概念,由SABETI 等人在 2002年提出。简单来说,根据selective sweep的概念,一个位点周围的位点如果多样性越低,就越有可能是因为selective sweep留下的选择印迹。
EEH计算举例:
一个简单的计算。令红色一行为focus的core SNP,那么向下数三个位点,计算它们的多样性(类似于交叉熵的东西,离散指数,香农商,whatever),显然多样性越低,这个core是受选择位点的可能性越高参考:https://static.epcc.ed.ac.uk/dissertations/hpc-msc/2013-2014/Hapbin:%20An%20Efficient%20Method%20for%20Calculating%20EHH%20and%20iHS%20of%20Genetic%20Datasets.pdf
这里有三篇介绍selective sweep的文章,讲得很好:
https://www.icode9.com/content-4-803828.html
https://www.plob.org/article/2345.html
https://www.jianshu.com/p/82719840ec4a
rehh tutorial:
https://cran.r-project.org/web/packages/rehh/vignettes/rehh.html#computing-ihs-rsb-and-xp-ehh
有很多衍生的统计量:EHH(Extended Haplotype Homozygosity)、iHS(Integrated Haplotype Score) 、XP-EHH(Cross Population Extended Haplotype Homozogysity)、RSB
rehh、selscan和hapbin都是基于EHH及其衍生概念的
Hapbin可以看这篇(但是hapbin无法处理缺失位点,不建议用):
使用Hapbin基于EHH、iHS、XP-EHH方法检测基因组中的选择信号
前提:染色体要有重组!Y和W染色体不能用这种方法
本文只写两个群体之间的单倍型选择信号检测,单个群体内部的不写,但是rehh也可以做,很方便
rehh
rehh是一个R包
1. 安装:
BiocManager::install("rehh")
2. 准备输入文件
2.1 .hap文件
群体1.hap 群体2.hap第一列个体名,后面每一列一个SNP。跟reference一样的就是0,第一种不一样的就是1,第二种不一样的就是2,以此类推。比如ref是G,那假设SNPs中还有T和A两个等位基因,就分别标为1和2。缺失值可以用[NA]或者[.]。每个群体一个文件。
2.1 .map文件
.map第一列SNP名称,随便起。第二列染色体名称。第三列染色体上的位点。第四列是major allele,一般就是0。第五列是minor allele,有一个1就填1,有1和2就填1,2。如图。两个群体用同一个文件就行。
注意,如果有好几条染色体,每条染色体要分别产生这两个文件,每条染色体分别跑。
3. 运行rehh
library(rehh)
####输入 MN 群体的数据
hh_map1 <- data2haplohh(hap_file = "Pop1.chr18.MN.hap",
map_file = "Pop1.chr18.map",
allele_coding = "01",
verbose = FALSE)
####输入 QH 群体的数据
hh_map2 <- data2haplohh(hap_file = "Pop2.chr18.QH.hap",
map_file = "Pop2.chr18.map",
allele_coding = "01",
verbose = FALSE)
### genome-wide 的 scan
res.scan1 <- scan_hh(hh_map1, discard_integration_at_border = FALSE)
res.scan2 <- scan_hh(hh_map2, discard_integration_at_border = FALSE)
#### 这里同时跑了 xpehh和rsb两种方法,但其实差不多,后者对core标准化,而前者不
res.xpehh <- ies2xpehh(res.scan1, res.scan2, "MN", "QH")
res.rsb<-ines2rsb(res.scan1, res.scan2, "MN", "QH")
### 把结果输入到文件
write.table(res.xpehh,"Pop1.chr18.xpehh.txt",quote=F,row.names=F)
write.table(res.rsb,"Pop2.chr18.rsb.txt",quote=F,row.names=F)
pdf("Pop.MN_QH.plot.pdf")
distribplot(res.xpehh$XPEHH_MN_QH)
title(sub = "xpehh_chr18")
manhattanplot(res.xpehh,pval=T)
### 画曼哈顿图
#### 这里选择了输出-log(p)值,如果不加pval参数,输出的就是统计量
title(sub = "xpehh_chr18")
distribplot(res.rsb$RSB_MN_QH)
title(sub = "rsb_chr18")
manhattanplot(res.rsb,pval=T)
title(sub = "rsb_chr18")
dev.off()
网友评论