Skip to content

scRNA-seq + scATAC-seq 多模态数据整合分析教程

作者: SeekGene
时长: 22 分钟
字数: 5.1k 字
更新: 2025-09-11
阅读: 0 次

本教程面向初学者,使用 Seurat 与 Signac 演示如何整合两种单细胞数据:

  • scRNA-seq:测基因表达(每个细胞哪些基因在“开”)
  • scATAC-seq:测染色质可及性(每个细胞哪些 DNA 区域“开放”)

整合的核心目标是:将已注释好的 scRNA-seq 细胞标签“迁移/传递”(label transfer)到 scATAC-seq 上,从而给 ATAC 细胞自动注释类型。随后可做一次“共嵌入”(co-embedding)把两类细胞放到同一降维空间,便于同图展示(主要用于可视化)。

使用本教程前,建议准备:

  • 已完成注释的 scRNA-seq 数据(例如已有 cell_type 或聚类标签)
  • 与 scATAC-seq 相同物种、相同/兼容的基因组版本与染色体命名(如 hg38、chr1 格式)
  • 基本的 R 运行环境与适度内存

我们将学习如何:

  1. 数据读取:分别读取 scRNA-seq 和 scATAC-seq 数据
  2. 数据预处理:进行质量控制(QC)与初步筛选
  3. 数据标准化:为后续整合打基础(RNA 的归一化与可变基因选择;ATAC 的 TF-IDF/LSI)
  4. 基因活性分数:将 ATAC 的 peaks 转为近似“表达”的基因活性矩阵
  5. 跨模态整合:用锚点匹配进行标签传递(label transfer)
  6. 可视化与导出:UMAP/共嵌入展示与结果保存
R
#加载必要的R包
suppressPackageStartupMessages({
  library(Seurat)
  library(Signac)
  library(EnsDb.Hsapiens.v86, lib.loc = "/PROJ2/FLOAT/shumeng/apps/miniconda3/envs/python3.10/lib/R/library")
  library(BSgenome.Hsapiens.UCSC.hg38,lib = "/PROJ2/FLOAT/shumeng/apps/miniconda3/envs/python3.10/lib/R/library")
  library(biovizBase, lib = "/PROJ2/FLOAT/shumeng/apps/miniconda3/envs/python3.10/lib/R/library")
  #library(BSgenome.Mmusculus.UCSC.mm10)
  #library(EnsDb.Mmusculus.v79)
  library(dplyr)
  library(ggplot2)
  library(patchwork)
})

# 设置随机种子
set.seed(1234)

# 设置Seurat选项(注意:8000 * 1024^2 实际上是8GB)
options(future.globals.maxSize = 8000 * 1024^2)  # 8GB
R
my36colors <-c( '#E5D2DD', '#53A85F', '#F1BB72', '#F3B1A0', '#D6E7A3', '#57C3F3', '#476D87',
                '#E95C59', '#E59CC4', '#AB3282', '#23452F', '#BD956A', '#8C549C', '#585658',
                '#9FA3A8', '#E0D4CA', '#5F3D69', '#C5DEBA', '#58A4C3', '#E4C755', '#F7F398',
                '#AA9A59', '#E63863', '#E39A35', '#C1E6F3', '#6778AE', '#91D0BE', '#B53E2B',
                '#712820', '#DCC1DD', '#CCE0F5', '#CCC9E6', '#625D9E', '#68A180', '#3A6963',
                '#968175', "#6495ED", "#FFC1C1",'#f1ac9d','#f06966','#dee2d1','#6abe83','#39BAE8','#B9EDF8','#221a12',
                '#b8d00a','#74828F','#96C0CE','#E95D22','#017890')

1. 数据读取和准备

为方便上手,本教程采用 10x Genomics 常见目录结构。请准备以下文件:

scRNA-seq 数据(表达矩阵)
├── RNA_sample
│ ├── filtered_feature_bc_matrix
│ │ ├── barcodes.tsv.gz(细胞条形码)
│ │ ├── features.tsv.gz(基因列表)
│ │ └── matrix.mtx.gz(稀疏表达矩阵)

scATAC-seq 数据(peaks 矩阵 + 片段)
├── ATAC_sample
│ ├── filtered_peaks_bc_matrix
│ │ ├── barcodes.tsv.gz(细胞条形码)
│ │ ├── features.tsv.gz(peaks 列表)
│ │ └── matrix.mtx.gz(稀疏计数矩阵)
│ ├── ATAC_sample_fragments.tsv.gz(每条测序读段的基因组坐标,供 TSS 富集/核小体信号等 QC 使用)
│ ├── ATAC_sample_fragments.tsv.gz.tbi(fragments 的索引文件)
│ └── per_barcode_metrics.csv(可选的每细胞质控指标)

小贴士:

  • 若使用不同平台/流程生成的数据,请确认能读入为等价的稀疏矩阵与片段文件。
  • 尽量保证 RNA 与 ATAC 来自相近的样本/条件,便于标签传递更可靠。

获取基因注释信息

我们将从 EnsDb 数据库获取人类基因组注释(基因位置、转录本、外显子、TSS 等)。这些信息用于:

  • 计算 ATAC 的 TSS 富集(判断开放染色质是否在转录起始位点附近更集中)
  • 构建“基因活性矩阵”(把 peaks 信号映射到基因上)

请确保:

  • 物种与参考基因组版本匹配(如 EnsDb.Hsapiens.v86 对应 hg38)
  • 染色体命名风格一致(例如都用 chr1chr2 这样的前缀)
R
# 获取基因注释信息(静默处理警告和消息)
suppressWarnings({
  suppressMessages({
    annotation <- GetGRangesFromEnsDb(ensdb = EnsDb.Hsapiens.v86)
    seqlevels(annotation) <- paste0('chr', seqlevels(annotation))
    genome(annotation) <- 'hg38'
  })
})

# 设置并行计算(静默处理,可选)
suppressPackageStartupMessages({
  library(future)
})
plan("multicore", workers = 4)

读取 scRNA-seq 数据

我们将读入 10x 表达矩阵(barcodes/features/matrix 三件套),并创建标准的 Seurat 对象:

  • counts:每个细胞的基因计数
  • meta.data:后续会加入样本信息、质控指标、聚类/细胞类型等

完成后得到的对象将作为“参考”(reference),用于给 ATAC 细胞传递标签。

R
options(warn = -1)
# 定义scRNA-seq数据路径
rna_sample_name <- 'joint34'
rna_counts_path <- file.path(rna_sample_name, 'filtered_feature_bc_matrix')

# 读取scRNA-seq数据
rna_counts <- Read10X(rna_counts_path)

# 创建scRNA-seq Seurat对象
rna_obj <- CreateSeuratObject(
  counts = rna_counts,
  project = "RNA_sample",
  min.cells = 3,
  min.features = 200
)

# 添加样本标识
rna_obj$orig.ident <- 'joint34'
rna_obj$Sample <- 'joint34'
rna_obj$technology <- 'RNA'
options(warn = 0)
# scRNA-seq数据读取完成

读取 scATAC-seq 数据

这里会读入:

  • filtered_peaks_bc_matrix:peaks×cells 的稀疏计数矩阵(代表开放染色质计数)
  • fragments.tsv.gz:每条读段的基因组坐标(用于 TSS 富集、核小体信号等 QC)

随后用 Signac 创建 ChromatinAssay 并包装为 Seurat 对象。这个对象将作为“查询”(query),接收来自 RNA 的标签传递。

R
# 定义scATAC-seq数据路径
atac_sample_name <- 'joint41'
atac_counts_path <- file.path(atac_sample_name, 'filtered_peaks_bc_matrix')
atac_fragments_path <- file.path(atac_sample_name, paste0(atac_sample_name, '_A_fragments.tsv.gz'))
#atac_metadata_path <- file.path(atac_sample_name, 'per_barcode_metrics.csv')

# 读取scATAC-seq数据
atac_counts <- Read10X(atac_counts_path)

# 读取质控指标metadata
#atac_metadata <- read.csv(
#  file = atac_metadata_path,
#  header = TRUE,
#  row.names = 1
#)

# 创建ChromatinAssay对象
chrom_assay <- CreateChromatinAssay(
  counts = atac_counts,
  sep = c(':', '-'),
  fragments = atac_fragments_path,
  annotation = annotation,
  min.cells = 3,
  min.features = 200
)

# 创建scATAC-seq Seurat对象
atac_obj <- CreateSeuratObject(
  counts = chrom_assay,
  assay = "ATAC",
  project = "ATAC_sample"#,meta.data = atac_metadata
)

# 添加样本标识
atac_obj$orig.ident <- 'joint41'
atac_obj$Sample <- 'joint41'
atac_obj$technology <- 'joint41'

# scATAC-seq数据读取完成
output
Computing hash

Warning message:
"Keys should be one or more alphanumeric characters followed by an underscore, setting key from atac to atac_"

2. 数据预处理

在整合前,需要先把两类数据分别“清洗干净”:

  • QC(质量控制):剔除低质量细胞(如线粒体比例过高、ATAC 的 TSS 富集过低等)
  • 初步标准化/降维:为后续找锚点、可视化做好准备

不同数据集的阈值会不同,下文会给出常见指标与可视化方法,帮助你按分布来调整阈值。

scRNA-seq 数据质量控制

常用 QC 指标:

  • percent.mt:线粒体基因比例。过高通常提示细胞受损或 RNA 泄漏。
  • nFeature_RNA:检测到的基因数。过低可能是空液滴,过高可能是双细胞/多重。
  • nCount_RNA:总计数。与测序深度相关,需结合分布来判定异常。

这些指标没有“一刀切”的阈值,应结合数据分布(小提琴图/散点图)做经验性筛选。

R
# 计算线粒体基因表达比例
suppressWarnings({
    rna_obj[["percent.mt"]] <- PercentageFeatureSet(rna_obj, pattern = "^MT-")
})

scATAC-seq 数据质量控制

常用 QC 指标:

  • TSS.enrichment(TSS 富集分数):越高越好,说明信号在转录起始位点附近更集中;过低可能提示背景高或细胞活性差。
  • nucleosome_signal(核小体信号):反映核小体周期性信号;通常越低越好。
  • nCount_ATAC:总 ATAC 计数,极低或极高都需警惕异常。

实际阈值应基于数据分布设置,并与 fragments 质量、双细胞比例等因素结合判断。

R
# 设置默认assay为peaks
DefaultAssay(atac_obj) <- 'ATAC'

# 计算TSS富集分数
atac_obj <- TSSEnrichment(atac_obj)

# 计算核小体信号
atac_obj <- NucleosomeSignal(atac_obj)
output
Extracting TSS positions

Extracting fragments at TSSs


Computing TSS enrichment score

质量控制可视化

用小提琴图查看各 QC 指标的分布/异常点,帮助选择阈值:

  • RNA:nFeature_RNAnCount_RNApercent.mt
  • ATAC:nCount_ATACTSS.enrichmentnucleosome_signal

建议:

  • 观察是否存在明显的长尾或双峰分布
  • 尝试多组阈值并比较下游聚类/UMAP 是否更清晰
R
# scRNA-seq质控指标可视化
suppressWarnings({
    options(repr.plot.width = 15, repr.plot.height = 7)
    p1 <- VlnPlot(rna_obj, 
              features = c("nFeature_RNA", "nCount_RNA", "percent.mt"),
              ncol = 4, pt.size = 0.1) +
      plot_annotation(title = "scRNA-seq")

    print(p1)

    # scATAC-seq质控指标可视化
    p2 <- VlnPlot(atac_obj, 
              features = c("nCount_ATAC", "TSS.enrichment", "nucleosome_signal"),
              ncol = 4, pt.size = 0.1) +
      plot_annotation(title = "scATAC-seq")

    print(p2)
})

png

png

质量控制过滤

根据上一步的分布选择阈值并过滤低质量细胞。提示:

  • 过滤后细胞数减少是正常现象,关键在于提升信噪比
  • 请记录所用阈值与理由,便于复现与团队沟通
R
# scRNA-seq数据过滤
cat('过滤前scRNA-seq细胞数:', ncol(rna_obj), '\n')
rna_obj <- subset(rna_obj, 
                  subset = nFeature_RNA > 200 & 
                          nFeature_RNA < 10000 & 
                          percent.mt < 20)
cat('过滤后scRNA-seq细胞数:', ncol(rna_obj), '\n')
# scATAC-seq数据过滤
cat('过滤前scATAC-seq细胞数:', ncol(atac_obj), '\n')
atac_obj <- subset(atac_obj,
                   subset = nCount_ATAC > 500 &
                           nCount_ATAC < 50000 &
                           TSS.enrichment > 1 &
                           nucleosome_signal < 1)
cat('过滤后scATAC-seq细胞数:', ncol(atac_obj), '\n')
output
过滤前scRNA-seq细胞数: 13104
过滤后scRNA-seq细胞数: 13013
过滤前scATAC-seq细胞数: 13109
过滤后scATAC-seq细胞数: 12931

数据标准化处理

我们将分别对两类数据做适配的标准化/降维:

  • RNA:Normalize → 选择可变基因 → Scale → PCA/UMAP → 邻居图与聚类
  • ATAC:TF-IDF → 选重要特征(peaks)→ LSI(类似 PCA 的方法)→ UMAP

目的:把不同测序深度、计数尺度的样本拉到可比较的空间里,并初步揭示主轴结构,方便后续找“跨模态锚点”。

R
# scRNA-seq数据标准化处理
suppressWarnings({
  suppressMessages({
      rna_obj <- NormalizeData(rna_obj)
      rna_obj <- FindVariableFeatures(rna_obj,nfeatures=4000)
      rna_obj <- ScaleData(rna_obj)
      rna_obj <- RunPCA(rna_obj)
      rna_obj <- RunUMAP(rna_obj, dims = 1:30)
      rna_obj <- FindNeighbors(rna_obj, dims = 1:30)
      rna_obj <- FindClusters(rna_obj, resolution = 0.5)
  })
})
output
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 13013
Number of edges: 445565

Running Louvain algorithm...n Maximum modularity in 10 random starts: 0.9026
Number of communities: 15
Elapsed time: 1 seconds
R
#scATAC-seq数据标准化处理
suppressWarnings({
  suppressMessages({
      atac_obj <- RunTFIDF(atac_obj)
      atac_obj <- FindTopFeatures(atac_obj, min.cutoff = "q0")
      atac_obj <- RunSVD(atac_obj)
      atac_obj <- RunUMAP(atac_obj, reduction = "lsi", dims = 2:30, reduction.name = "umap.atac", reduction.key = "atacUMAP_")
        })
})

3. 基因活性分数计算

为了把 ATAC 的“开放程度”与 RNA 的“表达水平”联通起来,我们需要把 peaks 信号映射到基因上,得到“基因活性分数”(gene activity)。它不是直接的表达量,但在统计意义上可以近似反映某个基因的潜在表达活性,是跨模态整合的关键桥梁。

计算基因活性矩阵

思路:统计与每个基因相关的 peaks 信号(如基因体 + 上下游一定范围的启动子区域),累积得到该基因在每个细胞的“活性分数”。

  • 典型做法会取 TSS 上游 ~2kb、下游 ~1kb 的窗口(可按需要调整)
  • 得到的 ACTIVITY assay 将用于与 RNA 的 RNA assay 建立锚点
R
# 计算基因活性分数
# 使用基因体和启动子区域计算活性分数
suppressWarnings({
    DefaultAssay(atac_obj)="ATAC"
    gene.activities <- GeneActivity(
        object = atac_obj,
        features = VariableFeatures(rna_obj),extend.upstream = 2000,extend.downstream = 1000)

    # 将基因活性矩阵添加为新的assay
    atac_obj[['ACTIVITY']] <-  CreateAssayObject(counts = gene.activities)
    DefaultAssay(atac_obj) <- "ACTIVITY"
    # 标准化基因活性数据
    atac_obj <- NormalizeData(atac_obj)
    atac_obj <- ScaleData(atac_obj, features = rownames(atac_obj))
})
output
Extracting gene coordinates

Extracting reads overlapping genomic regions

Centering and scaling data matrix

4. 多模态数据整合

现在我们用“RNA 表达矩阵(参考)”与“ATAC 基因活性矩阵(查询)”进行跨模态匹配。核心任务:

  • 找到跨模态的“对应关系”(锚点)
  • 把“参考”的细胞标签传递给“查询”细胞

寻找整合锚点

“锚点”(anchors)是把两个数据空间对齐的关键。做法是用 CCA/LSI 等方法在 RNA 与 ATAC(基因活性)之间寻找一组高可比性的特征子空间,从而建立可互相投影的坐标系。

R
# 设置scATAC-seq对象的默认assay为ACTIVITY(基因活性分数)
DefaultAssay(atac_obj) <- 'ACTIVITY'
suppressWarnings({
  suppressMessages({
      # 寻找整合锚点
      transfer.anchors <- FindTransferAnchors(
          reference = rna_obj,
          query = atac_obj,
          features = VariableFeatures(object = rna_obj),
          reference.assay = 'RNA',
          query.assay = 'ACTIVITY',
          k.anchor = 30,
          k.filter = 50 ,
          reduction = 'cca'
      )
  })
})

预测细胞类型标签

当锚点建立后,就可以把“参考”的标签(如 cell_typeseurat_clusters)传给 ATAC 细胞:

  • 输出的 predicted.id 即为每个 ATAC 细胞的预测类型/聚类
  • 可同时得到预测得分,用于衡量置信度(本教程示例显示聚类标签)

建议:

  • 用 UMAP 查看预测分布是否与 RNA 的结构一致
  • 结合标记基因/已知生物学知识做 sanity check
R
# 预测scATAC-seq细胞的聚类标签
predicted.labels <- TransferData(
  anchorset = transfer.anchors,
  refdata = rna_obj$seurat_clusters,#scRNA-seq数据实际细胞注释结果,按照scRNA-seq实际注释情况选择

  weight.reduction = atac_obj[['lsi']],
  dims = 2:30
)

# 将预测标签添加到scATAC-seq对象
atac_obj <- AddMetaData(atac_obj, metadata = predicted.labels)
output
Finding integration vectors

Finding integration vector weights

Predicting cell labels

可视化 scATAC-seq 细胞类型

这里并排展示:

  • RNA:参考数据自带/计算得到的聚类
  • ATAC:通过标签传递得到的 predicted.id

颜色对照相同类别,便于直接比较两者结构的一致性。

R
# scRNA-seq数据可视化
options(repr.plot.width = 15, repr.plot.height = 7)
p1 <- DimPlot(rna_obj, 
              group.by = 'seurat_clusters', 
              label = TRUE, 
              repel = TRUE,
              pt.size = 0.5) + 
      ggtitle('scRNA-seq') +
      theme_minimal() +
      scale_color_manual(values = my36colors)

# scATAC-seq数据可视化(基于预测标签)

p2 <- DimPlot(atac_obj, 
              group.by = 'predicted.id', 
              label = TRUE, 
              repel = TRUE,
              pt.size = 0.5) + 
      ggtitle('scATAC-seq') +
      theme_minimal() +
      scale_color_manual(values = my36colors)
p1 | p2
pdf("scRNA_scATAC_UMAP.pdf", width = 10, height = 5)
print(p1 | p2)
dev.off()

pdf: 2

png

5.共嵌入分析(可选)

目的:把 RNA 与 ATAC 细胞放到同一张 UMAP 上,便于观察跨模态的一致性。 方法要点:

  • 先用锚点把 RNA 的表达矩阵“插补/投影”到 ATAC 上,得到 ATAC 细胞的“拟表达矩阵”
  • 把两者合并后再做统一的降维与 UMAP

注意:共嵌入主要是可视化工具,不等同于真实的同细胞多组学观测,解读时请结合生物学常识。

R
# 计算共嵌入
suppressWarnings({
  suppressMessages({
      genes.use <- VariableFeatures(rna_obj)
      refdata <- GetAssayData(rna_obj, assay = "RNA", slot = "data")[genes.use, ]

# refdata (input) contains a scRNA-seq expression matrix for the scRNA-seq cells.  imputation
# (output) will contain an imputed scRNA-seq matrix for each of the ATAC cells
     imputation <- TransferData(anchorset = transfer.anchors, refdata = refdata, weight.reduction = "cca",dims=1:30)
     atac_obj[["RNA"]] <- imputation
     coembed <- merge(x = rna_obj, y = atac_obj)

     coembed <- ScaleData(coembed, features = genes.use, do.scale = FALSE)
     coembed <- RunPCA(coembed, features = genes.use, verbose = FALSE)
     coembed <- RunUMAP(coembed, dims = 1:30)
  })
})
options(repr.plot.width = 8, repr.plot.height = 7)
p3=DimPlot(coembed, group.by = c("orig.ident"))
p3
pdf("coembed_UMAP.pdf", width = 10, height = 5)
print(p3)
dev.off()

pdf: 2

png

6. 结果总结和保存

完成后请保存关键对象,便于复现与后续分析:

  • scRNA_processed.rds:已标准化/降维/聚类的 RNA 对象
  • scATAC_processed.rds:已 QC/标准化/带预测标签的 ATAC 对象(含 ACTIVITY
  • coembed.rds:共嵌入对象(若执行了该步骤)
  • session_info.txt:运行环境信息,方便他人复现
R
# 保存分析对象
saveRDS(rna_obj, file = "./scRNA_processed.rds")
saveRDS(atac_obj, file = "./scATAC_processed.rds")
saveRDS(coembed, file = "./coembed.rds")

7. 进阶分析建议

在完成基础整合后,你可以进一步深入:

7.1 转录因子 motif 分析

  • FindMotifs() 在差异可及性区域(DAR)中寻找富集的 TF motif
  • 结合 RNA 的表达或基因活性推断 TF 活性变化

7.2 基因调控网络(GRN)与 peaks-to-gene 连接

  • LinkPeaks() 识别 peaks 与靶基因的潜在调控关系
  • 若仅有单组学数据,可考虑 imputation 或 pseudo-bulk 建立表达与可及性的对应;最佳做法是一胞多组学数据进行直接验证

7.3 发育轨迹/伪时分析

  • 在整合空间上进行细胞轨迹推断
  • 对比基因表达与可及性沿轨迹的动态变化

7.4 差异可及性与差异表达

  • 比较不同细胞类型/状态的差异 peaks 与差异基因
  • 识别细胞类型特异的调控元件

7.5 功能富集

  • 对差异基因或差异 peaks 关联基因做 GO/KEGG 等富集
  • 结合已知通路解释细胞功能特征
R
sessionInfo()
output
R version 4.3.3 (2024-02-29)
Platform: x86_64-conda-linux-gnu (64-bit)
Running under: Debian GNU/Linux 12 (bookworm)

Matrix products: default
BLAS/LAPACK: /jp_envs/envs/common/lib/libopenblasp-r0.3.29.so; LAPACK version 3.12.0

locale:
[1] LC_CTYPE=C.UTF-8 LC_NUMERIC=C LC_TIME=C.UTF-8
[4] LC_COLLATE=C.UTF-8 LC_MONETARY=C.UTF-8 LC_MESSAGES=C.UTF-8
[7] LC_PAPER=C.UTF-8 LC_NAME=C LC_ADDRESS=C
[10] LC_TELEPHONE=C LC_MEASUREMENT=C.UTF-8 LC_IDENTIFICATION=C

time zone: Asia/Shanghai
tzcode source: system (glibc)

attached base packages:
[1] stats4 stats graphics grDevices utils datasets methods
[8] base

other attached packages:
[1] future_1.40.0 repr_1.1.7
[3] patchwork_1.3.0 ggplot2_3.5.2
[5] dplyr_1.1.4 biovizBase_1.50.0
[7] BSgenome.Hsapiens.UCSC.hg38_1.4.5 BSgenome_1.70.1
[9] rtracklayer_1.62.0 BiocIO_1.12.0
[11] Biostrings_2.70.1 XVector_0.42.0
[13] EnsDb.Hsapiens.v86_2.99.0 ensembldb_2.26.0
[15] AnnotationFilter_1.26.0 GenomicFeatures_1.54.1
[17] AnnotationDbi_1.64.1 Biobase_2.62.0
[19] GenomicRanges_1.54.1 GenomeInfoDb_1.38.1
[21] IRanges_2.36.0 S4Vectors_0.40.2
[23] BiocGenerics_0.48.1 Signac_1.10.0
[25] SeuratObject_4.1.4 Seurat_4.4.0

loaded via a namespace (and not attached):
[1] ProtGenerics_1.34.0 matrixStats_1.5.0
[3] spatstat.sparse_3.1-0 bitops_1.0-9
[5] httr_1.4.7 RColorBrewer_1.1-3
[7] tools_4.3.3 sctransform_0.4.1
[9] backports_1.5.0 R6_2.6.1
[11] lazyeval_0.2.2 uwot_0.2.3
[13] withr_3.0.2 sp_2.2-0
[15] prettyunits_1.2.0 gridExtra_2.3
[17] progressr_0.15.1 cli_3.6.4
[19] Cairo_1.6-2 spatstat.explore_3.4-2
[21] labeling_0.4.3 spatstat.data_3.1-6
[23] ggridges_0.5.6 pbapply_1.7-2
[25] Rsamtools_2.18.0 pbdZMQ_0.3-13
[27] foreign_0.8-87 R.utils_2.13.0
[29] dichromat_2.0-0.1 parallelly_1.43.0
[31] rstudioapi_0.15.0 RSQLite_2.3.9
[33] generics_0.1.3 ica_1.0-3
[35] spatstat.random_3.3-3 Matrix_1.6-5
[37] ggbeeswarm_0.7.2 abind_1.4-5
[39] R.methodsS3_1.8.2 lifecycle_1.0.4
[41] yaml_2.3.10 SummarizedExperiment_1.32.0
[43] SparseArray_1.2.2 BiocFileCache_2.10.1
[45] Rtsne_0.17 grid_4.3.3
[47] blob_1.2.4 promises_1.3.2
[49] crayon_1.5.3 miniUI_0.1.1.1
[51] lattice_0.22-7 cowplot_1.1.3
[53] KEGGREST_1.42.0 pillar_1.10.2
[55] knitr_1.49 rjson_0.2.23
[57] future.apply_1.11.3 codetools_0.2-20
[59] fastmatch_1.1-6 leiden_0.4.3.1
[61] glue_1.8.0 spatstat.univar_3.1-2
[63] data.table_1.17.0 vctrs_0.6.5
[65] png_0.1-8 gtable_0.3.6
[67] cachem_1.1.0 xfun_0.50
[69] S4Arrays_1.2.0 mime_0.13
[71] survival_3.8-3 RcppRoll_0.3.1
[73] fitdistrplus_1.2-2 ROCR_1.0-11
[75] nlme_3.1-168 bit64_4.5.2
[77] progress_1.2.3 filelock_1.0.3
[79] RcppAnnoy_0.0.22 irlba_2.3.5.1
[81] vipor_0.4.7 KernSmooth_2.23-26
[83] rpart_4.1.23 colorspace_2.1-1
[85] DBI_1.2.3 Hmisc_5.2-1
[87] nnet_7.3-19 ggrastr_1.0.2
[89] tidyselect_1.2.1 bit_4.5.0.1
[91] compiler_4.3.3 curl_6.0.1
[93] htmlTable_2.4.3 xml2_1.3.6
[95] DelayedArray_0.28.0 plotly_4.10.4
[97] checkmate_2.3.2 scales_1.3.0
[99] lmtest_0.9-40 rappdirs_0.3.3
[101] stringr_1.5.1 digest_0.6.37
[103] goftest_1.2-3 spatstat.utils_3.1-3
[105] rmarkdown_2.29 htmltools_0.5.8.1
[107] pkgconfig_2.0.3 base64enc_0.1-3
[109] MatrixGenerics_1.14.0 dbplyr_2.5.0
[111] fastmap_1.2.0 rlang_1.1.5
[113] htmlwidgets_1.6.4 shiny_1.10.0
[115] farver_2.1.2 zoo_1.8-14
[117] jsonlite_2.0.0 BiocParallel_1.36.0
[119] R.oo_1.27.0 VariantAnnotation_1.48.1
[121] RCurl_1.98-1.16 magrittr_2.0.3
[123] Formula_1.2-5 GenomeInfoDbData_1.2.11
[125] IRkernel_1.3.2 munsell_0.5.1
[127] Rcpp_1.0.14 reticulate_1.42.0
[129] stringi_1.8.7 zlibbioc_1.48.0
[131] MASS_7.3-60.0.1 plyr_1.8.9
[133] parallel_4.3.3 listenv_0.9.1
[135] ggrepel_0.9.6 deldir_2.0-4
[137] IRdisplay_1.1 splines_4.3.3
[139] tensor_1.5 hms_1.1.3
[141] igraph_2.0.3 uuid_1.2-1
[143] spatstat.geom_3.3-6 reshape2_1.4.4
[145] biomaRt_2.58.0 XML_3.99-0.17
[147] evaluate_1.0.3 httpuv_1.6.15
[149] RANN_2.6.2 tidyr_1.3.1
[151] purrr_1.0.4 polyclip_1.10-7
[153] scattermore_1.2 xtable_1.8-4
[155] restfulr_0.0.15 later_1.4.2
[157] viridisLite_0.4.2 tibble_3.2.1
[159] memoise_2.0.1 beeswarm_0.4.0
[161] GenomicAlignments_1.38.0 cluster_2.1.8.1
[163] globals_0.16.3
0 条评论·0 条回复