prune_stackM: Prune a Stacked Tree Using the Stack / M Correction

View source: R/stackM.R

prune_stackMR Documentation

Prune a Stacked Tree Using the Stack / M Correction

Description

Applies the Stack / M correction of Sherlock et al. (2026) to a conditional inference tree fitted on stacked multiply imputed data. Every node-level test statistic is divided by 'M', the p-values are recomputed from the chi-square reference distribution 'ctree' uses, the multiplicity adjustment over candidate splitting variables is reapplied, and the tree is compressed bottom-up.

Usage

prune_stackM(tree, m, alpha = 0.05, verbose = TRUE)

Arguments

tree

A 'party'/'constparty' object fitted by [partykit::ctree()] on stacked data, with 'teststat = "quadratic"' and 'testtype' either '"Univariate"' or '"Bonferroni"'. Both are handled: whether the stored p-values already carry ‘partykit'’s multiplicity adjustment is read from the fitted control rather than assumed.

m

Integer. Number of imputations.

alpha

Numeric. Nominal significance threshold.

verbose

Logical. Report how many splits were retained.

Details

# What is tested

'ctree' splits a node when *any* candidate variable meets 'alpha', so that is the rule reapplied here: all candidates tested at the node are rescaled and the smallest corrected p-value decides. Testing only the variable that was split on would not be equivalent, because candidates carry different degrees of freedom and rescaling can reorder them.

# How the tree is compressed

Pruning is bottom-up, as in the analysis for the paper. An internal node is collapsed only once all of its own internal descendants have been collapsed, so a node whose descendant survives the correction keeps its split.

# Degrees of freedom

With 'teststat = "quadratic"' the node-level statistic is chi-square with 'df' equal to the rank of the covariance matrix of the linear statistic: the outcome dimension for a numeric or ordered predictor (1 for a univariate outcome, 2 for a bivariate outcome, and so on), and '(L - 1)' times the outcome dimension for an unordered factor with 'L' levels present in the node. These are derived for every node and every candidate variable, by inverting the (statistic, p-value) pairs 'partykit' stored and falling back on the structural rule where the stored p-value has underflowed to zero, which happens routinely on stacked data.

Value

A list with the pruned 'tree' and a 'node_stats' data frame with one row per internal node of the unpruned tree, recording the variable split on, its raw and rescaled statistics, the degrees of freedom and how they were obtained, the p-values before and after correction, the smallest corrected p-value over all candidates at that node, and whether the split was retained. The full per-candidate table is attached as 'attr(node_stats, "candidates")'.

References

Sherlock, P., et al. (2026). Beyond linear risk: A machine learning approach to understanding perinatal depression in context. *Multivariate Behavioral Research*, 1-16. \Sexpr[results=rd]{tools:::Rd_expr_doi("10.1080/00273171.2026.2661244")}

Examples

set.seed(1)
n <- 300
d <- data.frame(x = stats::rnorm(n))
d$y1 <- stats::rnorm(n) + 1.2 * (d$x > 0)
d$y2 <- stats::rnorm(n) + 0.9 * (d$x > 0)
grown <- partykit::ctree(y1 + y2 ~ x, data = d)
out <- prune_stackM(grown, m = 5, verbose = FALSE)
out$node_stats


ctreeMI documentation built on July 27, 2026, 5:08 p.m.