The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.
Complete redesign of the two effect-estimation functions,
estimate_hr_ir() and estimate_rr_rd() (API
v2). This is a BREAKING release for both functions; the
propensity-score, weighting, matching, and Table-1 functions are
unchanged.
in_df_crude plus either in_df_weight (with
if_weight_weight_var) or in_df_match
(optionally with if_match_match_id) — supplying both
weighted and matched blocks is an error; weight- or match-only calls
without a crude block are allowed. Output column suffixes are now
_Crude / _Weighted / _Matched
(previously _Unwt / _Wted).survival_time ->
followuptime_var; stratify_by ->
stratification_var; rr_rd_per_individuals
-> risk_per_individuals; weight_var ->
if_weight_weight_var.hr_conf_int_method,
cluster_var, conf_int_method,
irr_method, and irr_covariates have been
removed. Each estimate uses one fixed, documented method (below).if_bootstrap_count (plus if_bootstrap_n_cores
/ if_bootstrap_seed) and is always fixed-weight (“frozen”):
analysis weights and standardization shares are held at their original
values, so propensity-score-estimation uncertainty is not propagated (a
message states this on every bootstrap run). Matched blocks resample
matched sets by if_match_match_id. Only percentile
intervals are provided (no BCa).time_unit gains "months" (person-years =
months / 12) in estimate_hr_ir().estimate_hr_ir()): crude block = Cox model SE;
weighted block = robust sandwich SE; matched block = robust SE clustered
on the match id (Lin-Wei 1989; Austin 2016). The old “auto” dispatch is
now the only behavior.estimate_rr_rd() (fg_regression removed) into
estimate_hr_ir(hr_model = "Fine-Gray") with
if_fg_competing_event_var; weighted expansions keep fgwt =
IPCW x PS weight, and matched blocks cluster the robust SE on the match
id. estimate_rr_rd() keeps
risk_estimator = c("KM", "AJ") with the competing-event
indicator renamed to if_aj_competing_event_var
(AJ-only).estimate_hr_ir() as a
marginal rate ratio: crude/matched blocks use a Poisson rate model
(model SE, equal to sqrt(1/D1 + 1/D0)); the weighted block uses
survey::svyglm quasi-Poisson (robust SE). The former
quasi-Poisson option for unweighted fits is gone. Stratified IRRs,
previously an error, are now direct-standardized.estimate_rr_rd()): the log-scale
interval is replaced by the complementary log-log (cloglog) interval
applied to the final (standardized/weighted) estimate with its combined
SE (Kalbfleisch & Prentice 2002). A crude Kaplan-Meier risk now
reproduces survfit(conf.type = "log-log") exactly. A risk
of exactly 0 or 1 has no defined cloglog interval: NA is returned and a
message recommends the bootstrap. RD (normal-Wald) and RR (log-delta)
intervals are unchanged.tests/testthat/fixtures/ and guard the redesign: every
method-unchanged output reproduces the 0.3.0 values exactly; only the
weighted IR/IRD CIs (robust), standardized IR arm CIs (Fay-Feuer),
Risk/CIF arm CIs (cloglog), and the crude IRR SE (Poisson) changed, each
by design.Depends: R (>= 3.5.0)
(serialized test fixtures use serialization format version 3).(Not submitted to CRAN; folded into 0.4.0.)
create_ps_weights() has been removed. The
single function with weight_method + estimand
arguments is replaced by one function per estimand:
create_iptw() — inverse-probability weights for the ATE
(stabilize = TRUE for stabilized IPTW).create_matching_weights() — matching weights, now
correctly labeled as targeting the ATM (Li & Greene 2013), not the
ATT.create_overlap_weights() — overlap weights for the ATO
(Li et al. 2018). IPTW for the ATT (SMR weights) is not supported in
this version. The broken stabilized-IPTW + ATO path has been
removed.create_iptw(), create_matching_weights(),
create_overlap_weights(), and
create_ps_matched_cohort() gain optional propensity-score
trimming (trim_method: "crump" symmetric or
"sturmer" asymmetric). create_iptw()
additionally gains weight truncation/winsorizing
(truncate_method: "percentile" or
"cap"). All default to off; both trimming and truncation
change the analytic population and the interpretation of the
estimand.create_ps_matched_cohort() gains a method
argument ("nearest"/"subclass"),
variable-ratio matching (min_controls /
max_controls / m_order), and
subclass_n. For "subclass" the returned cohort
carries matching weights in .match_weights, which must be
used for the matched Table 1 and any downstream effect estimation.|SMD| against
threshold * 100 and the Love-plot reference line was drawn
at 10 (off-screen) on raw-scale data.estimate_hr_ir() gained a
hr_conf_int_method argument controlling how the
hazard-ratio confidence interval (and the reported lnHR_SE)
was computed:
"auto" (default): model-based SE for the unweighted fit
and robust sandwich SE for the weighted fit (Austin 2016)."model": model-based (naive) Cox SE with a Wald CI for
both fits."robust": robust sandwich SE with a Wald CI for both
fits ("sandwich" accepted as an alias)."bootstrap": percentile bootstrap CI with a bootstrap
SE (lnHR_SE = sd(log(HR))); no p-value reported. (Removed
again in 0.4.0: the “auto” dispatch is now the only behavior.)estimate_hr_ir() gained cluster_var,
bootstrap_count, n_cores, and
seed arguments for the robust/bootstrap methods (removed
again in 0.4.0 in favor of the fixed per-block methods and
if_bootstrap_*).estimate_hr_ir() gained an optional
incidence-rate-ratio rate model via irr_method
("none"/"poisson"/"quasipoisson")
with optional irr_covariates; weighted fits used
survey::svyglm(quasipoisson) (reworked in 0.4.0: IRR is
always-on and marginal).estimate_rr_rd() gained a Fine-Gray
subdistribution-hazard regression via fg_regression +
competing_event_var (moved to estimate_hr_ir()
in 0.4.0).estimate_ps() gained a separation diagnostic for the
propensity-score logistic model and uses na.exclude so the
returned PS column aligns with the input rows.create_ps_weights() and
create_ps_matched_cohort() now also emit the unified
PS-distribution figures (density, within-group histogram, and a
histogram+density overlay for the unweighted/pre and weighted/post
samples, plus a weight box plot for the weighting methods) that
create_ps_fs_weights() already produced. The existing
faceted / mirror plots are still written. A new internal helper
.plot_ps_distribution_set() is shared by all three
functions, so the figure style is now consistent across PS methods.
create_ps_fs_weights() figure output is unchanged.create_ps_matched_cohort() gains a
caliper_scale argument controlling the scale on which
matching and the caliper are applied: "logit_ps_sd" matches
on logit(PS) with a caliper of caliper x SD(logit(PS))
(Austin 2011); "raw_ps_sd" matches on PS with a caliper of
caliper x SD(PS); "raw" applies a flat caliper
on the raw PS scale (e.g. caliper = 0.01).caliper x SD(PS)); the new default
(caliper_scale = "logit_ps_sd") matches on logit(PS)
(caliper x SD(logit(PS))). Pass
caliper_scale = "raw_ps_sd" to reproduce the previous
results exactly. The verbose/report label that previously described the
raw-PS caliper as “SD of logit(PS)” is now accurate for each scale.'Excel' per CRAN
software-name convention.Description
field (Rosenbaum and Rubin 1983 doi:10.1093/biomet/70.1.41; Austin 2011 doi:10.1080/00273171.2011.568786; Desai et al. 2017 doi:10.1097/EDE.0000000000000595).estimate_rr_rd(): removed hardcoded RNG seed from the
internal bootstrap helper. New seed argument (default
NULL) lets the user opt in to reproducibility; when
NULL the function does not touch the global RNG state. In
the sequential branch, .Random.seed is saved and restored
on exit when a seed is supplied.expect_message(..., "Auto-excluding.*race_cat"), which
required both substrings in a single message() call, but
the verbose path emits the header and the variable name on separate
lines. Switched to capture_messages() and asserts both
substrings individually.estimate_ps() categorical extreme-distribution
screen now detects zero-count levels via union of levels across exposure
groups. Previously, a level present in only one exposure group was
silently dropped by table() and could slip past the
cnt < 5 rule, triggering quasi-separation in
glm().These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.