跳转至

177_scATAC-seq数据预处理

一句话概述

单细胞ATAC-seq(scATAC-seq)数据预处理包括比对、去重、质控、片段文件生成、peak calling和特征矩阵构建,是后续聚类和细胞类型注释的基础,主要使用CellRanger-ATAC、ArchR或Signac等工具完成。

核心知识点表格

知识点说明
scATAC-seq原理利用Tn5转座酶切割开放染色质区域,检测单细胞水平的染色质可及性
核心输出fragments.tsv.gz片段文件
主要质控指标TSS enrichment、片段数、核小体信号、FRiP
Peak calling使用MACS2在聚合数据上调用peaks
特征矩阵peak-by-cell稀疏二值/计数矩阵
降维方法TF-IDF + LSI(Latent Semantic Indexing)
分析工具CellRanger-ATAC、ArchR、Signac(Seurat扩展)
与scRNA-seq区别信号稀疏、二值化特征、需要不同的标准化策略

步骤详解

第一步:CellRanger-ATAC上游处理

白话解释:CellRanger-ATAC是10x Genomics提供的官方流程,从原始FASTQ文件开始,完成比对、去重、细胞过滤和片段文件生成。就像scRNA-seq用CellRanger一样。

技术细节:CellRanger-ATAC内部使用BWA进行比对,自动过滤低质量reads和PCR重复,生成fragments.tsv.gz(每行记录一个片段的染色体、起止位置和所属barcode)。

# 下载参考基因组
cellranger-atac mkref \
    --config=refdata-config.yaml

# 或使用预构建的参考
# 下载 refdata-cellranger-arc-GRCh38-2020-A-2.0.0

# 运行CellRanger-ATAC
cellranger-atac count \
    --id=sample1 \
    --reference=/path/to/refdata-cellranger-atac-GRCh38-2020-A-2.0.0 \
    --fastqs=/path/to/fastqs/ \
    --sample=Sample1 \
    --localcores=16 \
    --localmem=64

# 主要输出文件
# outs/fragments.tsv.gz        # 片段文件(最重要)
# outs/fragments.tsv.gz.tbi    # 索引文件
# outs/filtered_peak_bc_matrix/ # peak-cell矩阵
# outs/singlecell.csv          # 单细胞指标
# outs/peaks.bed                # 调用的peaks
# outs/summary.json             # 汇总统计

第二步:使用Signac进行质控

白话解释:质控是决定哪些细胞数据可用的关键步骤。好的细胞应该有足够多的片段、高的TSS富集分数和清晰的核小体模式。

技术细节:关键QC指标:(1) TSS enrichment score - 转录起始位点的信号富集,反映信噪比;(2) nucleosome signal - 核小体周期性片段模式;(3) FRiP - peaks中的片段比例;(4) blacklist ratio - 黑名单区域的片段比例。

library(Signac)
library(Seurat)
library(GenomeInfoDb)
library(EnsDb.Hsapiens.v86)

# 加载数据
counts <- Read10X_h5("outs/filtered_peak_bc_matrix.h5")
metadata <- read.csv("outs/singlecell.csv", header = TRUE, row.names = 1)

# 创建ChromatinAssay
chrom_assay <- CreateChromatinAssay(
  counts = counts,
  sep = c(":", "-"),
  fragments = "outs/fragments.tsv.gz",
  min.cells = 10,
  min.features = 200
)

# 创建Seurat对象
pbmc <- CreateSeuratObject(
  counts = chrom_assay,
  assay = "peaks",
  meta.data = metadata
)

# 添加基因注释
annotations <- GetGRangesFromEnsDb(ensdb = EnsDb.Hsapiens.v86)
seqlevelsStyle(annotations) <- "UCSC"
Annotation(pbmc) <- annotations

# 计算QC指标
pbmc <- NucleosomeSignal(pbmc)         # 核小体信号
pbmc <- TSSEnrichment(pbmc, fast = FALSE) # TSS富集

# 查看QC指标
head(pbmc@meta.data[, c("nCount_peaks", "TSS.enrichment",
                          "nucleosome_signal", "blacklist_ratio")])

第三步:质控过滤

# 可视化QC指标
library(ggplot2)
library(patchwork)

p1 <- VlnPlot(pbmc, features = "nCount_peaks", pt.size = 0) + NoLegend()
p2 <- VlnPlot(pbmc, features = "TSS.enrichment", pt.size = 0) + NoLegend()
p3 <- VlnPlot(pbmc, features = "nucleosome_signal", pt.size = 0) + NoLegend()
p4 <- VlnPlot(pbmc, features = "blacklist_ratio", pt.size = 0) + NoLegend()
p1 | p2 | p3 | p4

# TSS富集图(应该呈现以TSS为中心的尖峰)
TSSPlot(pbmc, group.by = "high.tss") + NoLegend()

# 片段长度分布(应看到核小体周期性:~200bp, ~400bp)
FragmentHistogram(pbmc)

# 过滤细胞
pbmc <- subset(
  pbmc,
  subset = nCount_peaks > 3000 &      # 最小片段数
    nCount_peaks < 100000 &            # 最大片段数(去除doublet)
    TSS.enrichment > 3 &              # TSS富集
    nucleosome_signal < 4 &            # 核小体信号
    blacklist_ratio < 0.01             # 黑名单比例
)

cat("过滤后细胞数:", ncol(pbmc), "\n")

第四步:标准化与降维

白话解释:scATAC-seq不能像scRNA-seq那样用简单的log标准化,而是用TF-IDF(词频-逆文档频率),然后用LSI(类似PCA的方法)降维。

技术细节:TF-IDF借鉴自自然语言处理:TF是每个peak在每个细胞中的频率,IDF降低普遍存在的peak的权重。LSI然后对TF-IDF矩阵做SVD分解。注意第一个LSI分量通常与测序深度相关,应该被排除。

# 标准化:TF-IDF
pbmc <- RunTFIDF(pbmc)

# 选择top features
pbmc <- FindTopFeatures(pbmc, min.cutoff = "q0")

# LSI降维
pbmc <- RunSVD(pbmc)

# 检查LSI分量与测序深度的相关性
DepthCor(pbmc)
# 第1个分量通常与深度高度相关,聚类时应排除

# UMAP可视化
pbmc <- RunUMAP(pbmc, reduction = "lsi", dims = 2:30)  # 排除第1个分量
pbmc <- FindNeighbors(pbmc, reduction = "lsi", dims = 2:30)
pbmc <- FindClusters(pbmc, algorithm = 3, resolution = 0.5)

DimPlot(pbmc, label = TRUE) + NoLegend()

第五步:使用ArchR进行预处理(替代方案)

白话解释:ArchR是另一个流行的scATAC-seq分析框架,使用Arrow文件存储数据,支持更大规模的数据集和更多的功能。

library(ArchR)

# 设置参考基因组
addArchRGenome("hg38")

# 创建Arrow文件
ArrowFiles <- createArrowFiles(
  inputFiles = "outs/fragments.tsv.gz",
  sampleNames = "sample1",
  minTSS = 4,            # 最低TSS enrichment
  minFrags = 1000,        # 最低片段数
  addTileMat = TRUE,      # 添加tile矩阵
  addGeneScoreMat = TRUE  # 添加基因评分矩阵
)

# 创建ArchR项目
proj <- ArchRProject(
  ArrowFiles = ArrowFiles,
  outputDirectory = "ArchR_output",
  copyArrows = TRUE
)

# Doublet检测
proj <- addDoubletScores(proj)
proj <- filterDoublets(proj)

# LSI降维
proj <- addIterativeLSI(
  proj,
  useMatrix = "TileMatrix",
  name = "IterativeLSI",
  iterations = 2,
  clusterParams = list(resolution = c(0.2), sampleCells = 10000),
  varFeatures = 25000
)

# 聚类
proj <- addClusters(proj, reducedDims = "IterativeLSI", resolution = 0.8)

# UMAP
proj <- addUMAP(proj, reducedDims = "IterativeLSI")

# 可视化
plotEmbedding(proj, colorBy = "cellColData", name = "Clusters")

实战命令速查

# CellRanger-ATAC快速运行
cellranger-atac count --id=sample --reference=refdata --fastqs=fastqs/ --localcores=16

# 检查fragments文件
zcat fragments.tsv.gz | head -5
# chr1    10073   10133   ACGTACGTACGTACGT-1    1

# 对fragments文件建索引(如缺失)
tabix -p bed fragments.tsv.gz

# 统计片段数
zcat fragments.tsv.gz | wc -l

# 片段数每个barcode的分布
zcat fragments.tsv.gz | cut -f4 | sort | uniq -c | sort -rn | head
# Signac快速流程
pbmc <- CreateSeuratObject(counts = CreateChromatinAssay(counts, fragments = "fragments.tsv.gz"))
pbmc <- NucleosomeSignal(pbmc)
pbmc <- TSSEnrichment(pbmc)
pbmc <- subset(pbmc, nCount_peaks > 3000 & TSS.enrichment > 3)
pbmc <- RunTFIDF(pbmc) %>% FindTopFeatures() %>% RunSVD() %>%
  RunUMAP(reduction = "lsi", dims = 2:30) %>%
  FindNeighbors(reduction = "lsi", dims = 2:30) %>%
  FindClusters(resolution = 0.5)

面试常问点

Q1: scATAC-seq和scRNA-seq的数据特点有什么不同? A: scATAC-seq数据极度稀疏(每个peak在每个细胞中通常只有0或1个片段),特征空间巨大(数十万peaks),二值化特征。scRNA-seq虽然也稀疏,但基因数量有限(~2-3万),counts值可以>1。这导致两者的标准化、降维和聚类方法完全不同。

Q2: 为什么scATAC-seq用TF-IDF+LSI而不是PCA? A: scATAC-seq的peak矩阵近似二值化,不符合PCA假设的正态分布。TF-IDF来自文本分析,适合处理稀疏的出现/缺失数据。LSI是对TF-IDF矩阵做SVD,等价于文本分析中的潜在语义分析,能有效提取主要变异模式。

Q3: TSS enrichment score反映了什么? A: TSS enrichment score衡量转录起始位点附近的片段富集程度。高质量的ATAC-seq数据应该在TSS处有显著的信号富集(因为启动子区域通常是开放的)。低TSS enrichment表明信噪比差,可能是死细胞或技术问题。

Q4: 第一个LSI分量为什么要排除? A: 第一个LSI分量通常与测序深度(total fragment count)高度相关,反映的是技术变异而非生物学差异。包含它会导致聚类主要由测序深度驱动。可以用DepthCor函数检查每个分量与深度的相关性。

Q5: 如何处理scATAC-seq中的doublet? A: ArchR内置了doublet检测功能(addDoubletScores),基于模拟合成doublet的方法。Signac中可以使用AMULET工具。doublet在scATAC中比scRNA更难检测,因为数据更稀疏。

Q6: Gene activity score是什么? A: 由于scATAC-seq不直接测量基因表达,可以通过计算每个基因body和启动子区域的ATAC片段数来估计"基因活性"。这个score可用于初步细胞类型注释,但准确性不如直接的scRNA-seq。

易错点

  1. fragments文件缺少索引:Signac需要.tbi索引文件,缺失会报错。用tabix重建索引
  2. 参考基因组版本不一致:注释文件的基因组版本必须与比对使用的参考一致
  3. 过滤阈值过严或过松:TSS enrichment和片段数阈值需根据具体数据调整,不能照搬默认值
  4. LSI dims选择不当:dims参数应排除与深度相关的分量,具体要看DepthCor结果
  5. Peak calling策略:在所有细胞上联合call peaks还是按cluster分别call会影响结果

补充知识

scATAC-seq质控标准参考值

指标优秀可接受
TSS enrichment>104-10<4
片段数/细胞>10,0003,000-10,000<3,000
FRiP>0.30.15-0.3<0.15
Blacklist ratio<0.0050.005-0.02>0.02

Signac vs ArchR对比

特性SignacArchR
框架Seurat扩展独立R包
数据存储内存Arrow文件(磁盘)
大数据支持一般好(适合>10万细胞)
学习曲线低(熟悉Seurat即可)中等
多样本整合需手动处理内置支持