The result

MaAsLin

Everything up to here produced a table. Differential abundance is where the table becomes a claim about biology, and it is the step with the most ways to be confidently wrong. MaAsLin fits one model per feature, with covariates and random effects, and it is a good tool — provided you know what its defaults have already decided for you.

Why this step is harder than it looks

The data are compositional

A sequencer returns a fixed number of reads, so you measure proportions, not amounts. If one taxon genuinely doubles, every other taxon's proportion falls even though nothing happened to it. A per-feature test run naively will report all of them as decreased.

The table is mostly zeros

Typical ASV tables are 80–95% zero. Some zeros are real absence, some are absence of detection at your depth, and no model can distinguish them from the counts alone. This is why prevalence filtering exists and why it is not innocent.

Counts are overdispersed

Variance far exceeds the mean, so Poisson assumptions fail. Either transform toward normality or use a distribution that carries its own dispersion parameter — MaAsLin offers both routes and defaults to the first.

Samples are rarely independent

Repeated sampling of the same subject, cage, plot or tank means your n is the number of units, not the number of tubes. Unmodelled, this inflates significance in exactly the direction that produces publishable results.

What the defaults do

Every one of these is a defensible choice. None of them is the only defensible choice, and all of them belong in your methods section.

features × samples min_prevalence = 0.1 dropped < 5 of 50 samples → gone normalise · TSS each sample sums to 1 → the data are now compositional transform · LOG pseudocount absorbs the zeros model · LM, per feature y ~ group + age + BMI + (1 | subject) alternatives: CPLM · NEGBIN · ZINB one fit per surviving feature correct · BH FDR p = 0.0004 → q = 0.02 p = 0.008 → q = 0.11 p = 0.031 → q = 0.24 denominator = features that survived step 2 max_significance = 0.25 the default is not 0.05 a discovery threshold, by design say so, or set it yourself seven decisions, six of which you never made explicitly

The defaults, written down

ParameterDefaultWhat it assumes
normalizationTSSdepth is a nuisance to divide out; relative abundance is the quantity of interest
transformLOGmultiplicative effects; residuals roughly normal after logging
analysis_methodLMthe transform did enough that a linear model is adequate
min_prevalence0.1features in under 10% of samples cannot be modelled and should not be tried
min_abundance0no abundance floor beyond the prevalence cut
correctionBHcontrolling FDR, not family-wise error
max_significance0.25this is a discovery threshold, not a confirmatory one
random_effectsnoneevery sample is independent — usually false in repeated-measures designs
referencenonefor categorical variables with 3+ levels, the reference is chosen for you

The last two are the ones that produce wrong answers rather than merely permissive ones. A categorical variable with three or more levels requires an explicit reference, or your coefficients are contrasts against whichever level sorted first. And a repeated-measures design without random_effects is pseudoreplication with a p-value attached.

The compositional trap

absolute abundance — the truth before after A ×2 B–E unchanged what you measure — a fixed read budget before after same total, every time per-feature test on proportions A up q = 0.001 ✓ true B down q = 0.004 ✗ C down q = 0.009 ✗ D,E down q < 0.02 ✗ what helps log-ratio transforms (CLR / Aitchison) — partial spike-in · qPCR total 16S · flow counts — actual

What MaAsLin 3 changes

MaAsLin 3 (Nickols et al., Nature Methods) is not a bug-fix release; it changes what question is being asked.

  1. Abundance and prevalence are modelled separately A taxon can be present more often in one group while being less abundant when present. MaAsLin 2 aggregates those into one coefficient, where they can partially cancel. MaAsLin 3 reports them as two associations, which is both more sensitive and more interpretable — presence and abundance can reflect genuinely different phenomena, infection versus commensalism being the standard example.
  2. Compositionality is handled explicitly Either by fitting on a true experimental absolute-abundance scale when you have spike-ins or total-load measurements, or by including an inferred component that accounts for the compositional constraint when you do not.
  3. Better precision at the same recall The paper reports precision improving by up to 0.29 on average over MaAsLin 2 in simulation, with recall maintained.
  4. Which does not make MaAsLin 2 wrong A MaAsLin 2 analysis with a stated threshold, explicit reference levels and correct random effects is a perfectly respectable analysis. If you are starting fresh, start on 3; if you have a MaAsLin 2 result, the reason to rerun is the abundance/prevalence split, not a fear that the old answer was invalid.

Reporting checklist

If a methods section answers these, a reader can reproduce the result. If it does not, they cannot, however good the figures are.

QuestionBad answerGood answer
What was tested?"taxa"ASVs collapsed to genus; 214 features after filtering
What was filtered out?silencemin_prevalence 0.1 → 214 of 1,893 features retained
Normalisation and transform?"MaAsLin2 was used"TSS + LOG, defaults, stated explicitly
Model and covariates?"corrected for confounders"LM, y ~ group + age + sex + (1|subject)
Reference level?unstatedreference = control for the group variable
Significance threshold?"significant (q < 0.05)" when the default ranq < 0.25 as the MaAsLin default, reported as discovery-level; or set to 0.05 and said so
Relative or absolute?"less Blautia"lower relative abundance; no total-load measurement was made
Was depth rarefied here?unstatedno — rarefaction was used for diversity only; depth is in the model
The one that catches everyone

Running MaAsLin with defaults, taking the features it returns, and describing them as significantly different imports a q < 0.25 threshold into a sentence the reader will parse as q < 0.05. Nothing was hidden — the default is documented and deliberate — but the burden of saying so is yours, and almost nobody does.