1 Overview

Previous studies using bulk RNA-seq have revealed dynamics APA and widespread 3?? UTR shortening during mouse spermatogenesis. Recently, Shulman et al. also analyzed APA modulation during spermatogenesis using a scRNA-seq dataset (Shulman and Elkon, 2019). Here we investigated the application of scAPAtrap on the analysis of dynamic APA usage during sperm cell differentiation using the mouse spermatogenesis scRNA-seq data. We focused on three stages of differentiation process as in the previous study, including early stage (spermatocytes, SC), intermediate stage (round spermatids, RS), and late stage (elongating spermatids, ES).

For simplicity, poly(A) site in this vignette is collectively referred to as PAC.

1.1 Preparations

1.1.1 Load R package

library(ggplot2)
library(reshape2)
library(ggsci)
library(movAPA)
library(umap)
require("knitr")

1.1.2 Load data

First we load poly(A) sites identified with scAPAtrap and filter sites in 3’ UTR or extended 3’ UTR regions.

load("file_path/scAPAtrapds.rda")
scAPAtrapds3UTR <- scAPAtrapds[scAPAtrapds@anno$ftr=='3UTR',]

1.1.3 Normalizaton

Before analyzing APA dynamics between cell types, we normalize the data using the DESeq2 method and filter poly(A) sites with total counts>=50.

scAPAtrapds3UTRNorm = normalizePACds(scAPAtrapds3UTR, method = "DESeq2")
## converting counts to integer mode
scAPAtrapds3UTRNormFlt = subsetPACds(scAPAtrapds3UTRNorm, totPACtag = 50, 
                                     choosePA = NULL, noIntergenic = TRUE, 
                                     verbose = TRUE)
##                      txt
## before subsetPACds 17998
## noItg              17998
## totPACtag>=50      12247

2 Analyses of APA dynamics

2.1 Detecting DE PACs

To detect DE PACs, we adopted the movAPA package. For detailed usage of movAPA toolkit, please refer to link.

Here we used the DESeq2 strategy provided in movAPA by function movDEPAC to identify DE PACs between samples.

DEPAC = movDEPAC(scAPAtrapds3UTRNormFlt, method = "DESeq2", 
                 group = "CellType", minSumPAT = 50)
## converting counts to integer mode
## using pre-existing size factors
## estimating dispersions
## gene-wise dispersion estimates
## mean-dispersion relationship
## -- note: fitType='parametric', but the dispersion trend was not well captured by the
##    function: y = a/x + b, and a local regression fit was automatically substituted.
##    specify fitType='local' or 'mean' to avoid this message next time.
## final dispersion estimates
## fitting model and testing
## -- replacing outliers and refitting for 19 genes
## -- DESeq argument 'minReplicatesForReplace' = 7 
## -- original counts are preserved in counts(dds)
## estimating dispersions
## fitting model and testing
## levels= ES RS SC

Make statistics of the DE PAC result.

DEPACStat = movStat(object = DEPAC, padjThd = 0.05, valueThd = 1)
## All cond pairs in heat@colData, get de01 and deNum
DEPACStat$nsig
##       sig.num
## SC.RS    2702
## SC.ES    4516
## RS.ES    2494
head(DEPACStat$siglist[[1]])
## [1] "PA47162" "PA47167" "PA47171" "PA45901" "PA47222" "PA46054"

Draw a histogram of the number of DE PACs

nsig <- DEPACStat$nsig
nsig$method <- rownames(nsig)

ggplot(nsig) + aes(x = method, fill = method, 
                   colour = method, weight = sig.num)+ 
                   geom_bar() + scale_fill_nejm() + 
                   scale_color_nejm() + theme()

2.2 Detecting 3’UTR switching genes

Next we used movAPA to detect 3’UTR switching (or 3’UTR shortening/lengthening) events. First we filter only proximal and distal PACs in 3’UTR, and detect DE PACs using DESeq2 method for genes with total counts>=50.

scAPAtrapds3UTRNormFlt2 = get3UTRAPAds(scAPAtrapds3UTRNormFlt, 
                                       sortPA = TRUE,choose2PA = "PD")
## DE PAC using DEseq2 method for genes with total counts>=50
DEPAC1 = movDEPAC(scAPAtrapds3UTRNormFlt2, method = "DESeq2", 
                  group = "CellType", minSumPAT = 50)
## converting counts to integer mode
## using pre-existing size factors
## estimating dispersions
## gene-wise dispersion estimates
## mean-dispersion relationship
## -- note: fitType='parametric', but the dispersion trend was not well captured by the
##    function: y = a/x + b, and a local regression fit was automatically substituted.
##    specify fitType='local' or 'mean' to avoid this message next time.
## final dispersion estimates
## fitting model and testing
## -- replacing outliers and refitting for 2 genes
## -- DESeq argument 'minReplicatesForReplace' = 7 
## -- original counts are preserved in counts(dds)
## estimating dispersions
## fitting model and testing
## levels= ES RS SC
# get DE PACs with padj<0.05 and log2FC>=1
DEPACStat1 = movStat(object = DEPAC1, padjThd = 0.05, valueThd = 1)
## All cond pairs in heat@colData, get de01 and deNum
DEPACStat1$nsig
##       sig.num
## SC.RS     787
## SC.ES    1327
## RS.ES     720
head(DEPACStat$siglist[[1]])
## [1] "PA47162" "PA47167" "PA47171" "PA45901" "PA47222" "PA46054"

If more than one switching pair was found in a gene, all pairs of PACs will be returned.

switchingDE1 = movAPAswitch(PACds = scAPAtrapds3UTRNormFlt2, 
                            group = "CellType",avgPACtag = 0, 
                            avgGeneTag = 0, only3UTR = TRUE, 
                            mergeReps = "pool", aMovDEPACRes = DEPAC1,
                            DEPAC.padjThd = 0.05, nDEPAC = 1,
                            mindist = 50, fisherThd = 0.05, logFCThd = 0.5, 
                            cross = FALSE, selectOne = NULL)
## SC.RS 
## SC.ES 
## RS.ES

Get 3’UTR switching results.

switchingDEStat1 = movStat(object = switchingDE1, padjThd = 0.05, 
                           valueThd = 0, upThd = NULL, dnThd = NULL)
## All cond pairs in heat@colData, get de01 and deNum
switchingDEStat1$nsig
##       sig.num
## SC.RS     989
## SC.ES     956
## RS.ES     644

2.3 Visualizing the proximal and distal PAC usage

First we pool cells of the same cell type together.

scAPAtrapds3UTRNormFlt2Pool <- subsetPACds(scAPAtrapds3UTRNormFlt2, group = "CellType", pool = TRUE)
counts <- dplyr::mutate(scAPAtrapds3UTRNormFlt2Pool@counts,
                        gene = scAPAtrapds3UTRNormFlt2Pool@anno$gene)
.plotSwitchPoint <- function(x,y,flag,main){
xInd=which(x >y & flag == 1)
yInd=which(x <= y & flag == 1)
xlab=paste('distal')
ylab=paste('proximal')
text1 = paste0('n=',length(xInd))
text2 = paste0('m=',length(yInd))
plot(x,y,xlab=xlab,ylab=ylab,main=main,pch=20,col='grey',cex.main=0.8)
lines(x=x[xInd],y=y[xInd],type='p',col='blue',pch=20)  
lines(x=x[yInd],y=y[yInd],type='p',col='red',pch=20) 
abline(a=0,b=1,lty=3)
text(min(x)+1,max(y)-1, text2)
text(max(x)-1,min(y)+1,text1)
}
# SC.RS
name <- c('gene','SC','RS')
subcount <- counts[,name]
subcountgb <- dplyr::group_by(subcount,gene) %>% summarise(x = log2((RS[1] + 1)/(SC[1] + 1)),
                                                               y = log2((RS[2] + 1)/(SC[2] + 1)))
## `summarise()` ungrouping output (override with `.groups` argument)
subcountgb$flag <- 0
subcountgb$flag[subcountgb$gene %in% switchingDEStat1$siglist$SC.RS] <- 1

.plotSwitchPoint(subcountgb$x,subcountgb$y,subcountgb$flag,'RS~SC')

# SC.ES
name <- c('gene','SC','ES')
subcount <- counts[,name]
subcountgb <- dplyr::group_by(subcount,gene) %>% summarise(x = log2((ES[1] + 1)/(SC[1] + 1)),
                                                               y = log2((ES[2] + 1)/(SC[2] + 1)))
## `summarise()` ungrouping output (override with `.groups` argument)
subcountgb$flag <- 0
subcountgb$flag[subcountgb$gene %in% switchingDEStat1$siglist$SC.ES] <- 1
    
.plotSwitchPoint(subcountgb$x,subcountgb$y,subcountgb$flag,'ES~SC')

# RS.ES
name <- c('gene','RS','ES')
subcount <- counts[,name]
subcountgb <- dplyr::group_by(subcount,gene) %>% summarise(x = log2((RS[1] + 1)/(ES[1] + 1)),
                                                               y = log2((RS[2] + 1)/(ES[2] + 1)))
## `summarise()` ungrouping output (override with `.groups` argument)
subcountgb$flag <- 0
subcountgb$flag[subcountgb$gene %in% switchingDEStat1$siglist$RS.ES] <- 1
    
.plotSwitchPoint(subcountgb$x,subcountgb$y,subcountgb$flag,'RS~ES')

2.4 Distal PAC’s RUD index

Here we calculate RUD (relative usage of distal PAC) index of each APA gene for each cell type.

rud = movAPAindex(scAPAtrapds3UTRNormFlt2Pool, method = "RUD")
.plotCumm <- function(data) {
    tidy.ppui <- tidyr::gather(data = data)
    colnames(tidy.ppui) <- c("Cluster", "value")
    p <- ggplot(data = tidy.ppui, aes(x = value, color = Cluster)) + 
                scale_fill_nejm() + scale_color_nejm() + 
                stat_ecdf(size = 1) + theme() + 
                xlab("Distal peak usage index") + ylab("Cumulative fraction") +
                ggplot2::coord_cartesian(xlim = c(0, 1))
    print(p)
}
sum(!is.nan(as.matrix(rud)))
## [1] 5917
sum(is.nan(as.matrix(rud)))
## [1] 17
.plotCumm(rud)

Next we overlay the RUD values to corresponding cells. First we need to load the UMAP coordinates of each cell calculated according to the gene expression matrix. This result can be downloaded from this link.

## load('the_file_path/sperm_ump.RDA')
head(speram_ump)
##                      UMAP_1    UMAP_2
## AAACCTGAGCTTATCG  -5.130878  7.727019
## AAACCTGGTTGAGTTC  -4.101278 10.365716
## AAACCTGTCAACGAAA  -9.353028 -0.659838
## AAACGGGCACAGGTTT  -9.505518 -1.455344
## AAACGGGTCATTTGGG -11.420073 -6.341019
## AAACGGGTCCTCATTA -12.020834 -5.821190

then calculate RUD index of each APA gene for each cell.

rud = movAPAindex(scAPAtrapds3UTRNormFlt, method = "RUD")
head(rud[1:5, 1:5])
##           AAACCTGAGAGGGCTT AAACCTGAGCTTATCG AAACCTGCATACGCCG AAACCTGGTTGAGTTC AAACCTGTCAACGAAA
## 100034361              NaN              NaN              NaN              NaN              NaN
## 100037258              NaN              NaN              NaN              NaN              NaN
## 100039043              NaN        0.3333333        0.2500000        0.5000000        0.3333333
## 100040894        0.0000000        0.3750000        0.6666667        0.3333333        0.2500000
## 100041586        0.1494253        0.1797753        0.0877193        0.1855670        0.1098901
sum(!is.nan(as.matrix(rud))) 
## [1] 1759374
sum(is.nan(as.matrix(rud)))
## [1] 2279702

Finally, we plot the RUD value of each cell.

scAPAtrapds3UTRNormFlt@colData$group <- scAPAtrapds3UTRNormFlt@colData$Barcode
plotindex <- function(index,title,ds,ump){
temp <- colMeans(index,na.rm = TRUE)

meanindex <- data.frame(Mean_proximal_Index = temp)
meanindex$group <- rownames(meanindex)
colnames(meanindex)[1] <- paste0("Mean Proximal ",title)
ump <- as.data.frame(ump)
ump$group <- rownames(ump)
tsne <- merge(ds@colData, meanindex, by.x = "group")
ump <- merge(tsne,ump,by.x = "group")
library(scales)
require(gridExtra)

colnames(tsne)[2:4] <- c("Cell Cluster", "tsne1", "tsne2")
p <-ggplot(ump, ggplot2::aes(x = UMAP_1, 
                             y = UMAP_2, 
                             color = `Mean Proximal RUD`)) +
                             geom_point(size=0.8) + xlab("UMAP1") + 
                             ylab("UMAP2") + theme() +  
                             scale_color_gradientn(colours = c(muted("blue"), "grey",muted("brown")))+
                             ggtitle(colnames(meanindex)[1]) + 
                             theme(legend.position="bottom")
g <- ggplot(ump,ggplot2::aes(x = UMAP_1, 
                             y = UMAP_2,
                             color = `CellType`)) +
                             ggplot2::geom_point(size=0.8) + xlab("UMAP1") + 
                             ylab("UMAP2") + theme() + 
                             ggtitle("UMAP cell clusters") + 
                             scale_fill_nejm() +
                             scale_color_nejm() +
                             theme(legend.position="bottom")
gridExtra::grid.arrange(g, p, nrow = 1)
}
plotindex(rud, "RUD", scAPAtrapds3UTRNormFlt, speram_ump)

3 APA profile of NDE genes distinguishes cell types

First, we detect DE genes using DESeq2 method for genes with total counts>=50.

DEGene <- movDEGene(scAPAtrapds3UTRNormFlt, group = "CellType", method = "DeSeq2", minSumPAT = 50)
## converting counts to integer mode
## using pre-existing size factors
## estimating dispersions
## gene-wise dispersion estimates
## mean-dispersion relationship
## -- note: fitType='parametric', but the dispersion trend was not well captured by the
##    function: y = a/x + b, and a local regression fit was automatically substituted.
##    specify fitType='local' or 'mean' to avoid this message next time.
## final dispersion estimates
## fitting model and testing
## -- replacing outliers and refitting for 14 genes
## -- DESeq argument 'minReplicatesForReplace' = 7 
## -- original counts are preserved in counts(dds)
## estimating dispersions
## fitting model and testing
## levels= ES RS SC

Make statistics of the DE Genes result from the Deseq2 method.

DEGenestat <- movStat(DEGene, padjThd = 0.01, valueThd = 0.5)
## All cond pairs in heat@colData, get de01 and deNum
DEGenestat$nsig
##       sig.num
## SC.RS    3978
## SC.ES    4723
## RS.ES    3487

Then we filter non-DE genes according to the calculated DE genes

DEgene <- union(union(DEGenestat$siglist$SC.RS, DEGenestat$siglist$SC.ES), DEGenestat$siglist$RS.ES)  
NDEgene <- unique(scAPAtrapds3UTRNormFlt@anno$gene[!scAPAtrapds3UTRNormFlt@anno$gene %in% DEgene])
length(DEgene);length(NDEgene)
## [1] 5395
## [1] 3868

Make the UMAP plot based on PAC expressions of NDE genes.

library(umap)
C1 <- scAPAtrapds3UTRNormFlt@counts[scAPAtrapds3UTRNormFlt@anno$gene %in% NDEgene, ]

C1 <- t(as.matrix(C1))
C1.umap <- umap(C1)
C1.umap <- as.data.frame(C1.umap$layout)
C1.umap$group <- rownames(C1.umap)
C1.umap <- merge(scAPAtrapds3UTRNormFlt@colData, C1.umap, by.x = "group")
ggplot(C1.umap, ggplot2::aes(x = V1, y = V2, color = CellType)) + 
                ggplot2::geom_point(size = 2) + xlab("UMAP1") + ylab("UMAP2") + 
                theme() + ggtitle("UMAP cell clusters") + 
                scale_fill_nejm() + scale_color_nejm() + 
                theme(legend.position = "bottom")

4 An example gene

Take the Odf4 gene for example, which a testis-specific gene encoding a protein located in the outer dense fibers of the mature sperm tail. Odf4 is known to play an important role in sperm tails and two alternative splice variants were found in this gene. According to the total expression level of the whole gene, Odf4 is consistently expressed in the three stages. Two poly(A) sites were detected in the 3?? UTR and extended 3?? UTR of this gene by scAPAtrap, and the usage of the distal poly(A) site denoted by RUD score is varied across stages. The read coverage of the distal poly(A) site in this gene is increased from SC to ES, suggesting the APA dynamics of 3?? UTR shortening during mouse spermatogenesis.

uniqcounts <- scAPAtrapds3UTRNormFlt[scAPAtrapds3UTRNormFlt@anno$gene == "252868", ]

unique_rud = movAPAindex(uniqcounts, method = "RUD")
unique_rud = t(unique_rud)

unique_rud <- data.frame(unique_rud = unique_rud, celltype = scAPAtrapds3UTRNormFlt@colData$CellType)

colnames(unique_rud) <- c("RUD", "celltype")
unique_rud <- subset(unique_rud, !is.na(RUD))

ggplot(unique_rud) + aes(x = celltype, y = RUD, fill = celltype, colour = celltype) + 
                     geom_violin(adjust = 1L, scale = "width") + 
                     scale_fill_nejm() + scale_color_nejm() + 
                     ylab("RUD") + theme()

uniqcounts.g <- log2(uniqcounts@counts[1, ] + uniqcounts@counts[2, ] + 1)

uniqcounts.g <- t(uniqcounts.g)
uniqcounts.g <- data.frame(counts = uniqcounts.g, celltype = scAPAtrapds3UTRNormFlt@colData$CellType)
colnames(uniqcounts.g) <- c("gene", "celltype")

group_by(uniqcounts.g,celltype) %>% summarise(count= sum(gene)/n())
## `summarise()` ungrouping output (override with `.groups` argument)
## # A tibble: 3 x 2
##   celltype count
##   <fct>    <dbl>
## 1 ES        1.97
## 2 RS        2.39
## 3 SC        2.31
ggplot(uniqcounts.g) + aes(x = celltype, y = gene, fill = celltype, colour = celltype) + 
                       geom_violin(adjust = 1L, scale = "width") + 
                       scale_fill_nejm() + scale_color_nejm() + 
                       ylab("log2(count)") + theme()

group_by(uniqcounts.g,celltype) %>% summarise(count= sum(gene)/n())
## `summarise()` ungrouping output (override with `.groups` argument)
## # A tibble: 3 x 2
##   celltype count
##   <fct>    <dbl>
## 1 ES        1.97
## 2 RS        2.39
## 3 SC        2.31
group_by(unique_rud,celltype) %>% summarise(count= sum(RUD)/n())
## `summarise()` ungrouping output (override with `.groups` argument)
## # A tibble: 3 x 2
##   celltype count
##   <fct>    <dbl>
## 1 ES       0.102
## 2 RS       0.182
## 3 SC       0.337

5 Session Information

The session information records the versions of all the packages used in the generation of the present document.

sessionInfo()
## R version 3.6.3 (2020-02-29)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 18362)
## 
## Matrix products: default
## 
## locale:
## [1] LC_COLLATE=Chinese (Simplified)_China.936  LC_CTYPE=Chinese (Simplified)_China.936    LC_MONETARY=Chinese (Simplified)_China.936
## [4] LC_NUMERIC=C                               LC_TIME=Chinese (Simplified)_China.936    
## 
## attached base packages:
## [1] stats4    parallel  stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] umap_0.2.6.0                gridExtra_2.3               scales_1.1.1                BiocStyle_2.14.4           
##  [5] knitr_1.29                  gdtools_0.2.2               eoffice_0.1.9               forcats_0.5.0              
##  [9] ggsci_2.9                   movAPA_0.1.0                DEXSeq_1.32.0               DESeq2_1.26.0              
## [13] SummarizedExperiment_1.16.1 DelayedArray_0.12.3         BiocParallel_1.20.1         matrixStats_0.56.0         
## [17] GenomicFeatures_1.38.2      AnnotationDbi_1.48.0        Biobase_2.46.0              ggbio_1.34.0               
## [21] BSgenome_1.54.0             rtracklayer_1.46.0          Biostrings_2.54.0           XVector_0.26.0             
## [25] ggplot2_3.3.2               data.table_1.12.8           RColorBrewer_1.1-2          GenomicRanges_1.38.0       
## [29] GenomeInfoDb_1.22.1         IRanges_2.20.2              S4Vectors_0.24.4            BiocGenerics_0.32.0        
## [33] reshape2_1.4.4              dplyr_1.0.0                
## 
## loaded via a namespace (and not attached):
##   [1] rsvd_1.0.3                 vcd_1.4-7                  Hmisc_4.4-0                ica_1.0-2                  class_7.3-17              
##   [6] Rsamtools_2.2.3            lmtest_0.9-37              crayon_1.3.4               laeken_0.5.1               MASS_7.3-51.6             
##  [11] nlme_3.1-148               backports_1.1.7            rlang_0.4.6                ROCR_1.0-11                readxl_1.3.1              
##  [16] irlba_2.3.3                limma_3.42.2               smoother_1.1               flextable_0.5.10           bit64_0.9-7               
##  [21] glue_1.4.1                 sctransform_0.2.1          devEMF_3.7                 haven_2.3.1                tidyselect_1.1.0          
##  [26] rio_0.5.16                 fitdistrplus_1.1-1         XML_3.99-0.3               tidyr_1.1.0                zoo_1.8-8                 
##  [31] GenomicAlignments_1.22.1   xtable_1.8-4               RcppHNSW_0.2.0             magrittr_1.5               evaluate_0.14             
##  [36] cli_2.0.2                  zlibbioc_1.32.0            hwriter_1.3.2              rstudioapi_0.11            miniUI_0.1.1.1            
##  [41] sp_1.4-2                   rpart_4.1-15               ensembldb_2.10.2           RcppEigen_0.3.3.7.0        shiny_1.5.0               
##  [46] xfun_0.15                  askpass_1.1                multtest_2.42.0            cluster_2.1.0              pcaMethods_1.78.0         
##  [51] tibble_3.0.1               ggrepel_0.8.2              biovizBase_1.34.1          ape_5.4                    listenv_0.8.0             
##  [56] png_0.1-7                  reshape_0.8.8              future_1.17.0              withr_2.2.0                bitops_1.0-6              
##  [61] RBGL_1.62.1                ranger_0.12.1              plyr_1.8.6                 cellranger_1.1.0           R.devices_2.16.1          
##  [66] AnnotationFilter_1.10.0    e1071_1.7-3                pillar_1.4.4               scatterplot3d_0.3-41       TTR_0.23-6                
##  [71] xts_0.12-0                 vctrs_0.3.1                ellipsis_0.3.1             generics_0.0.2             tools_3.6.3               
##  [76] foreign_0.8-75             munsell_0.5.0              proxy_0.4-24               fastmap_1.0.1              compiler_3.6.3            
##  [81] abind_1.4-5                httpuv_1.5.4               plotly_4.9.2.1             GenomeInfoDbData_1.2.2     lattice_0.20-41           
##  [86] deldir_0.1-25              utf8_1.1.4                 later_1.1.0.1              BiocFileCache_1.10.2       jsonlite_1.6.1            
##  [91] GGally_2.0.0               ggplot.multistats_1.0.0    graph_1.64.0               pbapply_1.4-2              carData_3.0-4             
##  [96] genefilter_1.68.0          lazyeval_0.2.2             promises_1.1.1             spatstat_1.64-1            car_3.0-8                 
## [101] latticeExtra_0.6-29        R.utils_2.9.2              goftest_1.2-2              spatstat.utils_1.17-0      reticulate_1.16           
## [106] checkmate_2.0.0            rmarkdown_2.3              openxlsx_4.1.5             cowplot_1.0.0              statmod_1.4.34            
## [111] Rtsne_0.15                 dichromat_2.0-0            uwot_0.1.8                 igraph_1.2.5               survival_3.2-3            
## [116] yaml_2.2.1                 systemfonts_0.2.3          htmltools_0.5.0            memoise_1.1.0              VariantAnnotation_1.32.0  
## [121] Seurat_3.2.0               locfit_1.5-9.4             destiny_3.0.1              viridisLite_0.3.0          digest_0.6.25             
## [126] assertthat_0.2.1           mime_0.9                   rappdirs_0.3.1             RSQLite_2.2.0              future.apply_1.6.0        
## [131] blob_1.2.1                 R.oo_1.23.0                splines_3.6.3              Formula_1.2-3              labeling_0.3              
## [136] OrganismDbi_1.28.0         ProtGenerics_1.18.0        RCurl_1.98-1.2             broom_0.5.6                hms_0.5.3                 
## [141] colorspace_1.4-1           base64enc_0.1-3            BiocManager_1.30.10        nnet_7.3-14                Rcpp_1.0.5                
## [146] RANN_2.6.1                 fansi_0.4.1                VIM_6.0.0                  R6_2.4.1                   grid_3.6.3                
## [151] ggridges_0.5.2             lifecycle_0.2.0            acepack_1.4.1              zip_2.0.4                  curl_4.3                  
## [156] leiden_0.3.3               robustbase_0.93-6          Matrix_1.2-18              RcppAnnoy_0.0.16           stringr_1.4.0             
## [161] htmlwidgets_1.5.1          officer_0.3.12             polyclip_1.10-0            biomaRt_2.42.1             purrr_0.3.4               
## [166] gridGraphics_0.5-0         mgcv_1.8-31                globals_0.12.5             openssl_1.4.1              htmlTable_2.0.1           
## [171] patchwork_1.0.1            codetools_0.2-16           prettyunits_1.1.1          SingleCellExperiment_1.8.0 dbplyr_1.4.4              
## [176] RSpectra_0.16-0            R.methodsS3_1.8.0          gtable_0.3.0               DBI_1.1.0                  tensor_1.5                
## [181] httr_1.4.1                 highr_0.8                  KernSmooth_2.23-17         stringi_1.4.6              progress_1.2.2            
## [186] farver_2.0.3               uuid_0.1-4                 annotate_1.64.0            ggthemes_4.2.0             hexbin_1.28.1             
## [191] magick_2.3                 xml2_1.3.2                 rvcheck_0.1.8              boot_1.3-25                geneplotter_1.64.0        
## [196] ggplotify_0.0.5            DEoptimR_1.0-8             bit_1.1-15.2               jpeg_0.1-8.1               spatstat.data_1.4-3       
## [201] pkgconfig_2.0.3            rvg_0.2.4

6 References

[1] Shulman, E.D. and Elkon, R. Cell-type-specific analysis of alternative polyadenylation using single-cell transcriptomics data. Nucleic Acids Res 2019;47(19):10027-10039.

[2] movAPA: Modeling and visualization of dynamics of alternative polyadenylation across biological samples (under review), available at https://github.com/BMILAB/movAPA.