Several methodological corrections change published numbers. Rerun
analyses made with version 0.1.0.
se_method = "binomial", rd_weights = "inverse_variance"
reproduces the 0.1.0 individual point estimate.
rd_weights). With inverse-variance weights one
study whose probabilities sit near 0 or 1 could dominate at ordinary
thresholds: on vas_pain at a MID of -1, one study held 63
percent of the weight and the pooled RD was 0.03 instead of about 0.14.
A warning now reports any study holding more than half of the
weight.mid_sd is one
threshold shared by every study, so its uncertainty is added once after
pooling, through the derivative of the pooled estimator. It was added to
each study before pooling, which shrank it with the number of studies
and moved random-effects estimates.pooling and ci_method, and its variance is the
full delta method over every arm mean and SD (including the SD-dependent
weights, the pooled SDs and the chosen distribution’s moments), plus the
between-study variance of the pooled means under random effects (and the
HKSJ scaling when requested).ci_method was ignored), propagates the
uncertainty of the estimated control risk with its correlation with the
pooled SMD (on the logit scale, so the joint covariance stays valid),
transforms its prediction interval to the risk-difference scale, and is
labeled as the logistic bridge (Hasselblad and Hedges; Chinn), not
Cox.se_method now defaults to
"delta", which carries the uncertainty of the reported mean
and SD.ci_method = "hksj_adhoc"
adds the Hartung-Knapp-Sidik-Jonkman interval with the ad hoc floor of
Rover, Knapp and Friede (2015); plain HKSJ can be far narrower than Wald
when studies agree closely. Prediction intervals use
t_{k-2} and the variance that built the interval for both
DL and REML (REML previously used metafor’s own rule), and
var_rd reports that variance.dist = "t" and "lognormal" use the
distribution’s own third and fourth moments. These first-order intervals
tend to run wide in finite samples; with df <= 4 the t
model has no finite fourth moment and the intervals are much too narrow,
with a warning.trial
column marks comparisons that share a control arm; its sample size is
divided among them so control patients are not counted twice.
vas_pain gains this column for its two three-arm
trials.responder_analysis() returns a
responder_result: still a data frame, with
print() (a formatted table with Altman NNTB/NNTH),
summary() (settings, heterogeneity and per-study weights),
plot() (forest plot) and as.data.frame()
methods.responder_curve(): the analysis across a grid of MID
thresholds, with the largest study weight at each and a
plot() method.responder_sof(): GRADE summary-of-findings rows per
1000 patients at one or more assumed control risks, from the pooled odds
ratio (default), risk ratio or risk difference.impute_change_sd() and
estimate_change_cor(): Cochrane Handbook reconstructions of
change-score SDs from baseline and final SDs, confidence intervals,
standard errors, t statistics or p-values.responder_analysis() is generic and accepts a fitted
continuous meta-analysis saved in an R object:
meta object of the metacont family: the
per-arm summaries are read, excluded studies are dropped, and the fit’s
pooling choices (common or random effects, DL or REML, Hartung-Knapp
with or without the ad hoc rule, and the confidence level) carry over
unless overridden; when the fit lists several random-effects interval
methods, the Hartung-Knapp one is used; settings that cannot be
reproduced are reported;metafor rma object: the pooled
standardized mean difference or mean difference is converted, given a
named baseline control responder risk (and
sd_ref for a mean-difference model), keeping the fit’s
interval method and confidence level. The object is read with base R, so
the package that produced it need not be attached.responder_from_effect(): converts a single pooled
relative effect plus a baseline control risk to responder measures,
orienting the effect by direction, propagating an estimated
baseline jointly with the effect, and working on the log, logit and
Normal-quantile scales so far-tail baselines and large effects keep
their precision.as_responder_data(): extract the arm-summary data frame
from a supported meta-analysis object.responder_rd_individual() gains
ci_type = "logit" (MOVER intervals).format_responder_results() adds an NNT
column in the Altman form.df (vector, infinite, missing) are rejected with clear
messages; duplicate study labels warn.direction = "lower" no longer computes
1 - p), and extreme thresholds no longer crash with either
SE method.netmeta) and multilevel network
meta-regression (multinma) objects are not yet
supported.First public release. The package began life as a small Shiny app; this release rebuilds it as a documented, tested R package with the statistics in pure, exported functions and the Shiny app as a thin front end.
In response to an external methodology audit:
ci_method = "hksj" for the Hartung-Knapp-Sidik-Jonkman
interval, better calibrated than Wald when the number of studies is
small.sd/n.binomial SE is documented as a pseudo-binomial
approximation, with delta recommended for summary-statistic
inputs.responder_analysis(): the main entry point. Converts
continuous arm summaries (mean change, SD, n) into responder proportions
and a tidy table of between-arm effect measures: risk difference, risk
ratio, odds ratio and number needed to treat. Pooling methods:
"individual", "weighted",
"unweighted", "median" and
"smd".responder_rd_individual() and
responder_proportions(): exported building blocks for
per-study risk differences and arm responder probabilities.responder_cles(): threshold-free common-language effect
size (the probabilistic index), pooled fixed or random effects,
requiring no MID.format_responder_results(): display-ready formatting
for reports and the app.launch_responder_analysis(): launches the bundled
ResponderAnalysis Shiny application (direction toggle,
method/pooling/interval options, RR/OR/NNT, a per-study forest plot,
CLES and CSV I/O).sample_responder_data: small bundled example
dataset.vas_pain: a real bundled dataset of 20
exercise-for-spinal-health trials pooled on the VAS pain scale (Li et
al., 2025, doi:10.3389/fspor.2025.1614906, reproduced under CC BY
4.0).pooling = "random") with DerSimonian-Laird
(dependency-free) or REML (tau_method = "REML", via
metafor) between-study variance, reporting Cochran’s Q,
I-squared, tau-squared and a prediction interval."smd" method pools the
standardized mean difference (Hedges’ g) and maps it to an odds ratio
through the logistic link, combined with the weighted-pooled control
risk (Cox; Chinn, 2000).ci_type = "logit"); propagation of uncertainty in the MID
threshold (mid_sd); alternative change-score distributions
(dist = "lognormal" or "t").control = "median" takes the control responder proportion
from the median control arm for every summary method (the Sofi-Mahmudi
2024 simulation baseline), while still pooling the experimental arm by
the chosen method; the default control = "matched" pools
the control arm the same way as the experimental arm. Because the median
control arm has no sampling-variance model,
control = "median" returns point estimates only.The earlier Shiny app contained several errors that are fixed here. Numbers from the weighted and unweighted methods, and all confidence intervals, will differ from that app; the individual and median point estimates are unchanged.
control = "median".sqrt(sum((n-1) sd^2) / sum(n-1)) rather than
inverse-variance pooling of SDs, with a delta-method variance for the
risk difference.[0, 1] scale internally,
removing a class of percent-scale variance errors.rr_meta(), rd_meta() and
prop_meta() (which operated on a 2x2 count format the
package never produced; rr_meta() returned swapped
confidence limits) have been removed, along with the duplicated,
unvalidated iv_meta().library(respondeR) noting the
installed version, the responder_analysis() entry point and
the project links.