跳到正文
cccskills
免费在 GitHub 公开

bio-flow-cytometry-doublet-detection

Detects and removes doublets/aggregates from flow, spectral, and mass cytometry before clustering or quantification. Covers FSC-A vs FSC-H singlet discrimination (the Area-Height non-proportionality, not a 1D area gate), FSC-W/SSC width gating, CyTOF Gaussian discrimination parameters (Center/Offset/Width/Residual/Event_length) and DNA intercalator gating, and the residual heterotypic conjugates that survive scatter gating and masquerade as double-positive populations. Use when filtering aggregates before phenotyping, choosing a doublet method for flow vs CyTOF, or diagnosing a suspicious double-positive cluster.

中文简介正在准备中。当前显示原文说明。

查看安装方法

包含的文件(3)

  • SKILL.md7.8 KB
  • examples/detect_doublets.R2.1 KB
  • usage-guide.md3.5 KB

SKILL.md(原文)

安装前可以查看交给 AI 代理的指令内容。

Version Compatibility

Reference examples tested with: flowCore 2.14+, CATALYST 1.26+, ggplot2 3.5+.

Before using code patterns, verify installed versions match. If versions differ:

  • R: packageVersion('<pkg>') then ?function_name to verify parameters

If code throws an error, introspect the installed package and adapt rather than retrying.

Doublet Detection

"Remove doublets from my cytometry data" -> Discriminate single cells from aggregates using pulse geometry (flow) or ion-cloud parameters (CyTOF), before any clustering or quantification.

  • R (flow/spectral): flowCore gate on the FSC-A vs FSC-H diagonal (+ FSC-W/SSC-W)
  • R (mass/CyTOF): gate on DNA intercalator + Gaussian/Event_length parameters

The Single Most Important Modern Insight -- Doublets Are Caught by Area-vs-Height Non-Proportionality, and Scatter Gating Is Necessary but Not Sufficient

A doublet has roughly double the pulse AREA of a singlet but NOT double the Height, and a longer Width/transit time - so singlets fall on a tight FSC-A vs FSC-H diagonal and doublets deflect above it. A 1D area histogram therefore does NOT remove doublets; the discriminating signal is the Area-Height relationship (plus Width). This matters because an unremoved doublet of a CD3+ and a CD19+ cell reads as an artifactual CD3+CD19+ "double-positive," and clustering will faithfully (and wrongly) carve it out as a real population. Crucially, scatter gating is necessary but NOT sufficient: heterotypic conjugates (e.g. a CD3+CD14+ T:monocyte) survive standard FSC-A/H gates and present as genuine double-positives whose lineage-marker levels look COMPARABLE to true single-positives - the tell is an ELEVATED shared marker (e.g. CD45) and a high bright-field aspect ratio, so the definitive resolver is imaging flow cytometry, not a lineage-intensity check (Stadinski 2020 Cytometry A 97:1102). On CyTOF there is no scatter at all - doublets are removed by ion-cloud Gaussian parameters and DNA intercalator content (Bagwell 2020 Cytometry A 97:184).

Method Taxonomy

MethodInstrumentPrincipleCaveat
FSC-A vs FSC-Hflow/spectralsinglets on the A-H diagonalthe standard; the discriminator is non-proportionality, not area
FSC-W / SSC-Wflow/spectraldoublets have longer pulse Widthcomplementary to A-vs-H
DNA intercalator (Ir191/193)CyTOFdoublets show ~2N+ DNAalso separates cells from beads/debris
Gaussian params + Event_lengthCyTOFion-cloud fit residual/length flags fusionscatches fusions DNA alone misses (Bagwell 2020)
imaging cytometryimaging flowbright-field aspect ratiothe only clean resolver of heterotypic conjugates

Note: cytometry doublet removal is GATING-based. DoubletFinder/Scrublet/scDblFinder are scRNA-seq DROPLET methods (they simulate artificial doublets) - limited transfer, because cytometry has direct physical doublet signals.

FSC-A vs FSC-H Singlet Gating (flow/spectral)

Goal: Keep events on the singlet diagonal.

Approach: A polygon along the A=H diagonal (preferred over a rectangle, which keeps off-diagonal doublets); visualize with the gate overlaid.

library(flowCore); library(ggcyto)

# matrix dimnames preserve 'FSC-A'/'FSC-H'; data.frame() would mangle them to FSC.A
singlet <- polygonGate(filterId = 'singlets', .gate = matrix(
  c(20000, 10000, 250000, 200000, 250000, 260000, 20000, 40000), ncol = 2, byrow = TRUE,
  dimnames = list(NULL, c('FSC-A', 'FSC-H'))))
singlets <- Subset(fs, singlet)
autoplot(fs[[1]], 'FSC-A', 'FSC-H') + ggcyto::geom_gate(singlet)

CyTOF Doublet Removal

Goal: Keep intercalator-positive single ion clouds.

Approach: Gate DNA intercalator (nucleated, ~2N) and Event_length/Gaussian residual; CATALYST exposes these as channels in the SCE.

library(CATALYST)
# prepData moves Time/Event_length to int_colData by default - keep them in the assay with FACS=TRUE
sce <- prepData(fs, panel, md, transform = TRUE, cofactor = 5, FACS = TRUE)
e <- assay(sce, 'exprs')

dna <- e['DNA1', ]                                   # intercalator-positive = nucleated single cells
keep <- dna > quantile(dna, 0.05) & dna < quantile(dna, 0.95)
if ('Event_length' %in% rownames(sce))               # retained by FACS=TRUE (now on the arcsinh scale)
  keep <- keep & e['Event_length', ] <= quantile(e['Event_length', ], 0.99)   # quantile-relative, so scale is fine
sce_singlets <- sce[, keep]

Per-Method Failure Modes

1D area gate leaves doublets

Trigger: gating only FSC-A. Mechanism: doublets overlap singlets in area. Symptom: double-positive clusters persist. Fix: gate the FSC-A vs FSC-H diagonal (+ Width).

Heterotypic conjugate survives scatter gating

Trigger: a surprising double-positive between two single-positive clusters. Mechanism: T:monocyte conjugate is scatter-normal, lineage markers comparable to singlets. Symptom: "novel" DP population with an elevated shared marker (e.g. CD45). Fix: treat as suspected doublet; check the shared-marker signal; confirm/resolve by imaging flow (bright-field aspect ratio) when load-bearing.

CyTOF "doublet gate" using scatter

Trigger: porting flow logic to CyTOF. Mechanism: no FSC/SSC exists. Symptom: no scatter channels. Fix: use DNA + Gaussian/Event_length.

Quantitative Thresholds

ThresholdSourceRationale
expected doublet rate ~1-5% (PBMC), higher in tissuecommunityflag samples far above as prep issues - not a removal cutoff
Gaussian + DNA gating improves CV (3.45 -> ~2.04)Bagwell 2020 Cytometry A 97:184combined DNA + Gaussian over baseline (Gaussian alone ~2.41)

Note: a fixed "95th-percentile residual" cutoff is arbitrary; prefer a visual diagonal gate or the instrument's Gaussian parameters over an unjustified quantile.

Common Errors

Error / symptomCauseSolution
double-positive cluster that "shouldn't" existresidual heterotypic doubletscheck for an elevated shared marker (CD45); confirm by imaging flow
no FSC/SSC channels (CyTOF)mass data has no scatteruse DNA/Gaussian/Event_length
over-removal of large cellsrectangle gate clips real large singletsuse a diagonal polygon, not a box

References

  • Stadinski 2020 Cytometry A 97(11):1102-1104 — heterotypic doublets survive scatter gating.
  • Bagwell 2020 Cytometry A 97(2):184-198 — automated CyTOF cleanup via Gaussian/Event_length.
  • Finck 2013 Cytometry A 83(5):483-494 — CyTOF DNA/event parameters in normalization context.

Related Skills

Workflow order (CyTOF): EQ-bead drift normalization (raw, FIRST) -> cytometry-qc -> doublet-detection -> clustering -> CytoNorm cross-batch (LAST)

  • cytometry-qc - Run first: flow-rate/signal/margin cleaning
  • bead-normalization - CyTOF drift correction after doublet removal
  • fcs-handling - Load FCS files
  • gating-analysis - Where singlet discrimination sits in the hierarchy
  • clustering-phenotyping - Downstream analysis after doublet removal
  • single-cell/doublet-detection - Droplet scRNA-seq doublet methods (different principle)

评价

还没有评价。欢迎分享你的使用感受。

评论

无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。

还没有评论。来写第一条吧。

提交后会立即公开。请勿填写邮箱、电话等个人信息。URL 最多 2 个。

0 / 1000 字

此表单受 reCAPTCHA 保护,适用 Google 的隐私权政策和服务条款。

同一仓库的技能

Predicts ADMET properties using ADMETlab 3.0 (119 platform features, including 77 prediction models with modeled-endpoint uncertainty), ADMET-AI, DeepChem MolNet, and chemprop D-MPNN with explicit handling of OECD QSAR principles, applicability domain assessment, calibration, hERG/CYP/AMES endpoints, and PAINS / Lipinski / Ro5 / Veber / BBB druglikeness filters. Use when filtering compounds for drug-likeness, prioritizing leads by predicted safety, or building an in-house ADMET QSAR model.

中文简介正在准备中。当前显示原文说明。

GPTomics/bioSkills12272026年8月15日 更新

Trim PCR primers from aligned reads in amplicon-panel BAMs using samtools ampliconclip. Use when processing SARS-CoV-2 ARTIC, hereditary cancer panels, ctDNA hot-spot panels, or any amplicon assay where primer-derived bases would falsely confirm reference at primer footprints.

中文简介正在准备中。当前显示原文说明。

GPTomics/bioSkills12272026年8月15日 更新

Filter alignments by flags, mapping quality, and regions using samtools view and pysam. Use when extracting specific reads, removing low-quality alignments, or subsetting to target regions.

中文简介正在准备中。当前显示原文说明。

GPTomics/bioSkills12272026年8月15日 更新

Create and use BAI/CSI indices for BAM/CRAM files using samtools and pysam. Use when enabling random access to alignment files or fetching specific genomic regions.

中文简介正在准备中。当前显示原文说明。

GPTomics/bioSkills12272026年8月15日 更新

Read, write, and convert multiple sequence alignment files using Biopython Bio.AlignIO. Supports Clustal, PHYLIP, Stockholm, FASTA, Nexus, and other alignment formats for phylogenetics and conservation analysis. Use when reading, writing, or converting alignment file formats.

中文简介正在准备中。当前显示原文说明。

GPTomics/bioSkills12272026年8月15日 更新

Parse and analyze multiple sequence alignments using Biopython. Extract sequences, identify conserved regions, analyze gaps, work with annotations, and manipulate alignment data for downstream analysis. Use when parsing or manipulating multiple sequence alignments.

中文简介正在准备中。当前显示原文说明。

GPTomics/bioSkills12272026年8月15日 更新

查看 GPTomics 的全部技能

报告此技能的问题