Package version: MEAL 1.0.3

Contents

1 Introduction

Illumina Infinium HumanMethylation 450K BeadChip assay has become a standard tool to analyse methylation in human samples. Developed in 2011, it has already been used in projects such as The Cancer Genome Atlas (TCGA). Their 450.000 probes provide a good overall image of the methylation state of the genome, being one of the reasons of its success.

Given its complex design1, many Bioconductor packages have been developed to assess normalization and pre-processing issues (e.g. minfi (Aryee et al. 2014) or lumi (Du, Kibbe, and Lin 2008)). In addition, these packages can perform detect differentially methylated probes (DMPs) and differentially methylated regions (DMRs). However, the interfaces are not very intuitive and several scripting steps are usually required.

MEAL aims to facilitate the analysis of Illumina Methylation 450K chips. DMPs and DMRs detection algorithms are included, along with new plotting facilities. Besides, two wrapper functions allow performing whole methylome analysis or range analysis. Two additional features are adjustment of models for SNPs and tools to manage genomic-like variables.

1.1 Data types

MEAL implements three new classes: MethylationSet, AnalysisResults and AnalysisRegionResults. MethylationSet is a class derived from Bioconductor eSet. All the information of the experiment is contained in this class: a beta values matrix, phenotypic information and annotation.

AnalysisResults and AnalysisRegionResults contain the results of whole methylome analysis and region analysis respectively. Plotting functions are applied on these classes.

1.2 Example data

minfiData and IlluminaHumanMethylation450kanno.ilmn12.hg19 packages are required in order to run the examples of this vignette. minfiData contains MsetEx, a MethylSet from the minfi package.

library(MEAL)
library(minfiData)
library(GenomicRanges)

2 Read data

MEAL doesn’t contain preprocessing capabilities so these steps should be done previously. As a result, before analysing MsetEx, probes that does not measure CpGs should be previously filtered. The next code uses a minfi function to remove not CpGs probes.

MsetExFilt <- dropMethylationLoci(MsetEx)

MethylationSet construction requires a beta values matrix and a data.frame with the phenotypes. The following code extract both objects from a minfi object. To speed up the example, only 30.000 probes will be used. In order to obtain reproducible results, the seed used for random number will be set to 0.

set.seed(0)
betas <- getBeta(MsetExFilt)
betas <- betas[sample(1:nrow(betas), 30000), ]
phenotypes <- pData(MsetExFilt)

With prepareMethylationSet, a MethylationSet is obtained. It contains only the samples having beta values and phenotypes and the probes containing annotation.

set <- prepareMethylationSet(matrix = betas, phenotypes = phenotypes, 
                                    annotation = "IlluminaHumanMethylation450kanno.ilmn12.hg19")
set
## MethylationSet (storageMode: lockedEnvironment)
## assayData: 29999 features, 6 samples 
##   element names: meth 
## protocolData: none
## phenoData
##   rowNames: 5723646052_R02C02 5723646052_R04C01 ...
##     5723646053_R06C02 (6 total)
##   varLabels: Sample_Name Sample_Well ... filenames (13 total)
##   varMetadata: labelDescription
## featureData
##   featureNames: cg17501828 cg15560884 ... cg14273923 (29999 total)
##   fvarLabels: chromosome position ... DHS (17 total)
##   fvarMetadata: labelDescription
## experimentData: use 'experimentData(object)'
## Annotation: IlluminaHumanMethylation450kanno.ilmn12.hg19

prepareMethylationSet is the main entry point to use the package and it is worth describing its arguments and functionalities. The first two arguments (matrix and phenotypes) are the matrix of beta values and the data.frame of phenotypes. It should be noticed that an AnnotatedDataFrame can be used as phenotypes (during the construction of the object, phenotypes data.frame is coerced to an AnnotatedDataFrame). In any case, beta values matrix contains cpgs at rows and samples at columns and both must be named. The same applies to phenotypes data.frame but rows must contain samples and columns variables.

annotation can be a character or a data.frame (or an AnnotatedDataFrame). If character, it loads an annotation package and uses it in the object. At the moment, only IlluminaHumanMethylation450kanno.ilmn12.hg19 is supported. The following parameters (chromosome, position, genes and group) allow the specification of a custom annotation. If annotation is a data.frame, these parameters should match column names of the annotation data.frame. Chromosome equals to chromosome name (e.g. chr1) and position to position coordinates. Genes and group are optional and equal to the genes near the probe and to the position of the probe in relation to the gene. Default argument values match names in IlluminaHumanMethylation450kanno.ilmn12.hg19 annotation package. Finally, if annotation is not specified, IlluminaHumanMethylation450kanno.ilmn12.hg19 package is used.

2.1 Compatibility with minfi

minfi objects can be directly used in prepareMethylationSet. If the object contains phenotypes, there is no need to supply it. Otherwise, it will be compulsory.

3 Probe analysis

The initial approach when studying methylation was to find differentially methylated probes. The analysis chosen was to fit a linear model for each of the probes, taking into account the variable of interest as well as some covariates. Probes were usually sorted by statistical parameters such as coefficients p-value.

This approach has been implemented in MEAL but with some changes. As was proposed in (Du et al. 2010), M-values (logit2 transformation of beta values) are used to fit the model. In addition, a robust linear regression is used instead of a normal linear regression. This kind of regression is more robust to outliers and can obtain more accurate coefficients.

Before analysing the data, a quick look at the phenotypes will be done:

pData(set)
##                   Sample_Name Sample_Well Sample_Plate Sample_Group
## 5723646052_R02C02    GroupA_3          H5           NA       GroupA
## 5723646052_R04C01    GroupA_2          D5           NA       GroupA
## 5723646052_R05C02    GroupB_3          C6           NA       GroupB
## 5723646053_R04C02    GroupB_1          F7           NA       GroupB
## 5723646053_R05C02    GroupA_1          G7           NA       GroupA
## 5723646053_R06C02    GroupB_2          H7           NA       GroupB
##                   Pool_ID person age sex status  Array      Slide
## 5723646052_R02C02      NA    id3  83   M normal R02C02 5723646052
## 5723646052_R04C01      NA    id2  58   F normal R04C01 5723646052
## 5723646052_R05C02      NA    id3  83   M cancer R05C02 5723646052
## 5723646053_R04C02      NA    id1  75   F cancer R04C02 5723646053
## 5723646053_R05C02      NA    id1  75   F normal R05C02 5723646053
## 5723646053_R06C02      NA    id2  58   F cancer R06C02 5723646053
##                                                  Basename
## 5723646052_R02C02 ../extdata/5723646052/5723646052_R02C02
## 5723646052_R04C01 ../extdata/5723646052/5723646052_R04C01
## 5723646052_R05C02 ../extdata/5723646052/5723646052_R05C02
## 5723646053_R04C02 ../extdata/5723646053/5723646053_R04C02
## 5723646053_R05C02 ../extdata/5723646053/5723646053_R05C02
## 5723646053_R06C02 ../extdata/5723646053/5723646053_R06C02
##                                                 filenames
## 5723646052_R02C02 ../extdata/5723646052/5723646052_R02C02
## 5723646052_R04C01 ../extdata/5723646052/5723646052_R04C01
## 5723646052_R05C02 ../extdata/5723646052/5723646052_R05C02
## 5723646053_R04C02 ../extdata/5723646053/5723646053_R04C02
## 5723646053_R05C02 ../extdata/5723646053/5723646053_R05C02
## 5723646053_R06C02 ../extdata/5723646053/5723646053_R06C02
summary(pData(set))
##  Sample_Name        Sample_Well        Sample_Plate   Sample_Group      
##  Length:6           Length:6           Mode:logical   Length:6          
##  Class :character   Class :character   NA's:6         Class :character  
##  Mode  :character   Mode  :character                  Mode  :character  
##                                                                         
##                                                                         
##                                                                         
##  Pool_ID           person               age            sex           
##  Mode:logical   Length:6           Min.   :58.00   Length:6          
##  NA's:6         Class :character   1st Qu.:62.25   Class :character  
##                 Mode  :character   Median :75.00   Mode  :character  
##                                    Mean   :72.00                     
##                                    3rd Qu.:81.00                     
##                                    Max.   :83.00                     
##     status             Array               Slide          
##  Length:6           Length:6           Min.   :5.724e+09  
##  Class :character   Class :character   1st Qu.:5.724e+09  
##  Mode  :character   Mode  :character   Median :5.724e+09  
##                                        Mean   :5.724e+09  
##                                        3rd Qu.:5.724e+09  
##                                        Max.   :5.724e+09  
##    Basename          filenames        
##  Length:6           Length:6          
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
## 

The most interesting variables are person, age, sex and status. Age is numeric but the other ones, that should be factors, are indeed characters. The following analysis will be performed using the variable status, which defines samples of normal or cancer tissues.

Probe analysis can be done with DAProbe, which needs a MethylationSet and a matrix model.

mod <- model.matrix(~as.factor(status), data = pData(set))
proberes <- DAProbe(set = set, model = mod, method = "ls", coefficient = 2)
head(proberes)
##            intercept as.factor(status)normal        sd         t
## cg25937714 0.7305902              -0.5912205 0.2677518 -15.18472
## cg06340552 0.6815428              -0.6019749 0.3304132 -14.01203
## cg20450979 0.4797533              -0.4153843 0.2784143 -13.44973
## cg21245277 0.6422945              -0.5370338 0.2942895 -13.36087
## cg13355248 0.8088785              -0.7467653 0.4490501 -13.35681
## cg19333963 0.7364919              -0.6581963 0.3888593 -12.96130
##                 P.Value   adj.P.Val chromosome  position
## cg25937714 5.264155e-07 0.005426774       chr3  44036492
## cg06340552 9.574154e-07 0.005426774       chr4 142054329
## cg20450979 1.297019e-06 0.005426774       chr4 176923542
## cg21245277 1.362233e-06 0.005426774       chr2 185463218
## cg13355248 1.365300e-06 0.005426774      chr17  78449872
## cg19333963 1.704865e-06 0.005426774      chr19   1467979
##                              genes                       group
## cg25937714                                                    
## cg06340552           RNF150;RNF150               1stExon;5'UTR
## cg20450979 GPM6A;GPM6A;GPM6A;GPM6A 5'UTR;5'UTR;1stExon;1stExon
## cg21245277         ZNF804A;ZNF804A               1stExon;5'UTR
## cg13355248                   NPTX1                     1stExon
## cg19333963                    APC2                        Body

DAProbe returns a data.frame with the results of the linear analysis. In the example, method is set to “ls” (normal linear regression) in order to speed the tutorial, but default is robust regression. Coefficient indicates the coefficients of the model matrix whose results will be returned. If coefficient is a vector, a list of data.frames is returned.

4 Region analysis

MEAL includes three region analysis algorithms: bumphunter (Jaffe et al. 2012), DMRcate (Peters et al. 2015) and blockFinder. More information about these methods can be found at the corresponding packages.

DARegion needs a MethylationSet and a matrix model (the same that DAProbe):

regionres <- DARegion(set = set, model = mod, coefficient = 2)
names(regionres)
## [1] "bumphunter"  "blockFinder" "DMRcate"
head(regionres$bumphunter)
##         chr     start       end     value      area cluster indexStart
## 23969  chr6  29521023  29521756 -2.286410 13.718458   21494      23809
## 24390  chr6 118228078 118228871 -3.790524 11.371572   22512      25102
## 23124  chr4 142054254 142054329 -4.827935  9.655870   19467      21552
## 16223 chr10   1779432   1780184 -3.143640  9.430920    2715       2987
## 16907 chr11  30607068  30607360 -4.664209  9.328417    4439       4905
## 21929 chr20  61340107  61340542 -3.080326  9.240979   16372      18133
##       indexEnd L clusterL
## 23969    23814 6        6
## 24390    25104 3        3
## 23124    21553 2        2
## 16223     2989 3        3
## 16907     4906 2        2
## 21929    18135 3        3
head(regionres$blockFinder)
##       chr     start       end      value     area cluster indexStart
## 210  chr6  31904709  32411670  0.1379759 6.484868    1207      21656
## 207  chr6  28962770  30017803  0.1132343 4.982309    1207      21373
## 715 chr12 113345598 113417284 -1.3327353 3.998206    2228       6498
## 490 chr15  25230200  25513277  0.1477724 3.546538    2466       8428
## 35   chr1 152538857 153068236  0.2331429 3.497144     165       1690
## 212  chr6  33037444  33232191  0.1478054 3.103914    1207      21783
##     indexEnd  L clusterL
## 210    21734 47      250
## 207    21447 44      250
## 715     6500  3       12
## 490     8451 24       27
## 35      1704 15       33
## 212    21822 21      250
head(regionres$DMRcate)
## data frame with 0 columns and 0 rows

DARegion returns a list of data.frames with the results of the different methods. methods parameter can be used to select the methods desired. If a method is not chosen, a NA value is returned in this position. Because DMRcate uses results from a linear model regression, these results can be computed using DAProbe and passed in the argument proberes.

Bumphunter and blockFinder can calculate p-values for the regions differentially detected using bootstraping. num_permutations arguments sets the number of permutations that will be done to estimate these p-values. By default it is set to 0, because its computation requires a lot of memory and it is time consuming.

Finally, it should be said that blockFinder method has been adapted from minfi package and it needs its annotation package (IlluminaHumanMethylation450kanno.ilmn12.hg19). If another annotation is used, blockFinder use is discouraged.

5 Whole methylome analysis

The first approach when studying methylation changes is to get an overall picture of the methylation state throughout the genome. This kind of analysis is performed by the function DAPipeline. The first analysis will be to evaluate the effect of cancer in methylation. Given that this variable is a character, it should be converted to factor using variable_types:

res <- DAPipeline(set = set, variable_names = "status", variable_types = "categorical", 
                      probe_method = "ls", verbose = TRUE)
res
## class: AnalysisResults 
## original class: MethylationSet 
## features(2135): cg25937714 cg06340552 ... cg05073901 cg16246713
## samples(6): 5723646052_R02C02 5723646052_R04C01 ...
##   5723646053_R05C02 5723646053_R06C02
## variables:  status 
## model variables names:  status 
## covariables: none 
## Number of bumps: 26175 
## Number of blocks: NULL 
## Number of regions: 0 
## Number of differentially methylated probes: 2135

DAPipeline generates a AnalysisResults objects containing probe and region analysis results. Most of the parameters of this function are arguments of DAProbe and DARegion.

On the other hand, there are four important parameters in this function: variable_names, variable_types, covariable_names and covariable_types. These parameters define the variables that will be used as active variable (for which the results will be presented) and the variables used as covariates (variables that will enter in the model but not in the results). Class of the variables in set can be changed using variable_types and covariable_types. Available types are categorical (factor), continuous (numeric) and the three genetic models (dominant, recessive and additive).

When variables are defined in this way, the linear model created is additive: all the variables are summed. It is also possible to use a linear model containing interaction and other more complex features using the equation parameter:

complexres <- DAPipeline(set = set, variable_names = c("status", "sex"),
                             variable_types = c("categorical", "categorical"), 
                             probe_method = "ls", num_var = 3, verbose = TRUE,
                             equation = "~ status:sex + status + sex")
complexres
## class: AnalysisResults 
## original class: MethylationSet 
## features(152): cg27069132 cg23896353 ... cg04407470 cg03661529
## samples(6): 5723646052_R02C02 5723646052_R04C01 ...
##   5723646053_R05C02 5723646053_R06C02
## variables:  status, sex 
## model variables names:  statusnormal, sexM, statusnormal:sexM 
## covariables: none 
## Number of bumps: 26257, 26476, 26799 
## Number of blocks: NULL, NULL, NULL 
## Number of regions: 0, 0, 0 
## Number of differentially methylated probes: 0, 152, 0

When using equation, number of active variables must be explicit. They will be selected from the left of the equation to the right. Model matrices are created using model.matrix function, so if we introduce interactions, they will be after the alone variables. In our example, status and sex both had two levels. Therefore, a dummy variable is created for each of the samples and the interaction is the third column. Consequently, num_var must be 3.

In addition, it should be noticed that variables used in interactions must be included alone in the equation and must be present in the variable_names arguments. Covariables can still be used by setting them in covariable_names, being added to the linear model.

5.1 Results access

There are several functions that allow to access analysis results:

#Bumphunter
head(bumps(res)[[1]])
##         chr     start       end     value      area cluster indexStart
## 23969  chr6  29521023  29521756 -2.286410 13.718458   21494      23809
## 24390  chr6 118228078 118228871 -3.790524 11.371572   22512      25102
## 23124  chr4 142054254 142054329 -4.827935  9.655870   19467      21552
## 16223 chr10   1779432   1780184 -3.143640  9.430920    2715       2987
## 16907 chr11  30607068  30607360 -4.664209  9.328417    4439       4905
## 21929 chr20  61340107  61340542 -3.080326  9.240979   16372      18133
##       indexEnd L clusterL
## 23969    23814 6        6
## 24390    25104 3        3
## 23124    21553 2        2
## 16223     2989 3        3
## 16907     4906 2        2
## 21929    18135 3        3
#BlockFinder
head(blocks(res)[[1]])
## [1] NA
#DMRcate
head(dmrCate(res)[[1]])
## data frame with 0 columns and 0 rows
#Probe
head(probeResults(res)[[1]])
##            intercept statusnormal        sd         t      P.Value
## cg25937714 0.7305902   -0.5912205 0.2677518 -15.18472 5.264155e-07
## cg06340552 0.6815428   -0.6019749 0.3304132 -14.01203 9.574154e-07
## cg20450979 0.4797533   -0.4153843 0.2784143 -13.44973 1.297019e-06
## cg21245277 0.6422945   -0.5370338 0.2942895 -13.36087 1.362233e-06
## cg13355248 0.8088785   -0.7467653 0.4490501 -13.35681 1.365300e-06
## cg19333963 0.7364919   -0.6581963 0.3888593 -12.96130 1.704865e-06
##              adj.P.Val chromosome  position                   genes
## cg25937714 0.005426774       chr3  44036492                        
## cg06340552 0.005426774       chr4 142054329           RNF150;RNF150
## cg20450979 0.005426774       chr4 176923542 GPM6A;GPM6A;GPM6A;GPM6A
## cg21245277 0.005426774       chr2 185463218         ZNF804A;ZNF804A
## cg13355248 0.005426774      chr17  78449872                   NPTX1
## cg19333963 0.005426774      chr19   1467979                    APC2
##                                  group
## cg25937714                            
## cg06340552               1stExon;5'UTR
## cg20450979 5'UTR;5'UTR;1stExon;1stExon
## cg21245277               1stExon;5'UTR
## cg13355248                     1stExon
## cg19333963                        Body
#Region
names(regionResults(res))
## [1] "DMRCate"     "Bumphunter"  "BlockFinder"

All these functions return a list, even if it contains only one data.frame. regionResults contains a list with the results of the three per region methods. Export of the results is simplified with the function exportResults.

exportResults(res, dir = "./results")

This function creates csv files with all the results. If more than one variable is present, a subfolder for each variable is created.

5.2 Plotting

AnalysisResults incorporates many plotting facilities. plotFeature plots the beta values distribution of a cpg. plotFeature accepts a number with the cpg index or character with the name of a cpg.

plotFeature(res, 1)
Figure 1: Beta values of cg25937714 splitted by cancer status

Figure 1: Beta values of cg25937714 splitted by cancer status

Probe results can be used to plot a QQ-plot and a Manhattan plot. In the second one, cpgs inside a range can be highlighted by passing a GenomicRanges object with the range of interest.

plotQQ(res)
Figure 2: QQplot of the analysis

Figure 2: QQplot of the analysis

range <- GRanges(seqnames = Rle("chr1"), 
                                ranges = IRanges(1000000, end = 10000000))
plotEWAS(res, range = range)
Figure 3: Manhattan plot with the cpgs of the range highlighted

Figure 3: Manhattan plot with the cpgs of the range highlighted

In figure 3, the red line of the Manhattan plot is the significance threshold using Bonferroni.

6 Range analysis

A study of a region can be performed with DARegionAnalysis. Options are very similar to that of DAPipeline. In this situation, status will be the active variable and age will be a covariable. A GenomicRange must be supplied in order to delimit the region.

range <- GRanges(seqnames = Rle("chr12"), 
                                ranges = IRanges(70000000, end = 80000000))
region <- DARegionAnalysis(set = set, variable_names = "status", 
                               variable_types = "categorical", 
                               covariable_names = "age", range = range, 
                               verbose = TRUE)
## [cpgCollapse] Creating annotation.
## [cpgCollapseAnnotation] Clustering islands and clusters of probes.
## [cpgCollapseAnnotation] Computing new annotation.
## [cpgCollapseAnnotation] Defining blocks.
## [cpgCollapse] Collapsing data
region
## class: AnalysisRegionResults 
## original class: MethylationSet 
## features(44): cg27175491 cg01585322 ... cg26488871 cg22403154
## samples(6): 5723646052_R02C02 5723646052_R04C01 ...
##   5723646053_R05C02 5723646053_R06C02
## variables:  status 
## model variables names:  status 
## covariables: age 
## Number of bumps: 41 
## Number of blocks: 0 
## Number of regions: 0 
## Number of differentially methylated probes: 12 
## Relevant snps(0):
## Snps Variance:  NA 
## Range:
##  Chr:  chr12     start:  70000000    end:  80000000 
## Rsquared:  0.544 
## P-value:  0.1

DARegionAnalysis generates a AnalysisRegionResults, an heir of AnalysisResults, so they share getter functions.

#Bumphunter
head(bumps(region)[[1]])
##      chr    start      end     value     area cluster indexStart indexEnd
## 38 chr12 72667493 72667493 -3.008385 3.008385      20         20       20
## 27 chr12 77756101 77756101  1.886755 1.886755      37         37       37
## 15 chr12 72783379 72783379  1.501490 1.501490      21         21       21
## 29 chr12 78637464 78637464  1.478663 1.478663      39         39       39
## 31 chr12 78883559 78883559  1.451280 1.451280      41         41       41
## 12 chr12 72335228 72335228  1.374072 1.374072      17         17       17
##    L clusterL
## 38 1        1
## 27 1        1
## 15 1        1
## 29 1        1
## 31 1        1
## 12 1        1
#BlockFinder
head(blocks(region)[[1]])
## data frame with 0 columns and 0 rows
#DMRcate
head(dmrCate(region)[[1]])
## data frame with 0 columns and 0 rows
#Probe
head(probeResults(region)[[1]])
##             intercept statusnormal        sd          t      P.Value
## cg11054631 0.81761393  -0.48185975 0.2550839 -12.343923 1.678910e-05
## cg20090301 0.30180744   0.36734187 0.2029024  10.971504 3.324549e-05
## cg15005307 0.81315966   0.11128128 0.2596716   5.742528 1.197601e-03
## cg24339512 0.49710411   0.22698746 0.2606640   5.404253 1.638293e-03
## cg18701449 0.48360360   0.22463092 0.2578897   5.328139 1.761337e-03
## cg04609875 0.08792067   0.08177152 0.2133828   5.080817 2.239940e-03
##               adj.P.Val chromosome position                     genes
## cg11054631 0.0007314008      chr12 72667493 LOC283392;TRHDE;LOC283392
## cg20090301 0.0007314008      chr12 77756101                          
## cg15005307 0.0154997623      chr12 72783379                     TRHDE
## cg24339512 0.0154997623      chr12 79622188            SYT1;SYT1;SYT1
## cg18701449 0.0154997623      chr12 72335228                      TPH2
## cg04609875 0.0156073812      chr12 70763703                    KCNMB4
##                           group
## cg11054631 TSS1500;Body;TSS1500
## cg20090301                     
## cg15005307                 Body
## cg24339512       Body;Body;Body
## cg18701449                 Body
## cg04609875                 Body
#Region
names(regionResults(region))
## [1] "DMRCate"     "Bumphunter"  "BlockFinder"

6.1 Plotting

Distribution of coefficients of the region can be plotted using the plotRegion function. .

plotRegion(region)
Figure 4: Plot of the differential methylation for each cpg of the region.

Figure 4: Plot of the differential methylation for each cpg of the region.

In figure 4, green points are probes with a p-value smaller than 0.05 while red points are probes with a p-value greater than 0.05. Green lines are set at 0.05, a minimal difference to be considered significant.

Besides probe and region analysis using only range’s probes, a redundancy analysis (RDA) is performed. RDA analysis measures the relation of the variables with the ensemble of cpgs. RDA results are printed whit the object, but a plot with the results can also be done with plotRDA.

plotRDA(region)
Figure 5: RDA plot of the region.

Figure 5: RDA plot of the region.

In figure 5, points represent samples grouped by the active variables. Red crosses are the cpgs and cpg names are the cpgs most correlated to the RDA axes.

7 SNPs Data

In our example, SNPs data was not available. An example with SNPs can be found in caseExample vignette.

References

Aryee, Martin J, Andrew E Jaffe, Hector Corrada-Bravo, Christine Ladd-Acosta, Andrew P Feinberg, Kasper D Hansen, and Rafael A Irizarry. 2014. “Minfi: a flexible and comprehensive Bioconductor package for the analysis of Infinium DNA methylation microarrays.” Bioinformatics (Oxford, England) 30 (10): 1363–9. doi:10.1093/bioinformatics/btu049.

Du, Pan, Warren A Kibbe, and Simon M Lin. 2008. “lumi: a pipeline for processing Illumina microarray.” Bioinformatics (Oxford, England) 24 (13): 1547–8. doi:10.1093/bioinformatics/btn224.

Du, Pan, Xiao Zhang, Chiang-Ching Huang, Nadereh Jafari, Warren A Kibbe, Lifang Hou, and Simon M Lin. 2010. “Comparison of Beta-value and M-value methods for quantifying methylation levels by microarray analysis.” BMC Bioinformatics 11 (January): 587. doi:10.1186/1471-2105-11-587.

Jaffe, Andrew E, Peter Murakami, Hwajin Lee, Jeffrey T Leek, M Daniele Fallin, Andrew P Feinberg, and Rafael A Irizarry. 2012. “Bump hunting to identify differentially methylated regions in epigenetic epidemiology studies.” International Journal of Epidemiology 41 (1): 200–209. doi:10.1093/ije/dyr238.

Peters, Timothy, Michael Buckley, Aaron Statham, Ruth Pidsley, Katherine Samaras, Reginald Lord, Susan Clark, and Peter Molloy. 2015. “De novo identification of differentially methylated regions in the human genome.” Epigenetics & Chromatin 8 (1): 6. doi:10.1186/1756-8935-8-6.


  1. More information can be found at this minfi tutorial