Rehh包的使用
一、数据的输入
数据的输入格式有5种
1.标准单倍型格式,参考文件bta12_cgu.hap,使用less -S 命令查看
其中每行代表一个单倍型,每个单倍型有1424个SNP, 每行的第一个元素被用作单倍型标识符。
2.标准单倍型的转置格式,类似程序SHAPEIT2产生的格式,但是没有行名和列名
3.来自phasing程序fastPHASE的输出文件,例如bta12_hapguess_switch.out,用less -SN 查看
4.vcf格式,用R语言读取这种格式之前必须安装vcfR软件包或data.table和R.utils软件包(压缩文件需要后者),示例文件bta12_cgu.vcf.gz
5.ms程序的输出文件,在读取数据之前必须安装gab包,示例文件
两段分别代表两个染色体,每一段的第一行代表有15/39个SNP位点,下面的10行代表10个单倍型,10行里面的01编码对应每一个SNP位点。
对于前三种格式的输入文件,必须要提供标记信息文件,例如map.inp
一共5列,每一列分别对应 标记名称、染色体名称、在染色体上的位置、祖先等位基因、突变等位基因
二.数据的加载
data2haplohh()函数将数据文件转换为haplohh类的R对象,为后续分析奠定基础。
- data2haplohh()函数的使用
(1) Allele coding options:
参数allele_coding具有四个选项:其中三个希望用户提供编码,而第四个选项将覆盖任何用户定义的编码。
程序包接受两种不同的在单倍型文件中整数编码,“12”或“ 01”类型如下:
程序包一般使用01编码,如果输入文件的等位基因是未编码格式,我们需要使用标记信息文件,通过allele_coding =“map”选项进行编码,编码过程如下,如果在标记信息文件的第四列中找到了一个标记的等位基因,则将其重新编码为0(祖先),如果在第五列中找到了它,则将其重新编码为1(突变)。第五列可能包含多个等位基因,以逗号分隔,如果在标记信息文件的第四列和第五列中均未找到单倍型文件中存在的等位基因,则将其计为NA。
(2) Filtering options:
①丢弃丢失大量数据的单倍型。丢弃那些基因型标记的分数小于min_perc_geno.hap的基因型,它的默认值为NA,此选项可以忽略。
②丢弃丢失大量数据的标记。丢弃在单倍型的小于min_perc_geno.mrk的分数上进行基因分型的单个标记。默认情况下,min_perc_geno.mrk = 100,表示仅保留完全基因分型的标记。不允许NA或零值,因为rehh无法处理没有数据的标记。
③丢弃低等位基因频率的标记。可以丢弃次等位基因频率(MAF)等于或低于min_maf的标记。其默认值为NA,此选项可以忽略。
(3) 示例代码
①标准单倍型文件
hh <- data2haplohh(hap_file = "bta12_cgu.hap", #12号染色体的标准单倍型格式
map_file = "map.inp",
chr.name = 12, #因为map.inp文件包含29个染色体,所以要指定染色体,若不指定就会报错:Error: Please specify a chromosome name. Conversion stopped.
allele_coding = "map")
如果信息文件中染色体的标记数与单倍型文件中的标记数不对应(例如,指定了错误的染色体时),则会提示以下消息:Error: The number of markers in the haplotype file (1424) is not equal
②标准单倍型转置文件
hh <- data2haplohh(hap_file = "bta12_cgu.thap",
map_file = "map.inp",
chr.name = 12,
allele_coding = "map",
haplotype.in.columns = TRUE) #相对于示例1只需要添加这一行,其他都一样
③以fastPHASE输出格式读取的单倍型文件
hh <- data2haplohh(hap_file = "bta12_hapguess_switch.out",
map_file = "map.inp",
chr.name = 12,
popsel = 7,
allele_coding = "map")
这个文件是由使用fastPHASE选项-u的多个群体产生的,所以需要指定目标的种群popsel = 7。如果不指定此命令则会出现:
> Error: Please specify by 'popsel' one of the following population numbers:
> 1 2 3 4 5 6 7 8
> Conversion stopped.
④vcf格式文件
hh <- data2haplohh(hap_file = "bta12_cgu.vcf.gz",
polarize_vcf = FALSE,
vcf_reader = "data.table")
在使用此代码前需要安装R.utils(读取压缩文件),vcfR或data.table软件包,参数vcf_reader必须设置为“ vcfR”或“ data.table”; 函数data2haplohh()自动检查输入文件是否为vcf。在这种情况下,将忽略参数map_file和allele_coding; 如果文件中有多个染色体的数据,则必须通过chr.name指定感兴趣的染色体;如果没有编码,则应该将选项polarize_vcf设置为FALSE,使用内部编码01。
⑤ ms的输出格式文件
hh <- data2haplohh(hap_file = "ms.out",
chr.name = 2,
position_scaling_factor = 1000)
函数data2haplohh()自动检查文件是否为模拟程序ms的输出格式。在这种情况下,将忽略参数map_file和allele_coding。由于给出的染色体位置为区间0-1的小数,设置position_scaling_factor与小数相乘,以得到更实际的值。需要指定运行的染色体编号。因为只有两个染色体,如果设置chr.name= 3,则会报错: 错误: Ms output file contains 2 simulations.Please select one by specifying its number in 'chr.name'.
(4) 获取输出文件的子集(例如ms文件的输出)
hh_subset = **subset**(hh, select.hap = 1:5, min_maf = 0)
将ms的输出限制为前五个单倍型并过滤出单态位点;将min_maf设置为零来排除子集中的单态标记;
疑问?为什么没有排除s2列:排除前五行全是0或者全是1的列
hh_subset = subset(hh, select.mrk = -1)
只去掉第一列,-3是减去第三列的意思
三、计算EHH,EHHS及其“积分” iHH和iES
EHH:扩展单倍型纯和,定义为两个随机选择的携带核心等位基因的染色体在给定的周围染色体区域上纯合的概率,
na代表携带核心等位基因a的染色体数目;ksat代表不同的共享单倍型的数量;
nk是指与第k个此类共享单倍型有关的染色体数;a为核心等位基因,s为中心标记,t为另一个标记。EHH阈值为0.05.
iHH定义为EHH曲线下的面积,即EHH的积分
EHHS定义为作用于特定位点的EHH(不需要指定核心等位基因)
iES:EHHS的积分
- calc_ehh()的功能
计算相对核心标记s上游和下游标记t的的所有等位基因的EHH;
对于每个等位基因,还计算出EHH曲线的相应积分iHH。
有三个选项来约束EHH的计算:
limehh设置了一个阈值,低于此阈值将停止进一步计算EHH。默认值为0.05。
limhaplo定义了可接受的最小评估染色体数,默认值(最小)为2。
limhomohaplo设置了最小纯合染色体数,在该数目以下,EHH的计算被停止。它的默认值(最小)是2。对于不分相的单倍型的小样本,此数字应增加到4,以限制一对共享单倍型的影响
其他
当EHH的计算到达染色体的边界时,为了避免可能的边界效应,将丢弃积分iHH。为了保留积分,请将discard_integration_at_border设置为FALSE。
处理未定相数据时,参数phased设置为FALSE
include_zero_values仅涉及输出。如果为FALSE(默认设置),则输出仅包含标记的EHH值,直至指定的截止值。如果将参数切换为TRUE,则返回所有标记的值,其余为零。
示例:围绕SNP F1205400计算EHH
data(haplohh_cgu_bta12)
#computing EHH statistics for the focal SNP with name "F1205400"
#which displays a strong signal of selection
res <- calc_ehh(haplohh_cgu_bta12,
mrk = "F1205400",
include_nhaplo = TRUE)
include_nhap设置为TRUE会添加一些列,这些列显示在每个位置有多少条染色体对EHH的计算起作用。
res中包含的输出是一个包含四个元素的列表:
mrk.name:焦点标记的名称/标识符。
freq:包含焦点标记所有等位基因频率的向量。
ehh:一个数据框,其中包含焦点标记的每个等位基因的EHH值。将参数
ihh:每个等位基因均具有iHH的向量,即EHH值定义的EHH曲线上的积分
使用下面类似的代码查看每个元素的具体信息
res$mrk.name
使用下面命令可以可视化EHH值
plot(res)
如果把输入文件当成未分型(其实已经分型),添加phased = FALSE
plot(calc_ehh(haplohh_cgu_bta12,
mrk = "F1205400",
phased = FALSE),
xlim = c(2.55E7, 3.05E7))
可以发现两个图的差别非常小
- calc_ehhs()
calc_ehhs()函数可计算焦点标记s相对于另一个标记t的EHHS和nEHHS。
data(haplohh_cgu_bta12)
res <- calc_ehhs(haplohh_cgu_bta12,
mrk = "F1205400",
include_nhaplo = TRUE)
输出没有可区分的等位基因,有 EHHS的归一化和非归一化版本。获得包含四个元素的列表:
mrk.name:焦点标记的名称/标识符。
ehhs:沿着焦点标记周围的染色体具有EHHS和nEHHS值的数据框。可选地,可以包括NHAPLO列以显示在每个标记处评估了多少条染色体。
IES:EHHS曲线上的积分。
INES:nEHHS曲线上的积分。
plot(res) #画出非标准化的ehhs值
plot(res, nehhs = TRUE) 画标准化的ehhs值
plot(calc_ehhs(haplohh_cgu_bta12,
mrk = "F1205400",
phased = FALSE))
对于非定相数据,始终将EHHS值标准化。对于此特定标记,我们得到已定相的nEHHS类似的图像。
- scan_hh()的功能
函数scan_hh()为haplohh对象中的所有标记计算iHH\iES值。
与calc_ehh()为可能的多等位基因聚焦标记的每个等位基因计算iHH值相反,scan_hh()仅计算两个iHH值,即(默认情况下)祖先等位基因和突变频率最高的等位基因。如果标记未极化,则polarized选项应设置为FALSE,从而导致该功能使用频率最高和频率第二高等位基因。
例如:
data(haplohh_cgu_bta12)
scan <- scan_hh(haplohh_cgu_bta12)
haplohh_cgu_bta12的数据内容:包含有关280个单倍型的1424个SNP的数据,与data2haplohh()函数输出的文件格式一样 :280行,1424列
Scan的内容如下:
scan[453:459,] #查看453行到459行
四、Computing iHS, Rsb and XP-EHH
iHS的缩写是“单倍型积分”。非标准化和标准化的计算公式如下:
- ihh2ihs()的功能
ihh2ihs()函数使用一个数据帧计算iHS,该数据帧包含通过scan_hh()函数获得的祖先和突变(分别为主要和次要)等位基因的iHH值。默认情况下,min_maf = 0.05,参数freqbin控制用于执行标准化的等位基因频率仓的大小(或数量),等位基因频率仓的构建范围是从min_maf到1减去min_maf,步长为freqbin(默认为freqbin = 0.025)。选项min_nhaplo(默认NA)来减少因评估的单倍型太少而产生的统计噪声。可选地,可以通过设置include_freq为TRUE将输入数据帧的等位基因频率转移到输出数据帧中。为标准iHS值计算p值。默认情况下,它是双面的,但是可以通过设置参数p.side=left or right.
作为执行整个基因组扫描的工作流程,可以对来自每个染色体的单倍型数据运行scan_hh(),并在标准化之前将所得数据帧连接起来。在以下示例中,我们假设单倍型文件名为hap_chr_i.cgu,其中i = 1,...,29,标记信息文件名为map.inp。
for(i in 1:29) {
# haplotype file name for each chromosome
hap_file = paste("hap_chr_", i, ".cgu", sep = "")
# create internal representation
hh <- data2haplohh(hap_file = hap_file,
map_file = "map.inp",
chr.name = i,
allele_coding = "map")
# perform scan on a single chromosome (calculate iHH values)
scan <- scan_hh(hh)
# concatenate chromosome-wise data frames to
# a data frame for the whole genome
# (more efficient ways certainly exist...)
if (i == 1) {
wgscan <- scan
} else {
wgscan <- rbind(wgscan, scan)
}
}
# calculate genome-wide iHS values
wgscan.ihs <- ihh2ihs(wgscan) #获得标准化的ihs值
wgscan.ihs包含两个元素,下图为示例文件产生的wgscan.ihs.cgu
- ines2rsb()的功能
Rsb定于:群体之间EHHS的比率。非标准化和标准化的计算如下:
data(wgscan.cgu) ; data(wgscan.eut)
## results from a genome scan (44,057 SNPs) see ?wgscan.eut and ?wgscan.cgu for details
rsb.cgu_eut <- ines2rsb(scan_pop1 = wgscan.cgu,
scan_pop2 = wgscan.eut,
popname1 = "CGU",
popname2 = "EUT")
输入文件为两个群体的scan_hh()函数获得的inES,可选地,通过将include_freq设置为TRUE,可以将两个种群的等位基因频率从输入数据帧(如果存在)转移到输出数据帧。通过将参数p.side(默认为双面)设置为“ left”或“ right”来选择一侧。
输出文件格式如下:
- ies2xpehh()的功能
XP-EHH:跨种群EHH,与Rsb类似,不同之处在于它基于iES而非inES(都是scan_hh函数的输出文件的元素),
非标准和标准化计算公式如下:
与iHS和Rsb一样,iES必须按染色体方式计算,并连接后缀(分别针对每个群体),XP-EHH值是针对两个数据帧中存在的所有标记计算的。它们是通过染色体名称和位置而不是它们的标识符来识别的,因此,在每个种群中,染色体位置必须是唯一的。可选地,通过将include_freq设置为TRUE,可以将两个种群中的等位基因频率从输入数据帧(如果存在)转移到输出数据帧。
示例:
data(wgscan.cgu) ; data(wgscan.eut)
## results from a genome scan (44,057 SNPs) see ?wgscan.eut and ?wgscan.cgu for details
xpehh.cgu_eut <- ies2xpehh(scan_pop1 = wgscan.cgu,
scan_pop2 = wgscan.eut,
popname1 = "CGU",
popname2 = "EUT")
数据包含每个SNP的XP-EHH和关联的p值。可以通过将参数p.side(默认为双面)设置为“ left”或“ right”来选择一侧。
- calc_candidate_regions()的功能:划定区域
选择倾向于产生具有离群值的标记簇。因此,通常不会(仅)报告具有异常得分的标记,而是要报告带有明显数量或百分比的标记的间隔。提供函数calc_candidate_regions(),该函数在(可能重叠的)滑动窗口中扫描基因组,并将其识别为满足以下三个条件的“候选对象”:
最小标记数(min_n_mrk);
最小数量的极值标记(min_n_extr_mrk);
标记中最小的外部标记百分比(min_perc_extr_mrk)。
具有极高值的标记是得分大于参数threshold指定值的标记。除了上述条件的值之外,还报告了每个候选窗口的所有标记分数的平均值和极端分数的平均值。默认情况下,相邻和重叠的候选窗口合并在一起,并重新计算关联的值。可以通过将join_neighbors设置为FALSE来关闭它。如果window_size设置为1,则仅返回极值标记集。
默认情况下,对分数进行测试并报告。将pval切换为TRUE,使用关联的p值代替。
cr.cgu <- calc_candidate_regions(wgscan.ihs.cgu, #计算ihs的输出文件
threshold = 4,
pval = TRUE,
window_size = 1E6,
overlap = 1E5,
min_n_extr_mrk = 2)
输出文件格式如下