Changelog
Source:NEWS.md
rmorie 0.9.8
- Ecosystem connect: fast stats via the shared rmoriebricklayer C core;
morie_bricklayer()assembler +morie_core.hsync-check. - Version 0.9.8 to match the morie family; source/UA URLs -> github.com/rootcoder007.
rmorie 0.9.6 (in development)
Bugfix: cluster-robust SE with empty cluster levels
-
.otis_cluster_se(): usesum(grp^2, na.rm = TRUE). A factorclustercarrying levels absent from a subset (e.g. per-year analysis of an individual-clustered panel) madetapply()emitNAfor the empty clusters, yielding anNASE that errored downstream (if (se > 0): “missing value where TRUE/FALSE needed”). Empty clusters contribute nothing, so they are now dropped. Fixesmorie_otis_irm_dml()on per-year clustered runs. Regression test added.
Citation cleanup: remove Zenodo references
-
README.md: removed the “(DOIs will be re-added once we re-deposit on Zenodo.)” promise. The Zenodo deposits for the morie publication set were taken down; we are not committing to re-depositing. -
inst/CITATION: removed the stale “also the R package source on Zenodo” comment. -
NEWS.md: removed Zenodo DOI references from the historical 0.9.5.7 changelog entry. - No live DOI strings ever shipped in rmorie; this just removes the language that implied otherwise.
Phase 1 hotfix: drop wrappers for CRAN-archived packages
- Removed
morie_anchors_analyze(Phase 1.l) – upstreamanchorswas archived from CRAN on 2022-03-06 (check problems not corrected). pak resolver could not solve the dependency, blocking CI. - Removed
morie_causal_mediation(Phase 1.h) – upstreamcausalweightwas archived from CRAN on 2026-05-18 because its dependencyLARFwas archived. Same pak resolver failure. - DESCRIPTION: Suggests -= anchors, causalweight (35 wrapper extenders remain across Phases 1.k-1.n).
- Both wrappers can be restored from git history (a9469ec, 4d78188) if the upstream packages return to CRAN.
Phase 1.n: FDR/nonparam extenders – locfdr / fdrtool / quantreg / np / dirichletprocess / lcmm
- New file
R/extenders_nonparam.Rwith 6 wrappers (morie_locfdr_estimate, morie_fdr_qvalues, morie_quantile_reg, morie_np_kernel_reg, morie_dp_gaussian_mixture, morie_lcmm_latent_class) - DESCRIPTION: Suggests += dirichletprocess, fdrtool, lcmm, locfdr, np, quantreg
- Tests in tests/testthat/test-extenders-nonparam.R
Phase 1.m: spatial/multivariate extenders – gstat / copula / kernlab / metafor / mvtnorm
- New file
R/extenders_spatial.Rwith 9 wrappers covering variograms, kriging, copulas, kernel PCA, spectral clustering, meta-analysis, multivariate normal sampling and CDF (morie_geostat_variogram, morie_geostat_krige, morie_copula_fit, morie_copula_sample, morie_kernel_pca, morie_spectral_cluster, morie_meta_rma, morie_mvnorm_sample, morie_mvnorm_pmv) - DESCRIPTION: Suggests += copula, gstat, kernlab, metafor, mvtnorm
- Tests in tests/testthat/test-extenders-spatial.R
Phase 1.l: RDD/IRT extenders – rddensity / rdlocrand / rdpower / anchors / anominate
- New file
R/extenders_rdd.Rwith 5 wrappers (morie_rdd_density_test, morie_rdd_local_randinf, morie_rdd_power_calc, morie_anchors_analyze, morie_anominate_ideal_points) - DESCRIPTION: Suggests += anchors, anominate, rdlocrand, rdpower (rddensity was already listed)
- Tests in tests/testthat/test-extenders-rdd.R
- Note: the rdpower wrapper is exported as
morie_rdd_power_calcbecausemorie_rdd_poweralready exists inR/rdd.Ras a closed-form analytical power formula taking(n, tau, sigma); the simulation-basedrdpower::rdpowersurface is preserved alongside.
Phase 1.k: stats extenders – DescTools / performance / ppcor / coin / randtests
A new file R/extenders_stats.R adds 17 wrapper-as-extender entry points under the canonical morie_<pkg>_* prefix that delegate to five CRAN statistics packages. Each function follows the requireNamespace-guarded hard-error pattern used by the other 1.g/1.h/1.i/1.j extenders and returns a thin two-slot list with $method (qualified upstream name) and $raw (upstream object):
-
morie_desc_cramers_v,morie_desc_kappa,morie_desc_winsorize,morie_desc_gini,morie_desc_atkinson->DescTools::{CramerV, CohenKappa/KappaM, Winsorize, Gini, Atkinson}. -
morie_performance_check_model,morie_performance_r2,morie_performance_check_collinearity,morie_performance_check_outliers->performance::{check_model, r2, check_collinearity, check_outliers}. -
morie_ppcor_partial,morie_ppcor_semipartial->ppcor::{pcor, pcor.test, spcor, spcor.test}(matrix-wise wheny/zare omitted, single-triple test otherwise). -
morie_coin_independence,morie_coin_wilcoxon,morie_coin_oneway->coin::{independence_test, wilcox_test, oneway_test}. -
morie_randtests_runs,morie_randtests_turning_point,morie_randtests_bartels->randtests::{runs.test, turning.point.test, bartels.rank.test}.
DESCRIPTION: adds DescTools, ppcor, randtests to Suggests (alphabetised). coin and performance were already listed.
Tests: tests/testthat/test-extenders-stats.R covers one happy path per function, each gated by skip_if_not_installed().
Phase 1.g gap: TwoWayFEWeights + synthdid extender
Two new wrapper-as-extender entry points have been added to R/did.R to close the Phase 1.e gap. Both follow the requireNamespace-guarded hard-error pattern of the existing DiD wrappers and ship under the canonical morie_did_* namespace:
-
morie_did_twoway_fe_weights(panel, group, time, treatment, outcome, type = "feTR", ...)– thin interface toTwoWayFEWeights::twowayfeweights(de Chaisemartin & D’Haultfoeuille, 2020). Returns anmorie_did_twfe_diagnosticsS3 list with the negative-weight count, the sum of weights, and the fulltwowayfeweightsobject as$raw. Complementsmorie_did_panel_fe(which estimates the TWFE coefficient itself) andmorie_did_chaisemartin_dhaultfoeuille(which uses the same identification argument to deliver the DID-M estimator). -
morie_did_synthdid_estimate(panel, unit, time, treatment, outcome, vcov_method = "placebo", ...)– thin interface tosynthdid::synthdid_estimate(Arkhangelsky et al., 2021) under the synthdid-canonical name. Parallel to the existingmorie_did_synthetic, which keeps the rmorie result-list shape; this extender surfaces the full synthdid object and the requested variance estimator (placebo,bootstrap,jackknife).
DESCRIPTION: adds TwoWayFEWeights to Suggests. synthdid was already listed in 0.9.5.12.
Tests: tests/testthat/test-did-extender.R covers both the happy path (skipped when the optional package is not installed) and the missing-package error path.
Phase 1.g sensitivity rewrite - extend EValue / tipr / sensemakr / konfound
The sensitivity subsystem (R/sensitivity.R, ~733 LOC) keeps its existing inline math as a fallback arm but cross-references the canonical CRAN packages (rbounds, tipr, sensemakr, specr, episensr) in the Rd files, and four new wrapper-as-extender entry points have been added so MRM / paper callers can reach the full surface of these packages from inside rmorie:
-
morie_sensitivity_evalue(estimate, se, sd, type = "OLS", ...)– thin interface to theEValue::evalues.*dispatch family (evalues.OLS,evalues.RR,evalues.OR,evalues.HR,evalues.MD). Pairs with the typede_value_rr/_or/_hr/_dwrappers, which call the same backend but with a fixed scale. -
morie_sensitivity_tipping_point(estimate, smd, r2, ...)– thin interface totipr::tipfor unmeasured-confounder tipping points. Pairs withtipping_point_analysis(which targets missing-data sensitivity rather than unmeasured confounders). -
morie_sensitivity_omitted_var_bias(model, treatment, benchmark_covariates, ...)– thin interface tosensemakr::sensemakron a fittedlm. Pairs withomitted_variable_bias(closed-form Cinelli-Hazlett robustness value when onlyestimate+se+ dof are available). -
morie_sensitivity_konfound(estimate, se, n, n_covariates, ...)– thin interface tokonfound::pkonfoundfor the Frank et al.- percent-bias-to-invalidate and impact-threshold-of-a- confounding-variable (ITCV).
All four hard-error with a clear install.packages(...) message if the optional dependency is missing, matching the Phase 1.e / 1.f pattern.
rosenbaum_bounds, tipping_point_analysis, omitted_variable_bias, specification_curve, and probabilistic_bias_analysis are kept in-house (the rmorie result shapes are part of the public API and the inline math remains the reference fallback). manski_bounds, bias_adjusted_estimate, and sensitivity_summary are novel / aggregator code with no clean CRAN counterpart.
DESCRIPTION: adds tipr, sensemakr, konfound to Suggests.
Tests: tests/testthat/test-sensitivity.R extended with eight new test_that() blocks (one happy path + one missing-package error path per new extender, all gated by skip_if_not_installed). ## R/causal.R rewrite + new causal extenders
The causal-inference subsystem (~876 LOC) has been thin-wrapped over the canonical CRAN causal-inference packages while preserving every inline math fallback for CRAN-only installs (dual-arm pattern).
-
morie_estimate_propensity_scores()delegates toWeightIt::weightit(method = "glm", estimand = "ATE")when available; falls back tostats::glm(family = binomial()). -
morie_estimate_ate()/morie_estimate_att()/morie_estimate_atc()inherit the WeightIt delegation through the propensity-score helper; Hajek difference and influence-function SE remain inline to preserve the closed-form result shape. -
morie_estimate_aipw()keeps the AIPW score inline; the propensity arm picks up WeightIt automatically. Rd cross-referencesAIPW::AIPWas the canonical SuperLearner-based alternative. -
morie_estimate_g_computation()delegates the standardisation step tostdReg::stdGlm()when available; falls back to the inlineglm()+ treatment-flipped counterfactual contrast. -
morie_estimate_late()already usedivreg::ivreg(); now also recognisesAER::ivreg()as a second delegation arm, falling back to manual 2SLS otherwise. -
morie_estimate_double_ml()/morie_estimate_irm()continue to delegate toDoubleML::DoubleMLPLR/DoubleMLIRMwhen available; fall back to the cross-fit ridge implementation. -
morie_e_value()delegates toEValue::evalue()when available; falls back to the inline closed-form RR -> E-value formula. -
morie_sensitivity_rosenbaum()delegates torbounds::psens()when available; falls back to the inline sign-score bound.
Four new extender functions are introduced for CRAN dependencies that previously had no morie_* entry point:
-
morie_causal_impact(data, pre_period, post_period, model_args)->CausalImpact::CausalImpact()(Brodersen et al. 2015 Bayesian structural time-series intervention analysis). -
morie_causal_weighting(data, treatment, covariates, method, estimand, ...)->WeightIt::weightit()(full method palette: glm / cbps / ebal / ps / energy / optweight). -
morie_causal_robust_se(model, type, cluster, ...)->sandwich::vcovHC()/vcovHAC()/vcovCL()(HC0-HC5, HAC, one-way cluster-robust variance). -
morie_causal_mediation(y, d, m, x, trim, boot, ...)->causalweight::medweight()(semiparametric IPW direct / indirect effect decomposition).
The four extenders hard-error on missing packages (no inline fallback) since each upstream implementation is too large to re-implement compactly. New tests live in tests/testthat/test-causal-extenders.R and are guarded with skip_if_not_installed().
DESCRIPTION Suggests now lists AIPW, CausalImpact, causalweight, rbounds, sensitivitymv, and stdReg so the extenders and the delegation arms can find their upstream packages when available.
R/bootstrap_methods.R rewrite - delegate to boot / bootstrap / resample / rsample / simpleboot / coin / ipred / sandwich
The bootstrap / resampling subsystem (~867 LOC) has been re-routed through the canonical CRAN packages while preserving the rmorie API and the morie_bootstrap_result / morie_jackknife_result / morie_permutation_test_result / morie_cv_result S3 return shapes so that stat_commands, the print methods, and MRM analyses keep working unchanged.
Thin-wrapped (with requireNamespace-guarded delegation arm + inline fallback so the wrapper keeps working on minimal installs):
-
bootstrap()– nonparametric bootstrap now delegates toboot::boot(stratification viastrata=) andboot::boot.ciforpercentile / basic / normal / bcaCIs. ThestudentizedCI path and theclusterresampling path remain inline becauseboot::boot.ci(type = "stud")requires a precomputed variance estimator andboot::bootdoes not expose cluster-of-clusters resampling for the rmoriestatistic(data) -> scalarsignature. -
parametric_bootstrap()– delegates toboot::boot(sim = "parametric")with an MLE / ran.gen pair built from the requested distribution. -
block_bootstrap()– moving / stationary blocks delegate toboot::tsboot(sim = "fixed" / "geom"); the circular-block path stays inline becauseboot::tsbootdoes not expose a circular sim mode. -
jackknife()– delegates tobootstrap::jackknifewhen installed (rmorie reconstructs pseudovalues / influence values around the returnedjack.values). -
permutation_test()/paired_permutation_test()– inline shuffle loops retained (the rmorie API returns the full null distribution which downstream MRM code consumes);coin’soneway_test(distribution = "approximate")andsymmetry_test(distribution = "approximate")are cross-referenced as the canonical CRAN equivalents. -
bootstrap_632()– inline.632 / .632+retained because the rmorie API takes nakedmodel_fn/score_fncallables;ipred::errorest(estimator = "632plus")is cross-referenced. -
repeated_cv()/leave_one_out_cv()– delegate torsample::vfold_cvfor fold construction when no stratification or grouping is requested;caret::trainControlandrsample::loo_cvcross-referenced.
Kept as in-house implementations (no clean CRAN drop-in for the rmorie API):
-
subsampling()– Politis-Romano-Wolf rate scaling over a user-suppliedstatistic(data);np::npsubsampleis closest but is kernel-specific. -
delete_d_jackknife()– generalised jackknife with custommax_subsetsenumeration cap;resample::jackknifeis cross-referenced. -
wild_bootstrap()– returns the full resampled coefficient distribution;sandwich::vcovBS(variance only) andfwildclusterboot::boottest(p-value only) cross-referenced.
Added four new extender entry points (thin pass-through to the canonical packages):
-
morie_boot_run(data, statistic, R, strata, ...)– directboot::bootbridge with rmorie-stylestatistic(data) -> scalaradapter. -
morie_boot_basic_ci(boot_obj, type, conf)– directboot::boot.cibridge returning tidylist(perc = c(lo, hi), bca = c(lo, hi), ...). -
morie_rsample_bootstraps(data, times, ...)– directrsample::bootstrapsbridge returning anrset. -
morie_simpleboot_two(x, y, statistic, R, ...)– directsimpleboot::two.bootbridge for two-sample bootstrap of a scalar statistic.
DESCRIPTION: adds boot, bootstrap, coin, ipred, resample, rsample, simpleboot to Suggests (sandwich was already present).
Function inventory is preserved: 11 prior exports kept (bootstrap, parametric_bootstrap, wild_bootstrap, block_bootstrap, jackknife, delete_d_jackknife, permutation_test, paired_permutation_test, subsampling, bootstrap_632, repeated_cv, leave_one_out_cv) plus 4 new (morie_boot_run, morie_boot_basic_ci, morie_rsample_bootstraps, morie_simpleboot_two). All 20 (15 prior + 5 new) tests/testthat/test-bootstrap_methods.R test_that blocks pass (73 expectations, 2 conditional skips when rsample or simpleboot is not installed).
R/effects.R rewrite - thin-wrap over emmeans / marginaleffects / broom / stdReg / rbounds / EValue (phase 1.j)
The treatment-effect / marginal-effects module has been thin-wrapped around its canonical CRAN extender packages and gained a new family of morie_effects_* wrappers over Vincent Arel-Bundock’s marginaleffects API plus the emmeans and broom ecosystems.
Thin-wrapped (existing API preserved; requireNamespace-guarded delegation arm + inline fallback so the wrapper keeps working on CRAN-only installs):
-
estimate_ate()– guarded HC3 SE viasandwich::vcovHC+lmtest::coeftest; falls back to naive model SE with a warning. -
estimate_plr(),estimate_pliv()– already DoubleML-aware; retained as is with style cleanups (snake-case locals,stats::qnorm/stats::pnormqualification, brace style). -
estimate_ate_gcomputation()– delegates tostdReg::stdGlm()for the canonical regression-standardisation backend (analytic SE on the contrast scale, no bootstrap needed); falls back to the legacy inline bootstrap implementation whenstdRegis absent. -
sensitivity_rosenbaum()– delegates torbounds::psens()whenrboundsis installed and the matched-pair count is sufficient; falls back to the inline normal-approximation Wilcoxon signed-rank bounds otherwise. -
e_value()– delegates toEValue::evalues.OLS()when bothEValueis installed AND the caller supplies an outcome standard deviation via the newsd_yargument; falls back to the closed-form continuous-scale RR proxy so the Python and R ports stay numerically aligned by default.
New extender wrappers (each a thin pass-through; the underlying package’s native object is returned verbatim so downstream code keeps working with the canonical API):
-
morie_effects_emmeans(model, specs, ...)->emmeans::emmeans(). Useemmeans::pairs()/emmeans::contrast()on the returnedemmGridfor pairwise or custom contrasts. -
morie_effects_predictions(model, newdata, ...)->marginaleffects::predictions(). -
morie_effects_comparisons(model, variables, ...)->marginaleffects::comparisons(). -
morie_effects_slopes(model, variables, ...)->marginaleffects::slopes(). -
morie_effects_tidy(model, ...)->broom::tidy()(with asummary()-based fallback frame for thelm/glmclasses rmorie’s MRM pipeline ships, so downstream tidy callers work even on minimal-Suggests CI runs).
The effects and margins packages are added to Suggests for the cross-reference path – users who want Fox’s effect() / predictorEffects() or Leeper’s Stata-style margins::margins() can call them directly on a model fitted via rmorie, without an intervening wrapper.
DESCRIPTION: adds broom, effects, emmeans, marginaleffects, margins, performance, rbounds, stdReg to Suggests.
Net: R/effects.R grows from 461 to ~640 LOC because the legacy treatment-effect functions now carry both a CRAN-delegation arm AND an inline fallback (CRAN policy does not allow Suggests to be hard required), plus 5 new extender wrappers + 1 shared helper. All 6 legacy exports preserved (estimate_ate, estimate_plr, estimate_pliv, estimate_ate_gcomputation, sensitivity_rosenbaum, e_value); 5 new exports added (morie_effects_emmeans, morie_effects_predictions, morie_effects_comparisons, morie_effects_slopes, morie_effects_tidy).
R/multiple_testing.R rewrite - delegate to poolr / qvalue / harmonicmeanp / gMCP / mutoss
The multiple-testing-correction subsystem (~916 LOC) has been rewritten to forward to the canonical CRAN / Bioconductor packages where one exists. Every wrapper preserves the rmorie API and the morie_multiple_testing_result / morie_rich_result S3 shape so that the stat_commands dispatcher, the print.morie_multiple_testing_result method, and MRM analyses keep working unchanged.
Thin-wrapped (with requireNamespace-guarded delegation arm + inline fallback so the wrapper keeps working on CRAN-only installs):
-
bonferroni(),holm(),hochberg(),hommel(),benjamini_hochberg(),benjamini_yekutieli()– alreadystats::p.adjustwrappers, retained as-is. -
sidak(),holm_sidak()– inline closed-form math;mutosscross-referenced in Rd as the canonical step-down equivalent. -
storey_q()– delegates toqvalue::qvalue(Bioconductor) when installed; falls back to the inline Storey cutoff otherwise. -
estimate_pi0()– delegates toqvalue::pi0estforstorey/bootstrapmethods when installed; falls back to inline estimators. -
fisher_combined()– delegates topoolr::fisherwhen installed. -
stouffer_combined()– delegates topoolr::stoufferwhen installed and no weights are supplied (weighted Stouffer stays inline becausepoolrdoes not take per-test weights). -
tippett_combined()– delegates topoolr::tippettwhen installed. -
harmonic_mean_p()– delegates toharmonicmeanp::p.hmpwhen installed. -
n_effective_tests()– delegates topoolr::meff(Galwey / Li-Ji / Nyholt) when installed. -
fixed_sequence(),fallback_procedure()–gMCPcross- referenced in Rd as the canonical graphical-MCP equivalent; inline implementations retained to preserve the rmorie stage-list return shape.
Kept as in-house implementations (no clean CRAN drop-in for the rmorie API):
-
cauchy_combination()– Liu and Xie 2020; ACAT is GitHub-only. -
hierarchical_bonferroni()– rmorie-specific stage-list return shape;gMCPcovers the concept with a different graphical API. -
local_fdr()– Efron empirical-Bayes KDE shape thatlocfdrdoes not match in return structure. -
permutation_fwer(),permutation_fdr()– step-down max-T and empirical-null-p FDR over user-supplied null matrices; no CRAN function exposes the same API. -
adjust_p_values()– front-end dispatcher across the rmorie wrappers; consumed bystat_commands.
DESCRIPTION: adds poolr, qvalue, gMCP, harmonicmeanp, multcomp, mutoss to Suggests.
Net: R/multiple_testing.R grows from 916 to 1118 LOC because each thin-wrap function now carries both a CRAN-delegation arm AND an inline fallback (CRAN policy does not allow Suggests to be hard required, and qvalue is Bioconductor only). Function inventory is unchanged: 25 exports preserved (bonferroni, sidak, holm, hochberg, hommel, holm_sidak, benjamini_hochberg, bh, benjamini_yekutieli, by_fdr, storey_q, fisher_combined, stouffer_combined, tippett_combined, simes_combined, harmonic_mean_p, cauchy_combination, fixed_sequence, fallback_procedure, hierarchical_bonferroni, estimate_pi0, adjust_p_values, n_effective_tests, local_fdr, permutation_fwer, permutation_fdr, plus the print.morie_multiple_testing_result S3 method). All 85 tests/testthat/test-multiple_testing.R assertions pass on a fallback-only install.
R/did.R rewrite - delegate to did / DRDID / fixest / HonestDiD / bacondecomp / DIDmultiplegt
The DiD subsystem (~1,719 LOC) has been rewritten to forward to the canonical CRAN packages instead of carrying ~700 LOC of base-R fallback code:
-
morie_did_panel_fe()is now a thin wrapper overfixest::feols(y ~ d | unit + time)with cluster-robust SE and hard-errors iffixestis not installed (the base-R two-way within-transform fallback has been removed). -
morie_did_event_study()is a thin wrapper overfixest::feolswithfixest::i(rel_time, ref = -1)relative-time dummies plus unit and time fixed effects; hard-errors iffixestis missing. -
morie_did_group_time_att()is a thin wrapper overdid::att_gtfor the Callaway-Sant’Anna group-time ATTs and hard-errors ifdidis not installed (the base-R bootstrap fallback has been removed). -
morie_did_doubly_robust()is a thin wrapper overDRDID::drdid_rc(Sant’Anna-Zhao 2020 repeated-cross-section doubly-robust DiD) and hard-errors ifDRDIDis missing (the hand-written GBM-or-logistic + linear-or-GBM bootstrap fallback has been removed). Theps_model/or_modelarguments are retained for back-compat but ignored; DRDID uses logistic propensity and linear outcome regression internally. -
morie_did_bacon_decomposition()is a thin wrapper overbacondecomp::baconand hard-errors ifbacondecompis not installed (the base-R timing-pair enumeration fallback has been removed). -
morie_did_chaisemartin_dhaultfoeuille()is a thin wrapper overDIDmultiplegt::did_multiplegtand hard-errors ifDIDmultiplegtis not installed (the base-R switcher-comparison bootstrap fallback has been removed). -
morie_did_synthetic()continues to delegate tosynthdid::synthdid_estimate(no change; synthdid is the only R implementation). -
morie_did_sensitivity_analysis()keeps its delta-bound CI sweep but the Rd now cross-referencesHonestDiD::createSensitivityResults_relativeMagnitudesas the reference implementation of Rambachan-Roth 2023 for event-study estimates.
The OLS-based wrappers (morie_did_2x2, morie_did_repeated_cross_section, morie_did_triple_difference, morie_did_continuous_treatment, morie_did_fuzzy) continue to use the in-package .morie_did_ols_robust_se helper because the specs are simple OLS / 2SLS regressions and a CRAN dependency for trivially-short OLS would be a regression. The same helper is reused by morie_did_wild_cluster_bootstrap, which remains base-R by design (fwildclusterboot is GitHub-only; see 0.9.5.12 NEWS).
Aggregators that consume DiD output and produce rmorie-specific tables (morie_did_aggregate_gt_att, morie_did_staggered, morie_did_parallel_trends_data, morie_did_test_parallel_trends, morie_did_placebo_test_*, morie_did_heterogeneous, morie_did_diagnostics) are unchanged.
Net: R/did.R shrinks from 1,719 to 1,463 LOC (-256, -15%); all 22 morie_did_* exports preserved; result-list shape is unchanged so downstream callers see the same fields.
DESCRIPTION: adds DRDID, HonestDiD, DIDmultiplegt to Suggests (fixest, did, bacondecomp, synthdid were already listed).
R/matching.R rewrite - delegate to MatchIt / cobalt / WeightIt
The matching subsystem (~2,183 LOC) has been rewritten to forward to the canonical CRAN packages instead of carrying ~950 LOC of base-R fallback code:
-
morie_matching_nearest_neighbor(),morie_matching_exact(),morie_matching_cem(),morie_matching_mahalanobis(),morie_matching_optimal_pair(),morie_matching_full(),morie_matching_subclassify(),morie_matching_variable_ratio()are now thin wrappers overMatchIt::matchit()and now hard-error if MatchIt (or its optionaloptmatchback end) is not installed. -
morie_matching_genetic()is a thin wrapper overMatching::GenMatch()+Matching::Match()and hard-errors ifMatchingis missing. -
morie_matching_entropy_balance()is a thin wrapper overWeightIt::weightit(method = "ebal")(orebal::ebalanceas a fallback) and hard-errors if neither is installed. -
morie_matching_balance(),morie_matching_balance_table(),morie_matching_love_plot_data()are kept (they return themorie_balance_resultshape downstream MRM code consumes) but the Rd cross-references now point users atcobalt::bal.tab()/cobalt::love.plot()for richer balance reporting. -
morie_matching_cardinality()keeps its iterative-caliper heuristic; the Rd now cross-referencesdesignmatch::cardmatch()for the exact mixed-integer-programming alternative.
The carceral-domain helpers (morie_matching_att_matched / ate_matched / atc_matched, morie_matching_abadie_imbens_se, morie_matching_rosenbaum_bounds, morie_matching_doubly_robust, morie_matching_multi_treatment, morie_matching_longitudinal, morie_matching_quality, morie_matching_overlap, morie_matching_estimate_propensity / _trim_propensity / _common_support) are unchanged - they encode rmorie-specific output shapes (morie_match_result, morie_te_result) that the MRM / SIU / OTIS code paths depend on.
Net: R/matching.R shrinks from 2,183 to 1,586 LOC (-597, -28%); all 27 morie_matching_* exports preserved; behaviour-compatible for callers that already have MatchIt installed (which is the case for all matching tests in the rmorie suite).
DESCRIPTION: adds cobalt, designmatch to Suggests.
Breaking - CRAN-equivalent functions removed
To reduce code duplication with established CRAN packages and address rOpenSci feedback on fn_call_network_size, the following functions have been removed in favour of their well-maintained CRAN equivalents:
| Removed from rmorie | Use instead |
|---|---|
cohens_d / morie_cohens_d
|
effectsize::cohens_d |
cramers_v / morie_cramers_v
|
effectsize::cramers_v |
eta_squared / morie_eta_squared
|
effectsize::eta_squared |
hedges_g / morie_hedges_g
|
effectsize::hedges_g |
morie_effective_sample_size |
posterior::ess_basic or coda::effectiveSize
|
morie_find_project_root |
here::here() or rprojroot::find_root()
|
fleiss_kappa |
irr::kappam.fleiss |
kruskal_wallis |
stats::kruskal.test (base R) |
shapiro_wilk |
stats::shapiro.test (base R) |
anderson_darling |
nortest::ad.test |
jarque_bera |
tseries::jarque.bera.test |
Install the replacements with install.packages(c("effectsize", "irr", "nortest", "tseries", "here")).
morie_two_sample_t_test() / morie_chi_square_test() / morie_anova_one_way() now return list fields named cohens_d / cramers_v / eta_squared (was morie_cohens_d / morie_cramers_v / morie_eta_squared); the computation is inlined and unchanged. Internal callers of morie_find_project_root() now go through a private .morie_project_root() wrapper around here::here().
DESCRIPTION: adds here to Imports; adds effectsize, irr, tseries to Suggests.
rmorie 0.9.5.12 - 2026-05-25
CI: drop fwildclusterboot (pak recursive Remotes unreliable) (3MMM.40c)
- Removed
fwildclusterbootfrom Suggests and removed the.morie_did_have_fwildboot()helper + theif (.morie_did_have_fwildboot()) { fwildclusterboot::boottest(...) }branch inmorie_did_wild_cluster_bootstrap(). The function now goes straight to the base-R Rademacher/Webb wild-cluster bootstrap (which already existed as the fallback and mirrors the Python implementation; no math change for any caller). - Reason: pak’s resolver does not reliably recurse through a Remote’s own Remotes. 3MMM.40 added
s3alfisc/fwildclusterbootand 3MMM.40b addeds3alfisc/summclust, but the resolver still reportedsummclust: Can't find package called summclust– so the recursive-Remote pattern is structurally fragile. Following the same “drop optional CRAN-archived/GitHub-only deps” pattern used forrddin 3MMM.40. -
Remotes:now lists onlysynth-inference/synthdid, which has no GitHub-only transitive Imports.