数据清洗与批次效应处理(Data Cleaning & Batch Effect Correction)¶
一句话说明¶
数据清洗是把"脏数据"变成"可分析数据"的过程,批次效应校正是把"不同批次测出来的系统偏差"消除掉——两者都是拿到原始数据后、做正式分析前的必经步骤。(28_生物统计实验设计讲的是"怎么设计实验避免问题",本篇讲的是"数据已经到手了怎么处理问题"。)
数据清洗流程(通用五步法)¶
白话说:就像炒菜前洗菜、摘烂叶子、切整齐。数据也要先"洗"干净才能分析。
第一步:缺失值处理¶
# ===== R语言:检查缺失值 =====
library(tidyverse) # 加载数据处理包
# 读取表达矩阵(行=基因,列=样本)
expr <- read.csv("expression_matrix.csv", row.names = 1)
# 查看每列缺失值数量
colSums(is.na(expr)) # 按样本统计NA数量
# 查看缺失比例
missing_rate <- colMeans(is.na(expr)) # 每个样本的缺失比例
print(missing_rate)
# 策略1:删除缺失值过多的样本(>20%缺失就删)
expr_clean <- expr[, missing_rate < 0.2]
# 策略2:用中位数填充(适合表达数据)
expr_filled <- expr %>%
mutate(across(everything(), ~ifelse(is.na(.), median(., na.rm = TRUE), .)))
# across(everything()) = 对每一列操作
# ifelse(is.na(.), median(.), .) = 如果是NA就用中位数替代,否则保持原值
# 策略3:用KNN填充(更智能,考虑相邻样本的值)
library(impute) # Bioconductor的填充包
expr_knn <- impute.knn(as.matrix(expr), k = 10)$data
# k=10 表示用最近的10个基因的值来估算缺失值
面试怎么说缺失值处理策略: | 情况 | 推荐策略 | 理由 | |------|---------|------| | 缺失<5% | 中位数/均值填充 | 影响小,简单有效 | | 缺失5-20% | KNN填充 | 利用相似样本信息,更准确 | | 缺失>20% | 删除该样本/基因 | 填充太多反而引入噪音 | | 非随机缺失 | 不能简单填充 | 需要调查原因(可能是实验失败) |
第二步:异常值检测¶
# ===== 异常值检测方法 =====
# 方法1:箱线图法(IQR法则)
detect_outliers_iqr <- function(x) {
Q1 <- quantile(x, 0.25, na.rm = TRUE) # 第一四分位数
Q3 <- quantile(x, 0.75, na.rm = TRUE) # 第三四分位数
IQR <- Q3 - Q1 # 四分位距
lower <- Q1 - 1.5 * IQR # 下界
upper <- Q3 + 1.5 * IQR # 上界
return(x < lower | x > upper) # 返回TRUE/FALSE标记
}
# 方法2:Z-score法(适合正态分布数据)
detect_outliers_zscore <- function(x, threshold = 3) {
z <- (x - mean(x, na.rm = TRUE)) / sd(x, na.rm = TRUE)
# z = (每个值 - 均值) / 标准差
return(abs(z) > threshold) # |z| > 3 视为异常
}
# 方法3:MAD法(中位数绝对偏差,对偏态数据更稳健)
detect_outliers_mad <- function(x, threshold = 3) {
med <- median(x, na.rm = TRUE)
mad_val <- mad(x, na.rm = TRUE) # MAD = median(|x - median(x)|) * 1.4826
modified_z <- 0.6745 * (x - med) / mad_val
return(abs(modified_z) > threshold)
}
第三步:重复值检查¶
# ===== 重复样本/重复基因检查 =====
# 检查是否有重复的样本名
duplicated_samples <- duplicated(colnames(expr))
cat("重复样本数:", sum(duplicated_samples), "\n")
# 检查是否有重复的基因名
duplicated_genes <- duplicated(rownames(expr))
cat("重复基因数:", sum(duplicated_genes), "\n")
# 处理重复基因:取表达量最大的那个(常见策略)
if (sum(duplicated_genes) > 0) {
expr$gene <- rownames(expr)
expr$max_expr <- rowMeans(expr[, -ncol(expr)]) # 计算每行均值
expr <- expr %>%
group_by(gene) %>% # 按基因名分组
slice_max(max_expr, n = 1) %>% # 每组保留均值最大的一行
ungroup()
rownames(expr) <- expr$gene
expr <- expr %>% select(-gene, -max_expr)
}
第四步:数据类型检查¶
# ===== 数据类型验证 =====
# 检查表达矩阵是否全是数值
str(expr) # 查看每列的数据类型
# 强制转换为数值型(有时读入的数据会变成字符型)
expr_numeric <- apply(expr, 2, as.numeric)
# apply(矩阵, 2, 函数) = 对每一列应用函数
# 2 表示按列操作(1表示按行)
# 检查转换后是否产生了新的NA(说明原数据有非数字字符)
new_na <- sum(is.na(expr_numeric)) - sum(is.na(expr))
if (new_na > 0) {
warning(paste("转换产生了", new_na, "个新的NA,请检查原始数据"))
}
第五步:标准化/归一化¶
# ===== 常见标准化方法 =====
# 方法1:log2转换(最常用,压缩数据范围)
expr_log <- log2(expr + 1)
# +1 防止 log(0) = -Inf
# 方法2:Z-score标准化(每个基因均值=0,标准差=1)
expr_zscore <- t(scale(t(expr)))
# scale() 默认对列标准化,所以先转置再转回来
# 效果:让不同基因的表达量可以直接比较
# 方法3:分位数标准化(quantile normalization,让样本间分布一致)
library(preprocessCore) # Bioconductor包
expr_qnorm <- normalize.quantiles(as.matrix(expr))
# 原理:让每个样本的表达值分布完全相同
# 方法4:TPM/FPKM/CPM(RNA-seq专用,考虑基因长度和测序深度)
# CPM = Counts Per Million
cpm <- t(t(expr) / colSums(expr) * 1e6)
# 每个值 / 该样本总reads数 × 100万
标准化方法选择指南: | 数据类型 | 推荐方法 | 白话解释 | |---------|---------|---------| | RNA-seq原始counts | log2(CPM+1)或DESeq2的VST | 先算CPM消除测序深度差异,再log压缩 | | 芯片数据 | 分位数标准化 | 让所有样本的分布形状一致 | | 宏基因组丰度 | TSS(总和缩放)或CLR | 组分数据用CLR变换更合理 | | 机器学习输入 | Z-score或Min-Max | 让不同特征的量纲一致 |
生信数据常见"坑"¶
1. 样本混淆(Sample Swap)¶
白话说:张三和李四的标签贴反了,你把张三的数据当李四分析了。
# ===== 检测样本混淆 =====
# 方法1:性别检查(如果有性别信息)
# XIST基因在女性高表达,Y染色体基因在男性高表达
xist_expr <- expr["XIST", ] # 提取XIST基因的表达
rps4y1_expr <- expr["RPS4Y1", ] # 提取Y染色体基因
# 画散点图,正常情况下应该分成两群(男/女)
plot(as.numeric(xist_expr), as.numeric(rps4y1_expr),
xlab = "XIST (女性标志)", ylab = "RPS4Y1 (男性标志)",
main = "性别检查:发现样本混淆")
# 如果有样本落在"错误"的群里,说明标签可能贴反了
# 方法2:SNP指纹检测(更可靠)
# 用样本的遗传变异谱做"身份证"比对
2. 文件格式错误¶
| 常见错误 | 症状 | 解决方法 |
|---|---|---|
| 行列转置 | 基因数=几十,样本数=几万 | 转置矩阵 t(expr) |
| 分隔符错误 | 只有一列,值都粘在一起 | 换用 read.delim() 或指定 sep="\t" |
| 编码问题 | 中文乱码、特殊字符 | 指定 encoding="UTF-8" |
| 表头偏移 | 第一行数据被当成列名 | 加 header=FALSE 或 skip=1 |
| Excel日期陷阱 | 基因名MARCH1变成了日期"3月1日" | 用纯文本格式保存,或读入时指定列类型 |
3. 低质量样本识别¶
# ===== 低质量样本筛查 =====
# 指标1:文库大小(总reads数太少 = 测序深度不够)
lib_size <- colSums(expr) # 每个样本的总reads数
low_depth <- lib_size < quantile(lib_size, 0.05) # 低于5%分位数
# 指标2:检测到的基因数太少
genes_detected <- colSums(expr > 0) # 每个样本表达>0的基因数
low_genes <- genes_detected < quantile(genes_detected, 0.05)
# 指标3:线粒体基因比例过高(常用于单细胞,比例高=细胞破损)
mt_genes <- grep("^MT-", rownames(expr), value = TRUE) # 找线粒体基因
mt_pct <- colSums(expr[mt_genes, ]) / colSums(expr) * 100
high_mt <- mt_pct > 20 # 线粒体比例>20%视为低质量
# 综合标记低质量样本
bad_samples <- low_depth | low_genes | high_mt
cat("低质量样本数:", sum(bad_samples), "\n")
4. GC偏差(GC Bias)¶
白话说:基因组里GC含量(G和C碱基的比例)不同的区域,测序效率不一样——GC含量过高或过低的区域reads偏少,导致这些区域的基因表达量被低估。
# ===== GC偏差检查与校正 =====
# 检查:按GC含量分组,看表达量是否均匀
# 通常用EDASeq或cqn包校正
library(EDASeq) # Bioconductor的GC校正包
# 获取基因的GC含量信息
# gene_gc <- getGeneLengthAndGCContent(rownames(expr), "hsa")
# 校正GC偏差
# expr_gc_corrected <- withinLaneNormalization(expr, gene_gc$gc, which = "full")
# withinLaneNormalization = 在同一个样本内,消除GC含量对表达量的影响
批次效应:检测方法¶
什么是批次效应¶
白话说:同样的样本,周一做和周三做结果不一样;同样的实验,A实验室做和B实验室做结果不一样——这种和生物学无关、纯粹由实验条件不同引起的系统性偏差就是批次效应。
常见批次来源: | 批次来源 | 白话解释 | |---------|---------| | 不同日期提取RNA | 周一和周五的试剂可能不同批号 | | 不同测序lane | 测序仪不同通道的信号强度有差异 | | 不同操作人员 | 每个人的手法和习惯不同 | | 不同试剂批号 | 同一种试剂不同批次的效果有差异 | | 不同仪器 | 不同型号的测序仪参数不同 |
检测方法1:PCA着色法(最直观)¶
# ===== PCA着色检测批次效应 =====
library(ggplot2)
# 准备数据:log转换 + 标准化
expr_log <- log2(expr + 1)
# 做PCA
pca_result <- prcomp(t(expr_log), scale. = TRUE)
# prcomp = 主成分分析函数
# t() = 转置(PCA需要样本在行、基因在列)
# scale. = TRUE 表示先标准化
# 提取PC1和PC2
pca_df <- data.frame(
PC1 = pca_result$x[, 1], # 第一主成分
PC2 = pca_result$x[, 2], # 第二主成分
Batch = metadata$batch, # 批次信息
Group = metadata$condition # 生物学分组(如T2D vs 健康)
)
# 按批次着色
ggplot(pca_df, aes(x = PC1, y = PC2, color = Batch, shape = Group)) +
geom_point(size = 3) + # 画散点
theme_minimal() + # 简洁主题
labs(title = "PCA: 按批次着色 (校正前)")
# 如果样本主要按批次聚类而非按生物学分组聚类 → 有批次效应
# 理想情况:同一生物组的样本聚在一起,不管它们来自哪个批次
检测方法2:MDS(多维缩放)¶
# ===== MDS检测批次效应 =====
library(limma)
# plotMDS是limma包自带的快速MDS可视化
plotMDS(expr_log,
col = as.numeric(factor(metadata$batch)), # 按批次着色
pch = 16, # 实心圆点
main = "MDS: 批次效应检测")
legend("topright", levels(factor(metadata$batch)),
col = 1:nlevels(factor(metadata$batch)), pch = 16)
# MDS和PCA类似,但基于样本间距离而非方差分解
检测方法3:kBET(定量评估)¶
# ===== kBET:定量检测批次效应 =====
# kBET = k-nearest neighbour Batch Effect Test
# 原理:检查每个样本的k个最近邻里,各批次的比例是否符合总体比例
library(kBET) # 需要从GitHub安装
# 运行kBET
kbet_result <- kBET(
df = t(expr_log), # 表达矩阵(样本在行)
batch = metadata$batch, # 批次标签
k0 = 25 # k值(检查最近的25个邻居)
)
# 查看结果
cat("kBET拒绝率:", kbet_result$summary$kBET.observed[1], "\n")
# 拒绝率高 = 批次效应严重
# 拒绝率接近0 = 批次混合良好
检测方法4:LISI(局部逆辛普森指数)¶
# ===== LISI:评估批次混合程度 =====
# LISI = Local Inverse Simpson Index
# 由Harmony的作者提出,越高表示混合越好
library(lisi) # 安装:install.packages("lisi")
# 计算LISI
lisi_result <- compute_lisi(
X = pca_result$x[, 1:20], # 用PCA前20个主成分
meta_data = metadata, # 元数据
label_colnames = c("batch") # 要评估的标签列
)
cat("平均LISI:", mean(lisi_result$batch), "\n")
# LISI = 1 → 邻居全来自同一批次(批次效应严重)
# LISI = 批次数 → 邻居来自所有批次(完美混合)
批次效应:校正工具¶
工具1:ComBat(Bulk RNA-seq/芯片,最经典)¶
ComBat来自sva包(Bioconductor),基于经验贝叶斯方法(Empirical Bayes),是批次校正的"金标准"。
# ===== ComBat校正 =====
library(sva) # 安装:BiocManager::install("sva")
# 准备模型矩阵(保留你关心的生物学差异)
mod <- model.matrix(~condition, data = metadata)
# ~condition 表示"保留condition(如T2D vs 健康)的差异"
# 这很关键:不加mod,ComBat可能把生物学差异也消掉
# 运行ComBat
expr_combat <- ComBat(
dat = as.matrix(expr_log), # 表达矩阵(已log转换)
batch = metadata$batch, # 批次标签
mod = mod # 模型矩阵(保留生物学差异)
)
# ComBat的原理:
# 1. 估计每个批次的均值偏移和方差缩放
# 2. 用贝叶斯方法"借力"其他基因的信息,让估计更稳定
# 3. 把每个批次的数据调整到统一水平
# 校正后再做PCA验证
pca_after <- prcomp(t(expr_combat), scale. = TRUE)
# 重新画PCA图,确认样本不再按批次聚类
ComBat注意事项: - 输入数据需要先log转换 - 必须指定mod保留生物学变量 - 批次和生物分组不能完全混杂(如:所有T2D在batch1、所有健康在batch2 → ComBat无法区分) - 适合:Bulk RNA-seq、芯片数据、蛋白组数据
工具2:limma::removeBatchEffect(线性模型法)¶
# ===== limma::removeBatchEffect =====
library(limma) # Bioconductor核心包
# removeBatchEffect用线性回归去除批次效应
expr_limma <- removeBatchEffect(
x = expr_log, # 表达矩阵
batch = metadata$batch, # 批次变量
design = model.matrix(~condition, data = metadata)
# design矩阵保护生物学差异不被消除
)
# 注意:removeBatchEffect产生的校正数据仅用于可视化和探索
# 做差异分析时,应在limma的线性模型里直接加入batch作为协变量:
# design <- model.matrix(~condition + batch, data = metadata)
# 这样更统计正确
ComBat vs removeBatchEffect对比: | 特性 | ComBat | removeBatchEffect | |------|--------|-------------------| | 方法 | 经验贝叶斯 | 线性回归 | | 小样本表现 | 更稳定(贝叶斯借力) | 可能不稳定 | | 推荐场景 | 通用,尤其小样本 | 可视化用途,差异分析直接加协变量 | | 来源包 | sva | limma |
工具3:Harmony(单细胞,速度快)¶
Harmony是2019年Nature Methods发表的单细胞批次校正算法,速度快、效果好,目前是单细胞整合的主流工具之一。R包版本2.0.2(2024年更新),Python版本harmonypy 2.0.0。
# ===== Harmony批次校正(单细胞) =====
library(Seurat) # 单细胞分析框架
library(harmony) # 安装:install.packages("harmony")
# 假设已有Seurat对象 seurat_obj,包含多个批次的单细胞数据
# 先做标准预处理
seurat_obj <- NormalizeData(seurat_obj) # 归一化
seurat_obj <- FindVariableFeatures(seurat_obj) # 找高变基因
seurat_obj <- ScaleData(seurat_obj) # 标准化
seurat_obj <- RunPCA(seurat_obj) # 降维
# 运行Harmony
seurat_obj <- RunHarmony(
seurat_obj,
group.by.vars = "batch", # 按哪个变量校正
dims.use = 1:30 # 用前30个PC
)
# Harmony的原理:
# 1. 在PCA空间中迭代聚类
# 2. 让每个聚类内的批次比例趋于一致
# 3. 调整PCA坐标,输出校正后的embedding
# 用Harmony的结果做后续分析
seurat_obj <- RunUMAP(seurat_obj, reduction = "harmony", dims = 1:30)
seurat_obj <- FindNeighbors(seurat_obj, reduction = "harmony", dims = 1:30)
seurat_obj <- FindClusters(seurat_obj, resolution = 0.5)
# 可视化对比
DimPlot(seurat_obj, group.by = "batch") # 按批次着色
DimPlot(seurat_obj, group.by = "celltype") # 按细胞类型着色
工具4:MNN(互近邻法)¶
MNN(Mutual Nearest Neighbors)由Haghverdi et al. 2018 Nature Biotechnology提出,核心思想是找到不同批次中互为最近邻的细胞对,用它们估计批次偏移。
# ===== MNN校正(单细胞) =====
library(batchelor) # Bioconductor包,BiocManager::install("batchelor")
# 假设有两个批次的SingleCellExperiment对象
# batch1_sce, batch2_sce
# 运行MNN
mnn_result <- fastMNN(
batch1_sce,
batch2_sce,
d = 50 # 保留前50个主成分
)
# fastMNN比原始MNN快很多
# 原理:
# 1. 在两个批次中找互近邻对(A的最近邻是B中的某个细胞,反之亦然)
# 2. 用这些配对估计批次间的偏移向量
# 3. 校正PCA空间中的坐标
# 提取校正后的低维表示
corrected_pcs <- reducedDim(mnn_result, "corrected")
工具5:scVI(深度学习方法,单细胞)¶
scVI使用变分自编码器(VAE)学习数据的潜在表示,同时将批次作为条件变量——是目前最灵活的单细胞批次校正方法之一。Python包scvi-tools最新版本1.4.2。
# ===== scVI批次校正(Python) =====
import scvi # pip install scvi-tools
import scanpy as sc # pip install scanpy
# 读取数据
adata = sc.read_h5ad("single_cell_data.h5ad")
# 预处理
sc.pp.highly_variable_genes(adata, n_top_genes=2000)
# 选择2000个高变基因用于建模
# 设置scVI模型
scvi.model.SCVI.setup_anndata(
adata,
batch_key="batch" # 指定批次变量
)
# 训练模型
model = scvi.model.SCVI(
adata,
n_latent=30, # 潜在空间维度
n_layers=2, # 神经网络层数
gene_likelihood="nb" # 负二项分布(适合count数据)
)
model.train(max_epochs=200) # 训练200轮
# 获取校正后的潜在表示
adata.obsm["X_scVI"] = model.get_latent_representation()
# 这个潜在表示已经消除了批次效应
# 用scVI的结果做聚类和可视化
sc.pp.neighbors(adata, use_rep="X_scVI") # 基于scVI结果找邻居
sc.tl.umap(adata) # UMAP降维
sc.tl.leiden(adata) # Leiden聚类
# 可视化
sc.pl.umap(adata, color=["batch", "cell_type"])
单细胞批次校正工具对比: | 工具 | 方法 | 速度 | 适合场景 | 注意事项 | |------|------|------|---------|---------| | Harmony | 迭代聚类 | 最快 | 多数场景首选 | 只校正PCA embedding | | MNN | 互近邻配对 | 中等 | 数据集较小 | 对细胞类型比例敏感 | | scVI | 深度学习(VAE) | 较慢 | 大规模、复杂批次 | 需要GPU,结果不完全确定性 | | Scanorama | SVD+MNN | 中等 | 多数据集整合 | 内存占用较大 | | BBKNN | 批次感知KNN | 快 | 批次差异不大时 | 只修改邻居图 |
和T2D项目的关联¶
在T2D肠道菌群项目中:
- 数据清洗:宏基因组数据的物种丰度表经常有大量0值(某个菌在某些样本中未检测到),需要判断是"真的没有"还是"测序深度不够"
- 批次效应:如果样本在不同时间送测、使用不同DNA提取方法或不同测序平台(如Illumina NovaSeq vs HiSeq),都会产生批次效应
- 具体处理流程:
- 先做质控(fastp/Trimmomatic)去除低质量reads
- 检查测序深度分布,标记深度过低的样本
- 用PCA着色检查有无批次效应
- 如果有,在差异分析中加入batch作为协变量(比直接用ComBat更推荐)
- 机器学习场景:训练随机森林前,必须确认训练集和测试集不存在批次混杂,否则模型学到的可能是"批次特征"而非"疾病特征"
面试怎么答(5道)¶
Q1:你拿到一批表达数据后,第一步做什么?¶
答:"先做数据清洗和质量检查。具体包括:(1) 检查缺失值比例,决定填充还是删除;(2) 检查异常值(用箱线图或Z-score法);(3) 核对样本信息和元数据是否匹配;(4) 检查有无样本混淆(比如通过XIST/Y染色体基因验证性别);(5) 查看文库大小分布,标记低质量样本。这些做完了才开始正式分析。"
Q2:怎么判断你的数据有没有批次效应?¶
答:"最直观的方法是做PCA,按批次信息着色——如果样本主要按批次聚类而非按生物学分组聚类,说明有批次效应。定量上可以用kBET(检查最近邻中批次比例是否均匀)或LISI指数。另外,还可以看差异基因和批次的关联程度。"
Q3:ComBat和limma的removeBatchEffect有什么区别?¶
答:"两者都能去除批次效应,但原理不同。ComBat用经验贝叶斯方法,在小样本时更稳定,因为它会'借力'其他基因的信息来稳定估计。removeBatchEffect用简单线性回归,适合快速可视化。做差异分析时,更推荐在limma的设计矩阵里直接加入batch协变量,而不是先用removeBatchEffect校正再分析。"
Q4:单细胞数据整合用什么工具?怎么选?¶
答:"主流工具有Harmony、MNN(batchelor包的fastMNN)、scVI等。Harmony速度最快,是多数场景的首选,它在PCA空间里迭代调整。scVI基于深度学习,处理大规模数据和复杂批次效应更灵活,但需要GPU。选择时看三点:数据规模(大数据选Harmony或scVI)、批次差异程度(大差异用scVI)、和计算资源(没GPU就用Harmony)。校正后用kBET或LISI定量评估效果。"
Q5:批次效应和生物学差异混杂了怎么办?¶
答:"这是最棘手的情况——如果所有disease样本在batch1、所有control在batch2,统计上无法区分批次效应和疾病效应。处理策略有:(1) 实验设计阶段就要避免(这是最优解,每个批次都包含各组样本);(2) 如果已经发生,可以在每个批次中加入重叠样本(bridging samples)用于估计批次偏移;(3) 用外部参考数据集验证你的发现是否在无混杂的数据中也能复现。总之,预防胜于治疗。"
速查表¶
数据清洗检查清单¶
| 检查项 | 命令/方法 | 判断标准 |
|---|---|---|
| 缺失值 | colSums(is.na(expr)) | <5%填充,>20%删除 |
| 异常值 | Z-score / IQR / MAD | |Z| > 3 或 超出1.5倍IQR |
| 重复值 | duplicated() | 取最大值或均值合并 |
| 数据类型 | str(expr) | 所有列应为numeric |
| 样本混淆 | XIST/Y染色体基因 | 性别标签与表达一致 |
| 文库大小 | colSums(expr) | 不应差异>10倍 |
| 低质量样本 | 总reads+基因数+MT% | 综合评判 |
批次效应处理流程¶
数据到手
↓
PCA着色(按batch) → 无明显批次分离 → 不需要校正,直接分析
↓ 有批次效应
判断混杂程度
↓
batch和group不混杂 → ComBat / removeBatchEffect / 加协变量
↓
batch和group部分混杂 → 加协变量 + 验证结论稳健性
↓
batch和group完全混杂 → 无法可靠分离,需要补实验
工具选择速查¶
| 数据类型 | 推荐工具 | R/Python |
|---|---|---|
| Bulk RNA-seq | ComBat / limma协变量 | R |
| 芯片数据 | ComBat | R |
| 单细胞(一般) | Harmony | R / Python |
| 单细胞(大规模) | scVI | Python |
| 单细胞(保守) | MNN (fastMNN) | R |
| 宏基因组 | 差异分析中加协变量 | R / Python |
延伸资源¶
- ComBat原始论文:Johnson WE, Li C, Rabinovic A. "Adjusting batch effects in microarray expression data using empirical Bayes methods." Biostatistics, 2007, 8(1):118-127
- Harmony论文:Korsunsky I, et al. "Fast, sensitive and accurate integration of single-cell data with Harmony." Nature Methods, 2019, 16:1289-1296
- scVI论文:Lopez R, et al. "Deep generative modeling for single-cell transcriptomics." Nature Methods, 2018, 15:1053-1058
- 批次效应综述:Leek JT, et al. "Tackling the widespread and critical impact of batch effects in high-throughput data." Nature Reviews Genetics, 2010, 11:733-739
- Bioconductor sva包文档:https://bioconductor.org/packages/release/bioc/html/sva.html
- kBET包:https://github.com/theislab/kBET
- scvi-tools官方文档:https://scvi-tools.org/
本篇和28_生物统计实验设计的区别:28讲的是"实验设计阶段如何避免批次混杂"(事前),本篇讲的是"数据到手后如何检测和校正批次效应"(事后)。两者互补。