作者 (author): LKP kunpeng.liao@abiosciences.com Skill 及脚本参数来源: Chen et al., 2025, Cancer Cell 43, 1656–1676, https://doi.org/10.1016/j.ccell.2025.06.020
miloR 差异丰度分析(Milo)
Milo 在 KNN 图上构建邻域(nhood),用广义线性模型检验条件间细胞丰度差异,适合不重聚群的丰度 DA 分析。
版本
# 论文基线 miloR 1.10.0(不符仅 warning)
packageVersion("miloR")
安装:BiocManager::install("miloR")(清华源:options(BioC_mirror="https://mirrors.tuna.tsinghua.edu.cn/bioconductor"))。
1. 数据准备(每 compartment 独立预处理)
# 注意:Milo 侧 PCA 用 50 维(比主线 30 多),因为 buildGraph 需要 d=50
obj <- NormalizeData(obj) |>
FindVariableFeatures(selection.method = "vst", nfeatures = 3000) |>
ScaleData(features = VariableFeatures(obj)) |>
RunPCA(npcs = 50, seed.use = 2023)
2. Milo 对象与图构建
library(miloR); library(SingleCellExperiment)
sce <- as.SingleCellExperiment(obj)
reducedDim(sce, "PCA") <- Embeddings(obj, "pca") # 显式注入PCA
milo <- Milo(sce)
milo <- buildGraph(milo, k = 10, d = 50) # 论文参数:k=10, d=50
3. 邻域采样
# k 值按 compartment 调整:Myeloid=20,CAF=10(细胞密度不同)
milo <- makeNhoods(milo, prop = 1, k = 20, d = 30, refined = TRUE)
# prop=1:每个细胞都可能做种子(充分采样)
4. 伪样本设计与检验(作者式设计)
# 关键设计:伪样本 = celltype × 条件 组合(非真实生物学样本)
meta$Sample <- paste(meta$celltype, meta$NI, sep = "_")
milo <- countCells(milo, meta = meta, samples = "Sample")
# NI 因子水平固定 c("Low","High")
meta$NI <- factor(meta$NI, levels = c("Low", "High"))
design_df <- data.frame(Sample = unique(meta$Sample)) |>
merge(unique(meta[, c("Sample", "NI")]), by = "Sample")
da <- testNhoods(milo, design = ~ 0 + NI, design.df = design_df,
model.contrasts = "NIHigh-NILow",
fdr.weighting = "graph-overlap")
milo <- buildNhoodGraph(milo)
milo <- annotateNhoods(milo, coldata_col = "celltype")
敏感性分析:以真实生物样本 ID 作为 Sample 重复 testNhoods,检验伪样本设计的稳健性。
5. 可视化与阈值
# 显著性阈值:SpatialFDR < 0.3(论文口径,比常规0.05宽松)
sig <- da[da$SpatialFDR < 0.3, ]
plotNhoodGraphDA(milo, da_results = da, alpha = 0.3)
plotDA_violin(da) # 按细胞类型汇总 logFC
# 目标亚群举例:Myeloid 的 M07/M09/M10/M08;CAF 的 F01-F08
常见坑
- d 必须与 PCA 维度一致:
reducedDim(sce,"PCA")注入后 buildGraph 才能取到 - makeNhoods 的 k 与 buildGraph 的 k 可不同:采样 k 用 compartment 专属值
- design.df 必须含 Sample 行且无重复:每伪样本一行
- Windows 内存:大图谱 makeNhoods(prop=1) 会产生海量 nhood,建议
future.globals.maxSize放开 - 对照方向:
model.contrasts="NIHigh-NILow"决定 logFC 正负方向,因子水平先固定
Scan to join WeChat group