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.
The defaults, written down
| Parameter | Default | What it assumes |
|---|---|---|
normalization | TSS | depth is a nuisance to divide out; relative abundance is the quantity of interest |
transform | LOG | multiplicative effects; residuals roughly normal after logging |
analysis_method | LM | the transform did enough that a linear model is adequate |
min_prevalence | 0.1 | features in under 10% of samples cannot be modelled and should not be tried |
min_abundance | 0 | no abundance floor beyond the prevalence cut |
correction | BH | controlling FDR, not family-wise error |
max_significance | 0.25 | this is a discovery threshold, not a confirmatory one |
random_effects | none | every sample is independent — usually false in repeated-measures designs |
reference | none | for 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
What MaAsLin 3 changes
MaAsLin 3 (Nickols et al., Nature Methods) is not a bug-fix release; it changes what question is being asked.
- 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.
- 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.
- 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.
- 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.
| Question | Bad answer | Good answer |
|---|---|---|
| What was tested? | "taxa" | ASVs collapsed to genus; 214 features after filtering |
| What was filtered out? | silence | min_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? | unstated | reference = control for the group variable |
| Significance threshold? | "significant (q < 0.05)" when the default ran | q < 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? | unstated | no — rarefaction was used for diversity only; depth is in the model |
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.