免疫组库数据分析1-scRepertoire
免疫组库基础知识见:单细胞免疫组库:TCR基因重排原理和TCR测序建库方法
scRepertoire由华盛顿大学的Nick Borcherding博士开发,是一款针对10X V(D)J数据的免疫组库分析工具。它直接导入10X cellranger的输出结果,具有丰富的分析项目和美观的可视化结果。
官方教程:https://ncborcherding.github.io/vignettes/vignette.html
1. 数据准备
library(devtools)
install_github("ncborcherding/scRepertoire")
#正式版,需要R 4.0
V(D)J数据分析
导入文件说明:scRepertoire需要导入后缀为contig_annotations.csv的CellRanger输出文件,要求barcode没有前缀且以列表的方式传递给scRepertoire。本教程使用scRepertoire包自带的VDJ数据,这些数据来自于三个肾透明细胞癌患者的T细胞,由成对的外周血和肿瘤浸润组成,有效地为T细胞受体(TCR)富集创造了6个不同的runs。可通过data("contig_list"
)加载。
library(Seurat)
library(scRepertoire)
library(tidyverse)
library(patchwork)
rm(list=ls())
dir.create("VDJ")
#加载scRepertoire自带的contig_annotations文件
data("contig_list")
head(contig_list[[1]])
## barcode is_cell contig_id high_confidence length
## 1 AAACCTGAGAGCTGGT TRUE AAACCTGAGAGCTGGT-1_contig_1 TRUE 705
## 2 AAACCTGAGAGCTGGT TRUE AAACCTGAGAGCTGGT-1_contig_2 TRUE 502
## 3 AAACCTGAGCATCATC TRUE AAACCTGAGCATCATC-1_contig_1 TRUE 693
## 4 AAACCTGAGCATCATC TRUE AAACCTGAGCATCATC-1_contig_2 TRUE 567
## 5 AAACCTGAGCATCATC TRUE AAACCTGAGCATCATC-1_contig_5 TRUE 361
## 6 AAACCTGAGTGGTCCC TRUE AAACCTGAGTGGTCCC-1_contig_1 TRUE 593
## chain v_gene d_gene j_gene c_gene full_length productive cdr3
## 1 TRB TRBV20-1 TRBD1 TRBJ1-5 TRBC1 TRUE TRUE CSASMGPVVSNQPQHF
## 2 TRB None None TRBJ1-5 TRBC1 FALSE None None
## 3 TRB TRBV5-1 TRBD2 TRBJ2-2 TRBC2 TRUE TRUE CASSWSGAGDGELFF
## 4 TRA TRAV12-1 None TRAJ37 TRAC TRUE TRUE CVVNDEGSSNTGKLIF
## 5 TRB None None TRBJ1-5 TRBC1 FALSE None None
## 6 TRB TRBV7-9 TRBD1 TRBJ2-5 TRBC2 TRUE TRUE CASSPSEGGRQETQYF
## cdr3_nt reads umis raw_clonotype_id
## 1 TGCAGTGCTAGCATGGGACCGGTAGTGAGCAATCAGCCCCAGCATTTT 16718 6 clonotype96
## 2 None 6706 3 clonotype96
## 3 TGCGCCAGCAGCTGGTCAGGAGCGGGAGACGGGGAGCTGTTTTTT 26719 11 clonotype97
## 4 TGTGTGGTGAACGATGAAGGCTCTAGCAACACAGGCAAACTAATCTTT 18297 6 clonotype97
## 5 None 882 4 clonotype97
## 6 TGTGCCAGCAGCCCCTCCGAAGGGGGGAGACAAGAGACCCAGTACTTC 11218 6 clonotype98
## raw_consensus_id
## 1 clonotype96_consensus_1
## 2 None
## 3 clonotype97_consensus_2
## 4 clonotype97_consensus_1
## 5 None
## 6 clonotype98_consensus_1
2. Combining the Contigs
cellranger输出的文件是对TCRA和TCRB链的量化,没有细胞barcode与clonotype直接对应的数据,因此不能直接整合到seurat中。scRepertoire分析的第一步是把上面的文件转换为barcode与clonotype对应的数据,它通过combineTCR函数实现(如果是BCR用combineBCR),输入的是contig_list。还可以根据样本和身份信息重新标记条形码,以防止重复。
?combineTCR
combined <- combineTCR(contig_list,
samples = c("PY", "PY", "PX", "PX", "PZ","PZ"), #样本来自Patient Y,Patient X和Patient Z(各2个)
ID = c("P", "T", "P", "T", "P", "T"), #P是外周血 T是肿瘤
cells ="T-AB")
#参数说明:
#samples:用于指定样本名称的参数,因为contig_list包含了6个样本的VDJ数据,所以这里传递了一个6个字符元素的向量;
#ID:用于指定样本名称之外的其他分类信息,例如分组信息;
#cells:指定VDJ类型,"T-AB"代表TCR的α和β链配对,"T-GD"代表γ和δ配对;
#removeNA + TRUE -这是一个严格的过滤器,用于移除至少有一个NA值的细胞条码+ FALSE -包含和合并NA值为1的细胞的默认设置。
#removeMulti + TRUE -这是一个严格的过滤器,可以移除任何超过2个免疫受体链的细胞条码+ FALSE -包含和合并带有> 2链的细胞的默认设置。
#filterMulti + TRUE -用多个链分离细胞条形码中前2个表达的链+ FALSE -包含和合并细胞与> 2链的默认设置。
输出的结果combined依然是一个列表
View(combined[[1]])
CTgene: 基因序列; CTnt: 核苷酸序列; CTaa: 氨基酸序列
可以看到barcode都加上了由samples和ID组成的前缀,并且把每个细胞配对的两条链放在一行,之后的分析都基于配对信息定义的clonotype。下面分析所用的函数,一般都有两个通用参数:
exportTable
:默认赋值F,函数分析结果为图形;改为T之后函数分析结果输出为表格。
cloneCall
:可选"aa", "nt", "gene", "gene+nt",代表用CDR3氨基酸序列、CDR3核苷酸序列、VDJ基因还是VDJ基因+CDR3核苷酸序列中的哪一种来定义克隆型。
3. 其他处理功能
3.1 加入其他变量
如果除了sample和ID之外还需要添加更多的变量可以使用addVariable()
函数来添加。我们需要的只是要添加的变量的名称和特定的字符或数字值(变量)。
#例如添加样品被处理和测序的批次
example <- addVariable(combined, name = "batch",
variables = c("b1", "b1", "b2", "b2", "b2", "b2"))
example[[1]][1:5,ncol(example[[1]])] # This is showing the first 5 values of the new column added
## [1] "b1" "b1" "b1" "b1" "b1"
3.2 Subsetting Contigs
同样,我们可以使用subsetContig()
函数在combineTCR()之后删除特定的列表元素。为了进行子集化,我们需要确定要用于子集化的向量(名称)和要子集化的变量值(变量)。下面你可以看到我们从PX和PY中分离出4个测序结果。
subset <- subsetContig(combined, name = "sample", variables = c("PX", "PY"))
4. 可视化
- cloneCall
"gene":VDJ基因
"nt":CDR3核苷酸序列
"aa":代表用CDR3氨基酸序列、
"gene+nt":VDJ基因+CDR3核苷酸序列
需要注意的是,克隆型基本上是利用两个位点的基因组合或nt/aa CDR3序列来命名的。在scRepertoire实现中,clonotype调用没有整合CDR3序列中的微小变异。因此,gene
方法将是最敏感的,而使用nt
或aa
是中度敏感,对克隆型最具特异性的则是gene+nt
。此外,克隆型calling试图整合两个位点,即TCRA和TCRB链,以及如果单个细胞条码有多个序列被识别(即一个细胞中表达2个TCRA链)。使用10x方法有时,有一部分barcode将只返回一个免疫受体链,未返回链会分配一个NA值。
研究克隆类型的第一个函数是quantContig()
,它返回唯一克隆类型的总数或相对数量。
- scale
TRUE -独特克隆型的相对百分比由克隆型库的总大小
FALSE -报告独特克隆型的总数量。
##展示每个样本的克隆型数量
p1 <- quantContig(combined, cloneCall="gene+nt", scale = F)
p2 <- quantContig(combined, cloneCall="gene+nt", scale = T)
plotc = p1 + p2
ggsave('VDJ/quantContig.png', plotc, width = 8, height = 4)
#设置exportTable = T,则输出表格而非图形
quantContig(combined, cloneCall="gene+nt", scale = T, exportTable = T)
# contigs values total scaled
# 1 2692 PY_P 3208 83.91521
# 2 1513 PY_T 3119 48.50914
# 3 823 PX_P 1068 77.05993
# 4 928 PX_T 1678 55.30393
# 5 1147 PZ_P 1434 79.98605
# 6 764 PZ_T 2768 27.60116
左图展示的是每个样本克隆型总数,右图展示的是克隆型总数/克隆种数
我们也可以通过丰度来查看克隆型的相对分布。在这里,abundanceContig=()
将生成一个线图,展示样本中总clonotypes数量。与上面一样,我们还可以使用函数中的group变量根据contig对象中的向量对其进行分组。
abundanceContig(combined, cloneCall = "gene", scale = F)
abundanceContig(combined, cloneCall = "gene", exportTable = T)
## # A tibble: 7,248 x 3
## CTgene Abundance values
## <chr> <int> <chr>
## 1 NA_TRBV10-1.TRBJ2-2.TRBD1.TRBC2 1 PY_P
## 2 NA_TRBV10-2.TRBJ1-1.TRBD1.TRBC1 1 PY_P
## 3 NA_TRBV10-2.TRBJ2-1.TRBD2.TRBC2 1 PY_P
## 4 NA_TRBV10-2.TRBJ2-3.TRBD2.TRBC2 1 PY_P
## 5 NA_TRBV10-3.TRBJ1-1.None.TRBC1 2 PY_P
## 6 NA_TRBV10-3.TRBJ1-1.TRBD1.TRBC1 2 PY_P
## 7 NA_TRBV10-3.TRBJ1-5.None.TRBC1 1 PY_P
## 8 NA_TRBV10-3.TRBJ1-5.TRBD2.TRBC1 1 PY_P
## 9 NA_TRBV10-3.TRBJ2-1.TRBD1.TRBC2 2 PY_P
## 10 NA_TRBV10-3.TRBJ2-2.TRBD2.TRBC2 1 PY_P
## # … with 7,238 more rows
我们可以通过调用lengtheContig()
函数来查看CDR3序列的长度分布。重要的是,与其他基本可视化不同,在这里, cloneCall只能是nt
或aa
。
##CDR3序列的长度分布,“aa”代表统计氨基酸序列长度
p1 <- lengthContig(combined, cloneCall="aa", chains = "combined")
p2 <- lengthContig(combined, cloneCall="aa", chains = "single")
plotc = p1 + p2
ggsave('VDJ/lengthContig.png', plotc, width = 8, height = 4)
左图展示的是α和β链一起统计,右图展示的是α和β链分开统计
我们还可以使用compareClonotypes()
函数来查看样本之间的克隆型的动态变化。
##对比两个样本的克隆型
p1 = compareClonotypes(combined, numbers = 10, samples = c("PX_P", "PX_T"),
cloneCall="aa", graph = "alluvial")
ggsave('VDJ/compareClonotypes.png', p1, width = 8, height = 4)
展示排名前10的克隆型在两个样本间的对比情况
vizVgenes(combined, TCR="TCR1", facet.x = "sample", facet.y = "ID")
5. 更多高级克隆分析
5.1 克隆空间内稳态(Clonal Space Homeostasis)
此分析将克隆型按其相对丰度分为rare, small, medium, large, hyperexpanded 5大类,并统计各个类别的占比
clonalHomeostasis(combined, cloneCall = "gene")
clonalHomeostasis(combined, cloneCall = "aa")
5.2 克隆型分类占比
与上一个分析相似,只是分类方法调整了
clonalProportion(combined, cloneCall = "gene")
clonalProportion(combined, cloneCall = "nt")
5.3 Overlap Analysis
使用clonalOverlap()
分析样本相似性
目前有两种方法可用于clonalOverlap():1)overlap coefficient和2)Morisita index。前者是在较小的样本中以独特的克隆型的长度来衡量克隆型的重叠性。Morisita index更复杂,它是对一个细胞群中个体分散程度的一种生态测量,整合了细胞群的大小。
clonalOverlap(combined, cloneCall = "aa", method = "morisita")
scRepertoire的另一个特性改编自powerTCR R包,使用clonesizeDistribution()
通过克隆大小分布对样本进行聚类。
clonesizeDistribution(combined, cloneCall = "gene+nt", method="ward.D2")
5.4 多样性分析
多样性也可以通过样本或其他变量来衡量。多样性是通过以下四个度量来计算的: 1)Shannon, 2) inverse Simpson, 3) Chao1和4)based Coverage Estimator (ACE)。前两者一般用于估计基线多样性,Chao/ACE指数用于估计样本的丰富度。
clonalDiversity(combined, cloneCall = "aa", group = "samples")
clonalDiversity(combined, cloneCall = "gene", group = "ID")
5.5 Clustering Clonotypes
sub_combined <- clusterTCR(combined[[1]], chain = "TCRA",
sequence = "aa", threshold = 0.85)
sub_combined <- as.data.frame(sub_combined)
counts_TCRAcluster <- table(sub_combined$TCRA_cluster)
counts_TCRA<- table(sub_combined$cdr3_aa1)
#Change in histogram range using clusters over exact amino acid sequence
plot(counts_TCRAcluster, xaxt='n')
plot(counts_TCRA, xaxt='n')
6. VDJ与scRNA(Seurat)整合分析
前面介绍的分析内容只能依据样本或分组信息(可通过ID参数指定)开展,其实我们还可以通过barcode将VDJ数据与scRNA数据联系起来,这样就可以将clonotype显示在降维图上,也可以基于cluster展示clonotype的情况。
官方提供的scRNA数据需要下载:https://drive.google.com/open?id=1np-EzG7U9W_Fz_SchBrsAhtqE3_rB_H9
下载之后会得到一个seurat2.rda的文件,这是一个降维聚类后的seurat对象,请保存在分析相关目录下。
seurat <- get(load("VDJ/seurat2.rda"))
#查看UMAP图
DimPlot(seurat, label = T) + NoLegend()
#查看原始seurat的meta.data有哪些内容
names(seurat@meta.data)
# [1] "nCount_RNA" "nFeature_RNA" "integrated_snn_res.0.5" "seurat_clusters"
# [5] "Patient" "Type" "RawBarcode"
接下来获取clonotypic信息,并使用combineExpression()
函数将其添加到Seurat对象中。需要注意,附件的主要需求是匹配contig细胞条形码和seurat或SCE对象的元数据行名中的条形码。如果这些不匹配,就会失败。因此建议对Seurat对象的行名称进行更改。
?combineExpression
seurat <- combineExpression(combined, seurat,
cloneCall="gene", groupBy = "sample", proportion = FALSE,
cloneTypes=c(Single=1, Small=5, Medium=20, Large=100, Hyperexpanded=500))
combineExpression
的源代码⚠️
combineExpression
function (df, sc, cloneCall = "gene+nt", groupBy = "none", proportion = TRUE,
cloneTypes = c(Rare = 1e-04, Small = 0.001, Medium = 0.01,
Large = 0.1, Hyperexpanded = 1), filterNA = FALSE)
{
cloneTypes <- c(None = 0, cloneTypes)
df <- checkList(df)
cloneCall <- theCall(cloneCall)
Con.df <- NULL
meta <- grabMeta(sc)
cell.names <- rownames(meta)
if (groupBy == "none") {
for (i in seq_along(df)) {
data <- data.frame(df[[i]], stringsAsFactors = FALSE)
data2 <- unique(data[, c("barcode", cloneCall)])
data2 <- na.omit(data2[data2[, "barcode"] %in% cell.names,
])
if (proportion == TRUE) {
data2 <- data2 %>% group_by(data2[, cloneCall]) %>%
summarise(Frequency = n()/nrow(data2))
}
else {
data2 <- data2 %>% group_by(data2[, cloneCall]) %>%
summarise(Frequency = n())
}
colnames(data2)[1] <- cloneCall
data <- merge(data, data2, by = cloneCall, all = TRUE)
Con.df <- rbind.data.frame(Con.df, data)
}
}
else if (groupBy != "none") {
data <- data.frame(bind_rows(df), stringsAsFactors = FALSE)
data2 <- na.omit(unique(data[, c("barcode", cloneCall,
groupBy)]))
data2 <- data2[data2[, "barcode"] %in% cell.names, ]
data2 <- as.data.frame(data2 %>% group_by(data2[, cloneCall],
data2[, groupBy]) %>% summarise(Frequency = n()))
colnames(data2)[c(1, 2)] <- c(cloneCall, groupBy)
x <- unique(data[, groupBy])
for (i in seq_along(x)) {
sub1 <- subset(data, data[, groupBy] == x[i])
sub2 <- subset(data2, data2[, groupBy] == x[i])
merge <- merge(sub1, sub2, by = cloneCall)
if (proportion == TRUE) {
merge$Frequency <- merge$Frequency/length(merge$Frequency)
}
Con.df <- rbind.data.frame(Con.df, merge)
}
nsize <- Con.df %>% group_by(Con.df[, paste0(groupBy,
".x")]) %>% summarise(n = n())
}
Con.df$cloneType <- NA
for (x in seq_along(cloneTypes)) {
names(cloneTypes)[x] <- paste0(names(cloneTypes[x]),
" (", cloneTypes[x - 1], " < X <= ", cloneTypes[x],
")")
}
for (i in 2:length(cloneTypes)) {
Con.df$cloneType <- ifelse(Con.df$Frequency > cloneTypes[i -
1] & Con.df$Frequency <= cloneTypes[i], names(cloneTypes[i]),
Con.df$cloneType)
}
PreMeta <- unique(Con.df[, c("barcode", "CTgene", "CTnt",
"CTaa", "CTstrict", "Frequency", "cloneType")])
rownames(PreMeta) <- PreMeta$barcode
if (inherits(x = sc, what = "Seurat")) {
col.name <- names(PreMeta) %||% colnames(PreMeta)
sc[[col.name]] <- PreMeta
}
else {
rownames <- rownames(colData(sc))
colData(sc) <- cbind(colData(sc), PreMeta[rownames, ])[,
union(colnames(colData(sc)), colnames(PreMeta))]
rownames(colData(sc)) <- rownames
}
if (filterNA == TRUE) {
sc <- filteringNA(sc)
}
return(sc)
}
<bytecode: 0x7fdcedf8ecc0>
<environment: namespace:scRepertoire>
查看整合后的metadata
names(seurat@meta.data)
# [1] "nCount_RNA" "nFeature_RNA" "integrated_snn_res.0.5"
# [4] "seurat_clusters" "Patient" "Type"
# [7] "RawBarcode" "barcode" "CTgene"
#[10] "CTnt" "CTaa" "CTstrict"
#[13] "Frequency" "cloneType"
查看外周血和肿瘤中的T细胞
colorblind_vector <- colorRampPalette(c("#FF4B20", "#FFB433",
"#C6FDEC", "#7AC5FF", "#0348A6"))
DimPlot(seurat, group.by = "Type") + NoLegend() +
scale_color_manual(values=colorblind_vector(2))
UMAP图展示cloneType的分布
slot(seurat, "meta.data")$cloneType <- factor(slot(seurat, "meta.data")$cloneType,
levels = c("Hyperexpanded (100 < X <= 500)",
"Large (20 < X <= 100)",
"Medium (5 < X <= 20)",
"Small (1 < X <= 5)",
"Single (0 < X <= 1)", NA))
DimPlot(seurat, group.by = "cloneType") +
scale_color_manual(values = colorblind_vector(5), na.value="grey")
6.1 clonalOverlay
clonalOverlay(seurat, reduction = "umap",
freq.cutpoint = 30, bins = 10, facet = "Patient") +
guides(color = FALSE)
UMAP图展示特定克隆型的分布
seurat <- highlightClonotypes(seurat, cloneCall= "aa", sequence = c("CAVNGGSQGNLIF_CSAEREDTDTQYF", "NA_CATSATLRVVAEKLFF"))
DimPlot(seurat, group.by = "highlight")
6.2 occupiedscRepertoire
我们还可以使用occupiedscRepertoire()
函数并通过定义x.axis来显示细胞对象的元数据中的集群或其他变量,从而查看分配到特定频率范围的集群的单元数。
occupiedscRepertoire(seurat, x.axis = "cluster")
6.3 alluvialClonotypes
桑基图展示特定克隆型的来源
最后,在修改了所有元数据之后,我们可以使用alluvialClonotypes()
函数查看跨多个类别的clonotypes。
⚠️要理解这种绘图方法的基本概念,强烈推荐阅读Alluvial Plots in ggplot2。(本质上我们能够使用绘图来检查分类变量的流向。因为这个函数将生成一个图形,其中每个克隆型按所谓的分层进行排列,这将花费一些时间,具体时间取决于细胞总数的大小。)
alluvialClonotypes(seurat, cloneCall = "gene",
y.axes = c("Patient", "cluster", "Type"),
color = "TRAV12-2.TRAJ42.TRAC_TRBV20-1.TRBJ2-3.TRBD2.TRBC2") +
scale_fill_manual(values = c("grey", colorblind_vector(1)))
桑基图展示克隆型在病例-cluster-组织类型之间的关系
alluvialClonotypes(seurat, cloneCall = "gene",
y.axes = c("Patient", "cluster", "Type"),
color = "cluster")
6.4 getCirclize
library(circlize)
library(scales)
circles <- getCirclize(seurat, groupBy = "cluster")
#Just assigning the normal colors to each cluster
grid.cols <- scales::hue_pal()(length(unique(seurat@active.ident)))
names(grid.cols) <- levels(seurat@active.ident)
#Graphing the chord diagram
circlize::chordDiagram(circles, self.link = 1, grid.col = grid.cols)
subset <- subset(seurat, Type == "T")
circles <- getCirclize(subset, groupBy = "cluster")
grid.cols <- hue_pal()(length(unique(subset@active.ident)))
names(grid.cols) <- levels(subset@active.ident)
chordDiagram(circles, self.link = 1, grid.col = grid.cols)
6.5 Diversity of single-cells using Startrac
StartracDiversity(seurat, type = "Type", sample = "Patient", by = "overall")
## [2021-05-17 16:29:17] initialize Startrac ...
## [2021-05-17 16:29:17] calculate startrac index ...
## [2021-05-17 16:29:17] calculate pairwise index ...
## [2021-05-17 16:29:18] calculate indices of each patient ...
## [2021-05-17 16:29:22] collect result
## [2021-05-17 16:29:22] return
7. Working with clonotypes after clustering
对于希望在Seurat对象中使用元数据来执行scRepertoire提供的分析的用户来说,还有一个选项是使用expression2List()
函数,该函数将获取元数据并按亚群将数据输出为列表。也就是人们常说的,细胞类型特异的克隆型分析。
combined2 <- expression2List(seurat, group = "cluster")
length(combined2) #now listed by cluster
## [1] 12
7.1 Clonal Diversity
clonalDiversity(combined2, cloneCall = "nt")
7.2 Clonal Homeostasis
clonalHomeostasis(combined2, cloneCall = "nt")
7.3 Clonal Proportion
clonalProportion(combined2, cloneCall = "nt")
7.4 Clonal Overlap
clonalOverlap(combined2, cloneCall="aa", method="overlap")
8. 总结
This has been a general overview of the capabilities for scRepertoire from the initial processing and visualization to attach to the mRNA expression values in a Seurat object.
sessionInfo()
## R version 4.0.3 (2020-10-10)
## Platform: x86_64-apple-darwin17.0 (64-bit)
## Running under: macOS Catalina 10.15.7
## Matrix products: default
## BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
## attached base packages:
## [1] parallel stats graphics grDevices utils datasets
## [7] methods base
## other attached packages:
## [1] scales_1.1.1 patchwork_1.1.1 scRepertoire_1.0.3
## [4] devtools_2.4.0 usethis_2.0.1 forcats_0.5.1
## [7] stringr_1.4.0 dplyr_1.0.5 purrr_0.3.4
## [10] readr_1.4.0 tidyr_1.1.3 tibble_3.1.1
## [13] ggplot2_3.3.3 tidyverse_1.3.1 SeuratObject_4.0.0
## [16] Seurat_4.0.1 nichenetr_1.0.0 circlize_0.4.12
## [19] Biobase_2.50.0 BiocGenerics_0.36.1
## loaded via a namespace (and not attached):
## [1] SparseM_1.81 scattermore_0.7
## [3] ModelMetrics_1.2.2.2 evmix_2.12
## [5] pkgmaker_0.32.2 knitr_1.33
## [7] DelayedArray_0.16.3 irlba_2.3.3
## [9] data.table_1.14.0 rpart_4.1-15
## [11] RCurl_1.98-1.3 doParallel_1.0.16
## [13] generics_0.1.0 callr_3.7.0
## [15] cowplot_1.1.1 VGAM_1.1-5
## [17] RANN_2.6.1 proxy_0.4-25
## [19] future_1.21.0 DiagrammeR_1.0.6.1
## [21] spatstat.data_2.1-0 xml2_1.3.2
## [23] lubridate_1.7.10 httpuv_1.6.0
## [25] isoband_0.2.4 SummarizedExperiment_1.20.0
## [27] ggsci_2.9 assertthat_0.2.1
## [29] gower_0.2.2 xfun_0.22
## [31] hms_1.0.0 evaluate_0.14
## [33] promises_1.2.0.1 fansi_0.4.2
## [35] caTools_1.18.2 dbplyr_2.1.1
## [37] readxl_1.3.1 igraph_1.2.6.9118
## [39] DBI_1.1.1.9000 htmlwidgets_1.5.3
## [41] powerTCR_1.10.3 spatstat.geom_2.1-0
## [43] stringdist_0.9.6.3 stats4_4.0.3
## [45] ellipsis_0.3.2 ggpubr_0.4.0
## [47] backports_1.2.1 permute_0.9-5
## [49] gridBase_0.4-7 MatrixGenerics_1.2.1
## [51] deldir_0.2-10 ggalluvial_0.12.3
## [53] vctrs_0.3.8 remotes_2.3.0
## [55] Cairo_1.5-12.2 ROCR_1.0-11
## [57] abind_1.4-5 caret_6.0-86
## [59] cachem_1.0.4 withr_2.4.2
## [61] checkmate_2.0.0 sctransform_0.3.2
## [63] vegan_2.5-7 fdrtool_1.2.16
## [65] prettyunits_1.1.1 goftest_1.2-2
## [67] cluster_2.1.2 gsl_2.1-6
## [69] lazyeval_0.2.2 crayon_1.4.1
## [71] recipes_0.1.16 pkgconfig_2.0.3
## [73] labeling_0.4.2 GenomeInfoDb_1.26.7
## [75] nlme_3.1-152 pkgload_1.2.1
## [77] nnet_7.3-15 rlang_0.4.11
## [79] globals_0.14.0 lifecycle_1.0.0
## [81] miniUI_0.1.1.1 registry_0.5-1
## [83] modelr_0.1.8 rprojroot_2.0.2
## [85] cellranger_1.1.0 randomForest_4.6-14
## [87] polyclip_1.10-0 matrixStats_0.58.0
## [89] lmtest_0.9-38 rngtools_1.5
## [91] Matrix_1.3-2 carData_3.0-4
## [93] zoo_1.8-9 reprex_2.0.0
## [95] base64enc_0.1-3 ggridges_0.5.3
## [97] GlobalOptions_0.1.2 processx_3.5.2
## [99] pheatmap_1.0.12 png_0.1-7
## [101] viridisLite_0.4.0 rjson_0.2.20
## [103] bitops_1.0-7 KernSmooth_2.23-18
## [105] visNetwork_2.0.9 pROC_1.17.0.1
## [107] shape_1.4.5 parallelly_1.25.0
## [109] jpeg_0.1-8.1 rstatix_0.7.0
## [111] S4Vectors_0.28.1 ggsignif_0.6.1
## [113] memoise_2.0.0 magrittr_2.0.1
## [115] plyr_1.8.6 ica_1.0-2
## [117] zlibbioc_1.36.0 compiler_4.0.3
## [119] tinytex_0.31 RColorBrewer_1.1-2
## [121] clue_0.3-59 fitdistrplus_1.1-3
## [123] cli_2.5.0 XVector_0.30.0
## [125] listenv_0.8.0 pbapply_1.4-3
## [127] ps_1.6.0 htmlTable_2.1.0
## [129] Formula_1.2-4 MASS_7.3-53.1
## [131] mgcv_1.8-35 tidyselect_1.1.1
## [133] stringi_1.5.3 yaml_2.2.1
## [135] latticeExtra_0.6-29 ggrepel_0.9.1
## [137] grid_4.0.3 tools_4.0.3
## [139] future.apply_1.7.0 rio_0.5.26
## [141] rstudioapi_0.13 foreach_1.5.1
## [143] foreign_0.8-81 cubature_2.0.4.2
## [145] gridExtra_2.3 prodlim_2019.11.13
## [147] farver_2.1.0 Rtsne_0.15
## [149] digest_0.6.27 shiny_1.6.0
## [151] lava_1.6.9 Rcpp_1.0.6
## [153] GenomicRanges_1.42.0 car_3.0-10
## [155] broom_0.7.6 later_1.2.0
## [157] RcppAnnoy_0.0.18 httr_1.4.2
## [159] ComplexHeatmap_2.7.10.9001 colorspace_2.0-0
## [161] rvest_1.0.0 fs_1.5.0
## [163] tensor_1.5 reticulate_1.20
## [165] IRanges_2.24.1 splines_4.0.3
## [167] uwot_0.1.10 spatstat.utils_2.1-0
## [169] sessioninfo_1.1.1 plotly_4.9.3
## [171] xtable_1.8-4 truncdist_1.0-2
## [173] jsonlite_1.7.2 timeDate_3043.102
## [175] testthat_3.0.2 ipred_0.9-11
## [177] R6_2.5.0 Hmisc_4.5-0
## [179] pillar_1.6.0 htmltools_0.5.1.1
## [181] mime_0.10 NMF_0.23.0
## [183] glue_1.4.2 fastmap_1.1.0
## [185] DT_0.18 class_7.3-18
## [187] codetools_0.2-18 pkgbuild_1.2.0
## [189] utf8_1.2.1 lattice_0.20-44
## [191] spatstat.sparse_2.0-0 evd_2.3-3
## [193] curl_4.3.1 leiden_0.3.7
## [195] zip_2.1.1 openxlsx_4.2.3
## [197] survival_3.2-11 limma_3.46.0
## [199] rmarkdown_2.7 desc_1.3.0
## [201] munsell_0.5.0 GenomeInfoDbData_1.2.4
## [203] e1071_1.7-6 GetoptLong_1.0.5
## [205] iterators_1.0.13 haven_2.4.1
## [207] reshape2_1.4.4 gtable_0.3.0
## [209] spatstat.core_2.1-2