NEWS


rmorie 2026-05-25 (2026-05-25)

CI: drop fwildclusterboot (pak recursive Remotes unreliable) (3MMM.40c)

CI: pak resolver -- transitive Remote for summclust (3MMM.40b)

R CMD check ERROR fixes (3MMM.39)

CI: setup-r-dependencies pak resolver unblocked (3MMM.40)

rmorie 2026-05-24 (2026-05-24)

Correctness recovery: math typesetting restored

Phase 3LLL reverses the destructive \eqn{LATEX} -> \code{LATEX} swap shipped in commit f399ec41a (Phase 3KKK1+2). That swap eliminated the "Lost-braces" warning but at the cost of stripping LaTeX math typesetting from the PDF/HTML manual and turning every greek letter, \hat, \sum, \frac, etc. into an "unknown macro" warning at R CMD check.

The proper Rd-compliant fix is the two-argument form:

\eqn{LATEX}{ASCII fallback}      # inline
\deqn{LATEX}{ASCII fallback}     # display

Every affected line (104 R files) now uses this form, preserving PDF math while satisfying the Rd parser. Driven by fix_rd_math.py, a LaTeX->ASCII transformer covering the common Greek alphabet, operators (\sum, \int, \hat, \bar, \frac, \sqrt), and relation symbols.

Auto-install helper for optional dependencies

New morie_install_extras() lets users install the ~50 optional Suggests: packages in one call. CRAN policy forbids install.packages() at .onLoad() time, so morie ships an opt-in helper instead. Three modes:

morie_install_extras()                       # missing only (default)
morie_install_extras("all", ask = FALSE)     # everything, CI-safe
morie_install_extras(c("hawkes", "sf"))      # named subset

The helper also probes for the C system libraries libcurl, libsodium, and liboqs and prints platform-specific install hints when any are missing. System libraries must be installed BEFORE re-installing morie so the configure-time probes link the C/C++ backends against them.

Bulk open-data catalog explosion

Cross-portal morie_dataset_portal_catalog() grows from ~1,044 rows to 9,242 rows across 14 portals. Every Socrata / CKAN / ArcGIS Hub / Opendatasoft portal morie touches now has its full public catalog bundled offline.

Phase 3GGG -- 6-portal bulk harvest

Phase 3HHH -- full catalogs for the last two portals

Catalog totals

calgary_opendata      933    nyc_opendata          2861
chicago              1864    ontario_ckan            38
edmonton_opendata    2027    ottawa_opendata        287
montreal_opendata     401    statcan_ccjs            10
nyc_nypd                8    toronto_opendata       540
tps_arcgis_hub         71    tps_psdp                11
vancouver_opendata    190    vpd_geodash              1
                                                  -------
                                                     9242

Bundled fixture footprint: ~3.4 MB of catalog metadata; per-row unwound this is the metadata equivalent of every NYC dataset descriptor + every CKAN package summary + every Hub item -- offline queryable via morie_datasets_browse(keyword=...).


Cross-portal open-data infrastructure

Major sprint adding 14 open-data portals + a unified browse/load interface. The cross-portal morie_dataset_portal_catalog() now spans 9 cities + 1 federal source + ~800 dataset entries across 4 different API protocols.

Phase 3CCC -- NYC + TPS deep coverage

Phase 3DDD -- Canadian municipal + federal coverage

Phase 3EEE -- Montreal + expanded Toronto/Vancouver + dispatcher

Phase 3FFF -- dispatcher hardening + prairie cities

Catalog totals (across 14 portals)

chicago             8     ontario_ckan       38
nyc_nypd            8     vancouver_opendata 190
nyc_opendata       10     vpd_geodash         1
tps_arcgis_hub     71     statcan_ccjs       10
tps_psdp           11     montreal_opendata  23
                          toronto_opendata  208
                          calgary_opendata  157
                          edmonton_opendata 195
                          ottawa_opendata   106

Total ~ 1044 catalog rows.


rmorie 2026-05-23 (2026-05-23)

Formula corrections (affect Python AND R sibling identically):

R-side feature additions:

Other fixes carried from the 5-layer review on 2026-05-22 (all Python-parity-verified before applying):

Earlier from 2026-05-22 marathon (already in 0.9.5.6 in tree):

rmorie 2026-05-22 (2026-05-22)

R-side describe() parity closure. Patch release that closes one of the two parity gaps named in v0.9.5.4: the pedagogical narratives that the Python sibling exposes via morie.describe() are now available on the R side via morie_describe() and the string-only variant morie_describe_by_name().

R API additions:

Bundled data:

Build tooling:

Tests:

Remaining parity gap:

rmorie 2026-05-21 (2026-05-21)

Doob → MRM chi-square rename. Patch release with deprecation aliases; no breaking changes for existing user code.

Naming:

Python API (with deprecation aliases):

R side: no R API changes; the R chi-square family was already renamed in v0.9.5 (vignette chi-square-and-anova.Rmd).

Patch release over 0.9.5.2.

CRAN Policy: full cache-leak fix (supersedes 0.9.5 which was uploaded to win-builder with incomplete cache-isolation).

Documentation + CI hardening (added 2026-05-21 to the v0.9.5 release branch alongside the SIU + rename work):

lintr / goodpractice cleanups:

SIU harvester: polite by default, manifest-aware, retry-aware, and auditable against the original published reports.

New: a generic open-data access layer, and a much wider dataset catalog.

Fix: Toronto Police Service open-data ingestion correctness and reliability.

rmorie 2026-05-18 (2026-05-18)

Fix: CRAN source-package compliance for the vendored C++ core header.

rmorie 2026-05-17 (2026-05-17)

Fix: complete the Docker image build fix; atomic release pipeline.

Fix: the Docker container build for the v0.9.1 C/C++ core.

New: a shared C/C++ computational backend and a Hawkes-process engine.

rmorie 2026-05-16 (2026-05-16)

New: dataset availability auditing, more open-data sources, and in-place self-update.

New: the fairness & disparity-audit subsystem (morie.fairness).

A subsystem for auditing risk-assessment, recidivism, and predictive-policing systems for racial and other group disparities. morie does not deploy such systems — it measures whether an existing one encodes disparate treatment, so researchers and oversight bodies can hold those systems accountable.

The methods are clean-room reimplementations written from published descriptions — IBM AIF360; the SciencesPo Predictive-policing-Chicago project; Barman & Barman (arXiv:2603.18987); and the COMPAS audit in pbiecek's XAI Stories. No third-party code was copied.

Security patch.

rmorie 2026-05-15 (2026-05-15)

License change. morie is now licensed under the GNU Affero General Public License v3 or later (AGPL-3), on both the Python and R sides.

rmorie 2026-05-14 (2026-05-14)

Documentation-only patch on top of 0.7.1. Supersedes the in-queue 0.7.1 submission for the rOpenSci pre-submission inquiry / next CRAN bump.

rmorie 2026-05-11 (2026-05-11)

rmorie 0.9.6

Citation cleanup: remove Zenodo references

Phase 1 hotfix: drop wrappers for CRAN-archived packages

Phase 1.n: FDR/nonparam extenders -- locfdr / fdrtool / quantreg / np / dirichletprocess / lcmm

Phase 1.m: spatial/multivariate extenders -- gstat / copula / kernlab / metafor / mvtnorm

Phase 1.l: RDD/IRT extenders -- rddensity / rdlocrand / rdpower / anchors / anominate

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):

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:

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:

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).

Four new extender functions are introduced for CRAN dependencies that previously had no morie_* entry point:

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):

Kept as in-house implementations (no clean CRAN drop-in for the rmorie API):

Added four new extender entry points (thin pass-through to the canonical packages):

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):

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):

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):

Kept as in-house implementations (no clean CRAN drop-in for the rmorie API):

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:

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:

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.1.2

rmorie 0.1.0-4