minfi 分析甲基化芯片数据 - 质量过滤篇
在对原始芯片数据进行分析之前,请您首先完成的是对其质量进行初步筛查工作。这种筛查主要关注探针级别的一系列指标,并具体包括以下几个核心环节:
-
过滤掉可信度较低的探针;
-
过滤掉覆盖了snp位点的探针;
-
过滤掉位于性染色体上的探针;
过滤掉可信度较低的探针
对于探针信号的可靠性而言,在Minfi软件包中可以通过相应的p-value进行评估;具体而言,在Minfi软件包中可以通过DetectP函数来计算每个探针对应的p值,并提供详细的统计结果以辅助判断探针信号的质量与准确性
# import data 第一个参数为Sampel_Sheet.csv 文件所在的目录
targets <- read.metharray.sheet("./", pattern="HumanMethylation450_Demo_Sample_Sheet.csv")
rgSet <- read.metharray.exp(targets=targets)
# probe pvalue
probeP <- detectionP(rgSet)
一般认为,在统计显著性方面p > 0.01 的探针信号不具参考价值。在实际应用中,则规定若在一个样本中的检验水平p值超过0.01时,则将其排除在外。
keep <- apply(probeP, 1 , function(t){all(t < 0.01)})
rgSet <- rgSet[keep,]
当实验操作出现偏差时,在某些情况下会致使某一批次样本的质量异常低。一般而言,在使用探针计算pvalue时所得取样平均值高于0.05的所有样本都被认定为质量较低的标本,并且这些情况下的标本同样需要进行过滤处理
keep <- apply(probeP, 2, mean) < 0.05
rgSet <- rgSet[,keep]
对于探针信号的可靠性可通过直接分析原始数据来评估。
而对于探针所涉及的snp信息及染色体数据,则需相应的探针注释文件辅助。
在bioconductor平台中,
IlluminaHumanMethylation450kanno.ilmn12.hg19包提供了450K芯片位点的具体注释信息;
而IlluminaHumanMethylationEPICanno.ilm10b4.hg19包则包含了850K芯片位点的相关数据记录。
minfi软件程序在处理原始数据时会根据探针的数量自动识别所使用的芯片类型,
并从相应的包中提取必要的注释信息辅助分析。
在执行snp及性染色相关滤波步骤之前,
请确保已经准备好并获取了完整的芯片定位与标记基因组注释信息。
mSet <- preprocessRaw(rgSet)
Gset <- mapToGenome(mSet)
annotation <- getAnnotation(Gset)
过滤掉覆盖了snp位点的探针
当探针对某一snp位点进行探测时,可能会对其杂交结果产生影响;在实际操作中,则倾向于对这类探针进行过滤处理。这时就需要探针对应携带的snp信息作为注释。对于甲基化芯片而言,有3种SNP 注释信息
> snps <- getSnpInfo(Gset)
> head(snps)
DataFrame with 6 rows and 6 columns
Probe_rs Probe_maf CpG_rs CpG_maf SBE_rs SBE_maf
<character> <numeric> <character> <numeric> <character> <numeric>
cg13869341 NA NA NA NA NA NA
cg14008030 NA NA NA NA NA NA
cg12045430 NA NA NA NA NA NA
cg20826792 NA NA NA NA NA NA
cg00381604 NA NA NA NA NA NA
cg20253340 NA NA NA NA NA NA
- CpG_rs
CpG_rs 被称为这一类探针并具有双重功能即作为CpG位点也被识别为snp位点。在探针对该基因组进行分析时 CpG位点的位置将被记录至pos字段中 基于起始行的位置信息 例如 探针编号为 rs71507462 的样本在其对应的hg19染色体上将精确定位到坐标 762592的位置处
> head(annotation[!is.na(annotation$CpG_rs), c(1,2,3,14,15)])
DataFrame with 6 rows and 5 columns
chr pos strand CpG_rs CpG_maf
<character> <integer> <character> <character> <numeric>
cg06402284 chr1 762592 - rs71507462 0.274931
cg03213877 chr1 763116 - rs191770232 0.020600
cg20788133 chr1 765028 - rs2519025 0.092322
cg09139287 chr1 787398 - rs2905055 0.336368
cg00168193 chr1 790667 + rs149504348 0.038900
cg01062849 chr1 838731 + rs28477624 0.040256
- SBE_rs
SBE_r指的是CpG位点下游的第一个碱基是snp位点,rs2905055 在hg19的位置是787399
> head(annotation[!is.na(annotation$SBE_rs), c(1,2,3,16,17)])
DataFrame with 6 rows and 5 columns
chr pos strand SBE_rs SBE_maf
<character> <integer> <character> <character> <numeric>
cg09139287 chr1 787398 - rs2905055 0.336368
cg23112672 chr1 876199 - rs71628924 0.012351
cg10644916 chr1 899000 + rs3813184 0.087352
cg10625579 chr1 942635 - rs76233940 0.066406
cg13917577 chr1 957119 - rs3121553 0.282192
cg11853970 chr1 986037 - rs28758798 0.000456
- Probe_rs
Probe_rs代表了探针区域覆盖的所有snp位点。其长度约为50BP左右,在hg19坐标系中位于位置 91,536处的一条长约为 22, upstream于该坐标约有 22 BP的位置
> head(annotation[!is.na(annotation$Probe_rs), c(1,2,3,12,13)])
DataFrame with 6 rows and 5 columns
chr pos strand Probe_rs Probe_maf
<character> <integer> <character> <character> <numeric>
cg03130891 chr1 91550 - rs77418980 0.305556
cg24335620 chr1 135252 - rs147502335 0.012800
cg24669183 chr1 534242 - rs6680725 0.108100
cg14057946 chr1 713985 - rs74512038 0.076823
cg11422233 chr1 714002 - rs74512038 0.076823
cg16047670 chr1 714012 + rs114983708 0.115264
使用dropLociWithSnps函数可以根据snp类型和频率设定筛选标准。从探针的工作机制来看,CpG_rs和SBE_rs对探针杂交的影响最为显著,因此通常会选择这两种类型的snp用于筛选.具体使用方法可以通过以下示例理解.
GRset <- dropLociWithSnps(Gset, snps=c("Probe","SBE","CpG"), maf=0)
过滤掉位于性染色体上的探针
在样本中同时存在两种性别的情况下,在性染色体上不同位置的甲基化差异程度难以被精确量化;因此建议移除用于测量这些区域的探针
sex_probe <- rownames(annotation)[annotation$chr %in% c("chrX", "chrY")]
keep <- !(featureNames(GRset) %in% sex_probe)
GRset <- GRset[keep, ]
总结:
探针信号的可靠性通过p值进行评估,在这种情况下,当p值较小时(即小于0.01时),通常会移除这些探针。
因为snp的存在会影响探针与DNA分子的杂交结果
- 当分组比较的样本混合了不同性别,需要去除位于性染色体上的探针。
