
Finding interaction patterns
Hamid Bulut
2026-11-02
Source:vignettes/finding_interactions.Rmd
finding_interactions.RmdOverview
A common follow-up question is which strata depart most clearly from the additive expectation.
For this exploratory diagnostic, maihda() can compute
the adjusted-model stratum random effects, intervals, and flags. When
you use interactions = "BH", the flags use the
Benjamini-Hochberg adjustment (Benjamini and
Hochberg 1995). The diagnostic is stored in the analysis object
and can be reused by the effect-decomposition and predicted-strata
plots.
Run a standard analysis and choose the multiplicity rule
The default is adjust = "BH" (Benjamini-Hochberg):
scanning all strata to see which ones interact is a screening question,
so the flags are a conservative false-discovery-rate screen. Partial
pooling shrinks a truly-null stratum’s Wald tail, so the screen
under-flags rather than over-flags – it errs strict, never liberal (see
?maihda_interactions). For the uncorrected, per-stratum
individual view, set interactions = "none".
The call below names the (default) Benjamini-Hochberg rule explicitly:
library(MAIHDA)
model_bh <- maihda(
BMI ~ Age + Gender + Race + Education + (1 | Gender:Race:Education),
data = maihda_health_data,
interactions = "BH" # Benjamini-Hochberg adjustment (also the default)
)The printed output reports how many strata were flagged and which
adjustment rule was used. The full table is stored in
model_bh$interactions.
model_bh$interactions
#> ── Intersectional interactions ─────────────────────────────────────────────────
#> 1 of 50 strata flagged (95% interval; BH-adjusted conservative p-values).
#> Model: adjusted (two-model); interaction on the link (latent) scale.
#>
#> stratum label n interaction se lower upper
#> 8 male × White × Some College 328 1.359 0.3448 0.6836 2.035
#> p_value p_adjusted flagged direction
#> 8.056e-05 0.004028 TRUE above
#>
#> Interaction BLUPs are shrunken (partially pooled) estimates; treat flags as
#> exploratory. See ?maihda_interactions.
#> Each row is one stratum. The main columns are:
-
interaction: the adjusted-model stratum random effect, on the model scale. -
lowerandupper: the interval for that random effect. -
direction: whether the stratum is above or below the additive expectation. -
flagged: whether the stratum passes the selected screening rule.
For frequentist fits, the table also includes the conditional standard error, p-value, and adjusted p-value when a correction is requested.
Highlight flagged strata
The plotting methods can reuse the stored diagnostic. Because
model_bh was fitted with interactions = "BH",
highlight_interactions = TRUE uses the Benjamini-Hochberg
flags. In the effect-decomposition plot, the labels also follow that
same flagged set.
plot(model_bh, type = "effect_decomp", highlight_interactions = TRUE)
The same flags can be reused in the predicted-strata view.
plot(model_bh, type = "predicted", highlight_interactions = TRUE)
If the analysis was fitted without a stored interaction diagnostic, pass the adjustment rule directly:
plot(model, type = "effect_decomp", highlight_interactions = "BH")Is an interaction negligible? (equivalence / ROPE)
A flag asks whether an interaction differs from zero. Often the more
useful question is whether it is large enough to matter. Pass a
region of practical equivalence (rope, on the model scale)
and each stratum is classified from its interval (Schuirmann 1987; Kruschke 2018) as
relevant (interval entirely outside the region),
negligible (entirely inside it), or
inconclusive (straddling a bound):
maihda_interactions(model_bh, rope = 0.5)
#> ── Intersectional interactions ─────────────────────────────────────────────────
#> 1 of 50 strata flagged (95% interval; BH-adjusted conservative p-values).
#> Model: adjusted (two-model); interaction on the link (latent) scale.
#> Equivalence vs ROPE [-0.5, 0.5]: 1 relevant | 0 negligible | 49 inconclusive.
#>
#> stratum label n interaction se lower upper
#> 8 male × White × Some College 328 1.359 0.3448 0.6836 2.035
#> p_value p_adjusted flagged direction decision
#> 8.056e-05 0.004028 TRUE above relevant
#>
#> Interaction BLUPs are shrunken (partially pooled) estimates; treat flags as
#> exploratory. See ?maihda_interactions.
#> There is no default rope: the smallest interaction worth
caring about is a substantive choice, made on the model’s (link)
scale.
See also
- Introduction to MAIHDA, the main two-model workflow.
- Interpreting MAIHDA plots and diagnostics, how to read the effect-decomposition and predicted-strata plots.
- Bayesian MAIHDA for sparse intersections, sparse cells and uncertainty in variance components.