Processing

QIIME 2 and DADA2

QIIME 2 is not an analysis method — it is a framework that wraps other people's methods and records what it did. DADA2 is one of those methods, and the one that turns reads into the table everything downstream depends on. Between them sits the parameter most likely to destroy a dataset while reporting success.

Artifacts carry their own history

A .qza is a zip file containing the data and a full record of how it came to exist. This is the feature that distinguishes QIIME 2 from a pile of shell scripts, and it is the one most commonly discarded — the moment you export to TSV, the chain is broken.

table.qza 5b656192-…-6693b5ab2941/ data/ metadata.yaml provenance/ action/action.yaml artifacts/…/ semantic type FeatureTable[Frequency] checked before an action runs, not after provenance chain import dada2 denoise-paired feature-classifier classify diversity core-metrics recorded environment framework: 2024.10.1 q2-metadata: 2024.10.0 python: 3.10.14 qiime tools export → the record stops here the TSV is derivable from the artifact; the provenance is not derivable from the TSV export at the end, for plotting — not in the middle, for convenience
Version churn

QIIME 2 releases quarterly and the packaging has moved recently: as of 2026.4 the amplicon distribution was renamed back to qiime2 and environment files carry a rachis- prefix. Pin the release in your environment file and read the release notes before upgrading mid-project — an artifact from an older release still loads, but plugin behaviour and defaults do move.

What DADA2 actually does

Denoising is not filtering. DADA2 builds a model of this run's error process and then asks, for each candidate sequence, whether it is better explained as a real biological sequence or as errors off a more abundant neighbour.

consensus quality score → error frequency (log) reported Q scores …and they drift down the read fitted, per transition (A→C, A→G, …) 16 curves, learned from this run one model per sequencing run run 1 → learnErrors → denoise → table 1 run 2 → learnErrors → denoise → table 2 → merge tables is this variant real, or errors off its parent? parent, 4,120 reads variant, 310 reads — model predicts 4 → real variant, 6 reads — model predicts 5 → folded in output: exact sequence variants — comparable between studies without re-clustering
Binned quality scores

Instruments that report binned quality scores — NovaSeq and NextSeq among them — give the error model a handful of discrete Q values instead of a continuous range, and the fit degrades. This is a known, actively discussed problem with community workarounds that modify the error-estimation function; it is not solved by a flag in the default workflow. If your data came off a binned-quality instrument, check the current DADA2 guidance before trusting the default fit, and look at the error plots rather than assuming.

The truncation trap

This is the one that costs people whole datasets. Truncating reads to improve quality is correct. Truncating them past the point where the pair can still overlap destroys the run — and DADA2 does not fail. It returns a table, with almost nothing in it.

trunc_f + trunc_r − amplicon ≥ 12 V4 · 515F/806R · 253 bp · 2×250 247 bp overlap — lots of room V3–V4 · 341F/805R · 427 bp · truncated to 250 / 180 3 bp — under the required 12. amplicon length varies by taxon margin of 12 fails for every longer amplicon → biased loss broken run filtered 91% denoised 90% merged 4% non-chim 4% exit status: success the real run filtered 92.3% denoised 91.2% merged 83.1% non-chim 62.6% median of 50 samples

Where the reads went, in percentage points of input

The same 50-sample run, expressed as loss rather than survival. Pooled across all 9,973,604 input reads.

Read loss by stage

Chimera removal is the largest single loss, and that is normal.

A 21-point loss to chimera removal looks alarming the first time. It is not: PCR chimeras are genuinely abundant in 16S amplicon libraries, and removing them is the point. What would be alarming is the pair-joining step taking 21 points instead of 7 — that is the truncation arithmetic failing, and it is the number to check first when a run looks thin.

A short checklist

  1. Remove primers before denoising Cutadapt, or --p-trim-left if the primers are a fixed length and definitely present. Primer sequence left in place becomes conserved sequence that the error model and the classifier both have to deal with.
  2. Work out the truncation arithmetic on paper Amplicon length for your primer pair, minus it from the sum of your two truncation lengths, and leave 20–30 bases of margin rather than 12.
  3. One error model per sequencing run Denoise each run separately, then qiime feature-table merge. If you cannot tell which run a sample came from, that is a metadata problem to fix before an analysis problem.
  4. Read the denoising stats every time qiime metadata tabulate on the DADA2 stats artifact. Look at the merged column first, then the spread across samples — not just the mean.
  5. Keep the artifacts Export at the end. The provenance is the only complete record of what you did, and it is free as long as you do not throw it away.