EventPointer is an R package to identify alternative splicing events that involve either simple (case-control experiment) or complex experimental designs such as time course experiments and studies including paired-samples. The algorithm can be used to analyze data from either junction arrays (Affymetrix Arrays) or sequencing data (RNA-Seq). The software returns a data.frame with the detected alternative splicing events: gene name, type of event (cassette, alternative 3’,…,etc), genomic position, statistical significance and increment of the percent spliced in (\(\Delta \Psi\)) for all the events. The algorithm can generate a series of files to visualize the detected alternative splicing events in IGV. This eases the interpretation of results and the design of primers for standard PCR validation.
EventPointer can be installed from Bioconductor using the following lines:
source("http://www.bioconductor.org/biocLite.R")
biocLite("EventPointer")
EventPointer R package provides users a simplified way to identify, classify and visualize alternative splicing events. The steps required by the algorithm are almost identical for both technologies. The algorithm only differs in its inital step.
Splicing Graph Creation The Splicing Graph (SG) is a directed graph used to represent the structure of a gene. EventPointer relies on SGSeq package to obtain the corresponding SGs for every gene present in the experiment. For arrays, the SG is built according to the reference transcriptome selected by the user and for RNA-Seq, it is created by predicting the features in the .bam files provided by the user.
Event Identification Once the graphs are created, EventPointer analyzes each SG in order to find the alternative splicing events. The definition of splicing events by EventPointer consists in a triplet of subgraphs (P1,P2 and PR) i.e. for a cassette exon, PR correspond to the flanking exons, P1 the junctions and exon, and P2 the junction that skips the exon. This is depicted in Figure 1.
Statistical Analysis With all the detected events, EventPointer performs a statistical analysis to obtain the statistical significance of every splicing event. Briefly, EventPointer considers there is a differential splicing event if the isoforms in the associated paths change their expression in opposite directions. Different statistical tests can be applied (see Advanced Use).
Visualization To ease the interpretation of the splicing events, EventPointer generates .gtf files that can be loaded into Integrative Genomcis Viewer (IGV). The visualization allows researchers to design primers to validated the detected events using standard PCR.
Figure 2 shows each of the main steps in a graphical layout.
This vignette is divided in two sections. In the first one, the complete analysis for junction arrays is described and the second one describes the analysis for RNA-Seq data.
To cite EventPointer:
Romero, Juan P., et al. “EventPointer: an effective identification of alternative splicing events using junction arrays.” BMC genomics 17.1 (2016): 467. doi:10.1186/s12864-016-2816-x
Romero, Juan P., et al Comparison on the ability to detect splicing events between RNAseq and HTAv2 (In preparation)
EventPointer is prepared to work with different Affymetrix arrays, such as: HTA 2.0, Clariom-D, RTA and MTA.
To build the CDF file (to work under the aroma.affymetrix framework), EventPointer requires a GTF file with the reference transcriptome information. In case not provided, the algorithm automatically downloads the required information from different databases such as ENSEMBL or UCSC. As the probes for the HTA 2.0 array are mapped to the HG19 genome, the latests versions of the ensembl and ucsc genome, mapped to the hg19 version, will be downloaded. For the other arrays, the following genomes are used: ClariomD = GRCh38, MTA = mm10 and RTA = rn6.
The required files are:
Files 1 and 2 contain probe information for the array. These files and the corresponding CDF files can be downloaded from the following URL: EventPointer Dropbox
The format of these files is briefly explained in the following paragraphs:
For the Exon Probes, the file corresponds to a tab separated .txt file composed of 11 columns that include: Probe Id, X coordinate in the array, Y coordinate in the array, Transcript Cluster Id, Probeset Id, Probeset name, Probe sequence, chromosome, start, end and strand.
The Junction probes file is also a tab separated .txt composed of 10 columns: Probe Id, X coordinate in the array, Y coordinate in the array, Transcript Cluster Id, Probeset Id, Probeset name, Probe sequence, chromosome and probe alignments.
For the GTF the standard format is used. (For more information see GTF)
This vignette uses the probes and annotation file for the DONSON gene in order to run the examples in a short amount of time. To generate the corresponding CDF file for the whole genome, the files from the Dropbox link must be used.
Note: It is advisable to work with reference GTF files, as the probes are annotated to them. However, if other database is used, the algorithm will only include probes that are mapped to such database.
This step can be skipped if the corresponding CDF file is doownloaded from the Dropbox link. The available CDF files were generated using the GTF files for each of the arrays, if users want to generate a CDF for other databases (Ensembl or UCSC), this step should be used.
The function CDFfromGTF generates the CDF file used afterwards in the aroma.affymetrix pre-processing pipeline. Internally, it calls flat2cdf function written by Elizabeth Purdom. More information about it can be seen in the following webpage: Create CDF from scratch
The required input for the function is described below:
This function takes a couple of hours to complete (depending on the computer), and creates the following files:
The following code chunks show examples on how to run the function using part of the Affymetrix GTF and the example data included in the package. This data corresponds to the Affymetrix HTA 2.0 GTF representing only the DONSON gene and the probes that are mapped to it.
Using Affymetrix GTF as reference transcriptome
# Set input variables
PathFiles<-system.file("extdata",package="EventPointer")
DONSON_GTF<-paste(PathFiles,"/DONSON.gtf",sep="")
PSRProbes<-paste(PathFiles,"/PSR_Probes.txt",sep="")
JunctionProbes<-paste(PathFiles,"/Junction_Probes.txt",sep="")
Directory<-tempdir()
array<-"HTA-2_0"
# Run the function
CDFfromGTF(input="AffyGTF",inputFile=DONSON_GTF,
PSR=PSRProbes,Junc=JunctionProbes,
PathCDF=Directory,microarray=array)
## Creating SG Information...
## Import genomic features from the file as a GRanges object ... OK
## Prepare the 'metadata' data frame ... OK
## Make the TxDb object ... OK
##
## Reading Information On Probes...Done
## Indexing Genes and Probes...Done
## Finding Events...
##
|
| | 0%
|
|===================================================================| 100%
##
## Creating .flat ...DoneReading TXT file ... Done.
## Splitting TXT file into units ... split into 1 initial chunks ... unwrapped into 12 chunks ... Done.
## Creating structure for 12 units (dot=250):
##
## Writing CDF file...
## Pathname: HTA-2_0.cdf
## Writes CDF header and unit names...
## Writes CDF header and unit names...done
## Writes QC units...
## Units left: 0
## Writes QC units...done
## Writes 12 units...
## Units left: 0
## Writes 12 units...done
## Writing CDF file...done
Note: Both the .flat and .CDF file take large amounts of space in the hard drive, it is recommended that the directory has at least 1.5 GB of free space.
Figure 3 shows a screen shot with the output of the CDFfromGTF function
Once the file is created, the name of the cdf file can be changed. Internally, the algorithm gives the name as HTA-2_0, but the actual name of the file can be different. In the rest of the vignette, we have renamed our CDF file as EP_HTA-2_0.
Once the CDF file has been created, it can be used for the analysis of different experiments.
For microarray data, a pre-processing pipeline must be applied to the .cel files of the experiment. Usually this pre-processing is done using the aroma.affymetrix R package. This procedure normalizes and summarizes the expression of the different probesets into single values.
The aroma.affymetrix R package provides users different functions to work with affymetrix arrays. The functions are used to extract all the information contained in the .cel files and to do all the required pre-processing steps such as background correction, normalization and summarization. The package requires a certain folder structure in order to work correctly. For more information about aroma.affymetrix visit the webpage:aroma project
The following code chunk displays the pipeline used to get the results required by EventPointer after the pre-processing using aroma.affymetrix. The code is not intended to be a runable example, but just to show users the settings and functions that can be used. In order for users to have a runable example, the corrrespoding folder structure and files are required.
# Simple example of Aroma.Affymetrix Preprocessing Pipeline
verbose <- Arguments$getVerbose(-8);
timestampOn(verbose);
projectName <- "Experiment"
cdfGFile <- "EP_HTA-2_0,r"
cdfG <- AffymetrixCdfFile$byChipType(cdfGFile)
cs <- AffymetrixCelSet$byName(projectName, cdf=cdfG)
bc <- NormExpBackgroundCorrection(cs, method="mle", tag=c("*","r11"));
csBC <- process(bc,verbose=verbose,ram=20);
qn <- QuantileNormalization(csBC, typesToUpdate="pm");
csN <- process(qn,verbose=verbose,ram=20);
plmEx <- ExonRmaPlm(csN, mergeGroups=FALSE)
fit(plmEx, verbose=verbose)
cesEx <- getChipEffectSet(plmEx)
ExFit <- extractDataFrame(cesEx, addNames = TRUE)
EventPointer is the main function of the algorithm
The function requires the following parameters:
If the Filter
variable is TRUE
, the following is performed:
The summarized expression value of all the reference paths is obtained and the threshold is set depending on the Qn
value used.
An event is considered if at least one sample in all paths is expressed above the threshold.
The rest of the events are not shown unless the Filter
variable is set to FALSE
data(ArraysData)
Dmatrix<-matrix(c(1,1,1,1,0,0,1,1),nrow=4,ncol=2,byrow=FALSE)
Cmatrix<-t(t(c(0,1)))
EventsFound<-paste(system.file("extdata",package="EventPointer"),"/EventsFound.txt",sep="")
Events<-EventPointer(Design=Dmatrix,
Contrast=Cmatrix,
ExFit=ArraysData,
Eventstxt=EventsFound,
Filter=FALSE,
Qn=0.25,
Statistic="LogFC",
PSI=TRUE)
## 09:17:24 PM Running EventPointer:
## ** Statistical Analysis: Logarithm of the fold change of both isoforms
## ** Delta PSI will be calculated
## ** No expression filter
## ----------------------------------------------------------------
## ** Calculating PSI...Done
## ** Running Statistical Analysis...Done
##
## 09:17:25 PM Analysis Completed
Table 1 displays the output of EventPointer function
Gene name | Event Type | Genomic Position | Splicing Z Value | Splicing Pvalue | Delta PSI | |
---|---|---|---|---|---|---|
TC21001058.hg_9 | TC21001058.hg | Complex Event | 21:34951868-34956896 | 7.16865 | 0 | -0.58200 |
TC21001058.hg_2 | TC21001058.hg | Complex Event | 21:34954361-34956896 | 6.82303 | 0 | 0.00000 |
TC21001058.hg_12 | TC21001058.hg | Complex Event | 21:34958487-34960627 | 6.33509 | 0 | -0.09482 |
TC21001058.hg_3 | TC21001058.hg | Complex Event | 21:34954552-34956896 | 6.11308 | 0 | -0.45633 |
TC21001058.hg_6 | TC21001058.hg | Complex Event | 21:34958487-34960627 | -6.08339 | 0 | 0.43586 |
The columns of the data.frame
are:
EventPointer creates two different GTF files to visualize the alternative splicing events. Figure 5 displays the cassette exon for the COPS7A gene (4th ranked event in Table 1). In the IGV visualization, the reference path is shown in gray color, the path 1 in red and path 2 in green. Below the transcripts, the different probes that are measuring each of the paths are represented in the same colors.
To create the GTF files, the algorithm uses the EventPointer_IGV functions with the following parameters:
The inital process of the function is slow, as the splicing graphs must be created every time the function is executed. A progress bar is displayed to the user to inform about the progress of the function.
Once the process is completed two GTF files are generated in the specified directory:
# Set Input Variables
DONSON_GTF<-paste(PathFiles,"/DONSON.gtf",sep="")
PSRProbes<-paste(PathFiles,"/PSR_Probes.txt",sep="")
JunctionProbes<-paste(PathFiles,"/Junction_Probes.txt",sep="")
Directory<-tempdir()
EventsFound<-paste(system.file("extdata",package="EventPointer"),"/EventsFound.txt",sep="")
array<-"HTA-2_0"
# Generate Visualization files
EventPointer_IGV(Events[1,,drop=FALSE],"AffyGTF",DONSON_GTF,PSRProbes,JunctionProbes,Directory,EventsFound,array)
## Creating SG Information...
## Import genomic features from the file as a GRanges object ... OK
## Prepare the 'metadata' data frame ... OK
## Make the TxDb object ... OK
##
## Reading Information On Probes...Done
## Indexing Genes and Probes...Done
## Generating GTF Files...
|
| | 0%
|
|===================================================================| 100%
The EventPointer paper states that the algorithm provides a function to identify the protein domains that are affected by alternative splicing using an enrichment analysis.
As we have updated the algorithm, we are currently working on the implementation of this feature in the newer version. As soon as it is implemented, it will be uploaded along with the vignette to show its use.
EventPointer is also able to identify alternative splicing events from RNA-Seq data. The only required files are the corresponding .BAM files from the experiment.
Each time an experiment is analyzed with EventPointer, the complete process needs to be executed which may cause long waiting times to get the results. To avoid this issue, we have divided every step of the algorithm in different functions so as the user can reuse previous result and thus reduce computational time.
For the examples in this part of the vignette, we will use .bam files depicted in the SGSeq vignette that correspond to paired-end RNA-seq data from four tumor and four normal colorectal samples, which are part of a data set published in Seshagiri et al. 2012. As stated in SGSeq vignette the bam files only include reads mapping to a single gene of interest (FBXO31).
Note: For sequencing data, there are two requirements for the BAM files in order to get EventPointer working correctly:
The BAM files should include the XS-flag, the flag can be included in the files when running the alignment. Most of the available software has parameters to incude the flag. For example, in the case of STAR the flag –outSAMattributes XS must be included when mapping
All files to be analyzed should have the corresponding index files (.bai) in the same directory as the BAM files. Create the index before running EventPointer.
The first step to analyze alternative splicing events in RNA-Seq data, is the creation of the splicing graphs. This step relies entirely on SGSeq R package.
The function PrepareBam_EP transforms all the information found in the bam files into splicing graph features and counts
# Obtain the samples and directory for .bam files
# the object si contains example sample information from the SGSeq R package
# use ?si to see the corresponding documentation
BamInfo<-si
Samples<-BamInfo[,2]
PathToSamples <- system.file("extdata/bams", package = "SGSeq")
PathToGTF<-paste(system.file("extdata",package="EventPointer"),"/FBXO31.gtf",sep="")
# Run PrepareBam function
SG_RNASeq<-PrepareBam_EP(Samples=Samples,
SamplePath=PathToSamples,
Ref_Transc="GTF",
fileTransc=PathToGTF,
cores=1)
The output of PrepareBam_EP function is a SGFeaturesCounts object, for more information check SGSeq Vignette. Briefly the SGFeaturesCounts contains a GRanges object with all the required elements to create the different splicing graphs found in the given samples. It also contains the number of counts associated with each element of the splicing graph.
After running PrepareBam_EP, we have all the elements to analyze each of the splicing graphs. The next step is to identify and classify all the events, that are present in the BAM files.
For this purpose, the function EventDetection is used.
# Run EventDetection function
data(SG_RNASeq)
TxtPath<-tempdir()
AllEvents_RNASeq<-EventDetection(SG_RNASeq,cores=1,Path=TxtPath)
##
## Obtaining Events
|
| | 0%
|
|=========== | 17%
|
|====================== | 33%
|
|================================== | 50%
|
|============================================= | 67%
|
|======================================================== | 83%
|
|===================================================================| 100%
This function retireves a list with all the events found for all the genes present in the experiment. It also generates a file called EventsFound_RNASeq.txt with the information for every detected event.
The list is organized in the following way:
Events[[i]][[j]]
The list will have as many \(i\) values as genes and \(j\) values as many events detected for the \(i_{th}\) gene. In other words, the command above will display the \(j_{th}\) event detected for the \(i_{th}\) gene.
The statistical analysis of the alternative splicing events is done in exactly the same way as for junction arrays. With the Design and Contrast matrices, the algorithm gives the statistical significance and \(\Delta \Psi\).
The function for the statistical analysis using EventPointer method.
The algorithm displays the different parameters that are selected to perform the analysis.
Following our example, the code chunk to obtain the results:
Dmatrix<-matrix(c(1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1),ncol=2,byrow=FALSE)
Cmatrix<-t(t(c(0,1)))
Events <- EventPointer_RNASeq(AllEvents_RNASeq,Dmatrix,Cmatrix,Statistic="LogFC",PSI=TRUE)
## 09:17:31 PM Running EventPointer:
## ** Statistical Analysis: Logarithm of the fold change of both isoforms
## ** Delta PSI will be calculated
## ----------------------------------------------------------------
## ** Calculating PSI...Done
## Analysis Finished
## Done
##
## 09:17:31 PM Analysis Completed
Table 2 displays the output of EventPointer function
Gene | Event_Type | Position | Pvalue | Zvalue | Delta PSI | |
---|---|---|---|---|---|---|
3_17 | TC16001330.hg | Alternative Last Exon | 16:87423454-87445125 | 0.03439 | 2.11544 | -1.00000 |
3_6 | TC16001330.hg | Complex Event | 16:87377272-87380780 | 0.09905 | 1.64946 | -0.01428 |
3_2 | TC16001330.hg | Alternative 5’ Splice Site | 16:87369063-87369767 | 0.10470 | 1.62248 | -0.01800 |
3_7 | TC16001330.hg | Complex Event | 16:87369867-87377343 | 0.11808 | -1.56287 | 0.00817 |
3_14 | TC16001330.hg | Cassette Exon | 16:87380856-87393901 | 0.17744 | 1.34868 | -0.24374 |
EventPointer creates one GTF file that can be loaded into IGV to visualize the alternative splicing events. Figure 8 displays an example result showed in IGV (5th ranked event in Table 2). Also, in the figure a reference transcriptome is displayed (blue track), and it can be seen that the displayed event corresponds to a novel event discovered with sequencing data and that it will not be detected using junction arrays.
To create the GTF files, the algorithm uses the following code.
A progress bar is displayed to the user to inform about the progress of the function.
Once the process is completed the GTF file is generated in the specified directory:
# IGV Visualization
EventsTxt<-paste(system.file("extdata",package="EventPointer"),"/EventsFound_RNASeq.txt",sep="")
PathGTF<-tempdir()
EventPointer_RNASeq_IGV(Events,SG_RNASeq,EventsTxt,PathGTF)
##
## Generating GTF Files...
|
| | 0%
|
|==== | 6%
|
|======== | 12%
|
|============ | 18%
|
|================ | 24%
|
|==================== | 29%
|
|======================== | 35%
|
|============================ | 41%
|
|================================ | 47%
|
|=================================== | 53%
|
|======================================= | 59%
|
|=========================================== | 65%
|
|=============================================== | 71%
|
|=================================================== | 76%
|
|======================================================= | 82%
|
|=========================================================== | 88%
|
|=============================================================== | 94%
|
|===================================================================| 100%
EventPointer provides three different statistical tests that can be used to determine the statistical significance to the alternative splicing events.
In Table 3, the most relevatn coefficients from the statistical and events information point of view are shown
There are a number of alternatives to detect AS using these coefficients. Either of \(\beta_4\) , \(\beta_5\) , \(\beta_4\) + \(\beta_5\) is theoretically able to detect AS events. Some of them are more sensitive than others depending on the relative concentrations of the isoforms. For example, if isoform 2 is much more highly expressed than isoform 1 in both conditions, \(\beta_4\) will be more sensitive than \(\beta_4\) + \(\beta_5\) since in the latter case, the numerator and denominator of the logarithms of both terms are similar, and hence their logs are close to zero.
A contrast on \(\beta_5\) would seem to be more sensitive than a contrast on \(\beta_4\) or \(\beta_4\) + \(\beta_5\) ; however, in practice, this contrast proved to be “too sensitive” and led to many false positives especially in weakly expressed isoforms. If one of the paths is not expressed in any condition, its signal will be similar in either condition (the background level) and a change in the expression of the other isoform will drive to a false positive detection. This contrast can be used only if the signals are filtered to guarantee that they are above the background.
In the PCR validation, the contrast that provided the best performance was the combination of the fold changes of both isoforms (i.e. \(\beta_3\) + \(\beta_4\) and \(\beta_3\)+\(\beta_4\) + \(\beta_5\) in Table 4) plus the requirement that the fold-changes have opposite directions, i.e. if isoform 1 significantly increases its expression, isoform 2 must significantly decrease its expression and vice versa. Therefore, if this test requires that the detected AS events show a significant change of the expression both paths and this change must be in opposite direction.
In order to compute this contrast, we summed up the p-values (one-tailed) for both contrasts. If the null hypothesis holds, the expected null distribution is triangular from 0 to 2 with the peak at 1, and the summation of the p-values must be close to 0 or close to 2 for genes with differential AS. Using this triangular distribution, it is possible to assign an overall p-value to their sum. We preferred this combination rather than the classical Fisher method since in the latter a single good p-value yields a good summary p-value for the event. Using this approach, both p-values must be close to zero or one in order to generate a significant overall p-value.
The different options availabe in EventPointer are:
1. LogFC : Compute the contrast using \(\beta_3\) + \(\beta_4\) and \(\beta_3\)+\(\beta_4\) + \(\beta_5\)
2. Dif_LogFC : Compute the contrast using \(\beta_4\) and \(\beta_4\) + \(\beta_5\)
3. DRS: Compute the constast using \(\beta_5\)
Alpha is a parameter used by SGSeq R package to predict the features that are along the different bam files that are being analyzed. As stated in the help menu for the predictTxtFeatures function:
Alpha Minimum FPKM required for a splice junction to be included.
The user can change the value to be more or less restrictive when deciding if a feature is included or not. As the alpha value increases, the algorithm will slow down as the splicing graphs would became more complex.
EventPointer estimates the abundance of the isoforms mapped to each of the paths, in an splicing event, to obtain the PSI values. With this values, a simple linear model, using the provided design and contrast matrices, is solved and this increment is returned to the user in the data.frame (if PSI argument is TRUE).
It is possible to obtain the estimated PSI values using the following commands:
# Microarrays
data(ArraysData)
PSI_Arrays<-EventPointer:::getPSI(ArraysData)
# RNASeq
data(AllEvents_RNASeq)
PSI_RNASeq<-EventPointer:::getPSI_RNASeq(AllEvents_RNASeq)
sessionInfo()
## R version 3.4.2 (2017-09-28)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 16.04.3 LTS
##
## Matrix products: default
## BLAS: /home/biocbuild/bbs-3.6-bioc/R/lib/libRblas.so
## LAPACK: /home/biocbuild/bbs-3.6-bioc/R/lib/libRlapack.so
##
## locale:
## [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
## [3] LC_TIME=en_US.UTF-8 LC_COLLATE=C
## [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
## [7] LC_PAPER=en_US.UTF-8 LC_NAME=C
## [9] LC_ADDRESS=C LC_TELEPHONE=C
## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
##
## attached base packages:
## [1] stats4 parallel stats graphics grDevices utils datasets
## [8] methods base
##
## other attached packages:
## [1] EventPointer_1.2.0 Matrix_1.2-11
## [3] SGSeq_1.12.0 SummarizedExperiment_1.8.0
## [5] DelayedArray_0.4.0 matrixStats_0.52.2
## [7] Biobase_2.38.0 Rsamtools_1.30.0
## [9] Biostrings_2.46.0 XVector_0.18.0
## [11] GenomicRanges_1.30.0 GenomeInfoDb_1.14.0
## [13] IRanges_2.12.0 S4Vectors_0.16.0
## [15] BiocGenerics_0.24.0 knitr_1.17
## [17] BiocStyle_2.6.0
##
## loaded via a namespace (and not attached):
## [1] Rcpp_0.12.13 lattice_0.20-35
## [3] prettyunits_1.0.2 assertthat_0.2.0
## [5] rprojroot_1.2 digest_0.6.12
## [7] foreach_1.4.3 R6_2.2.2
## [9] nnls_1.4 backports_1.1.1
## [11] RSQLite_2.0 evaluate_0.10.1
## [13] highr_0.6 zlibbioc_1.24.0
## [15] rlang_0.1.2 GenomicFeatures_1.30.0
## [17] progress_1.1.2 blob_1.1.0
## [19] RUnit_0.4.31 rmarkdown_1.6
## [21] splines_3.4.2 RMySQL_0.10.13
## [23] BiocParallel_1.12.0 stringr_1.2.0
## [25] igraph_1.1.2 RCurl_1.95-4.8
## [27] bit_1.1-12 biomaRt_2.34.0
## [29] compiler_3.4.2 rtracklayer_1.38.0
## [31] pkgconfig_2.0.1 htmltools_0.3.6
## [33] tibble_1.3.4 GenomeInfoDbData_0.99.1
## [35] prodlim_1.6.1 bookdown_0.5
## [37] codetools_0.2-15 XML_3.98-1.9
## [39] GenomicAlignments_1.14.0 MASS_7.3-47
## [41] bitops_1.0-6 grid_3.4.2
## [43] RBGL_1.54.0 DBI_0.7
## [45] magrittr_1.5 graph_1.56.0
## [47] stringi_1.1.5 doParallel_1.0.11
## [49] limma_3.34.0 lava_1.5.1
## [51] iterators_1.0.8 tools_3.4.2
## [53] bit64_0.9-7 survival_2.41-3
## [55] yaml_2.1.14 AnnotationDbi_1.40.0
## [57] memoise_1.1.0 affxparser_1.50.0