PESTO dependency floor to >= 0.6.0. PESTO 0.6.0 adds covariance
inflation and localisation against ensemble under-dispersion and records
per-iteration spread-ESS / inflation / localisation diagnostics in the
ensemble manifest; the C2 manifest-consumption surface
(dr_date_scenario(), mmd_ppc(), coverage_test()) is verified against it.New concordance_test_nystrom(): a low-rank counterpart to
concordance_test() for large ensembles. The pooled sample is factorised
once -- by the Nystrom method (default) or random Fourier features -- and the
summed pairwise unbiased MMD and its joint-permutation null are computed from
the n x m factor in O(n m) per permutation rather than O(n^2), with the
rank m controlling the speed / accuracy trade-off. The verdict object and
the pairwise discrepancy matrix that localises the offending source are
identical to the exact test.
New ksd_test_nystrom(): a low-rank counterpart to ksd_test() for large
samples. The n x n Stein-kernel matrix is never materialised; it is
replaced by a Nystrom factor with which the kernel Stein discrepancy and its
wild-bootstrap null are computed in O(n m). Because the Langevin Stein
kernel is itself positive semi-definite, the factorised kernel is a valid
Stein kernel in its own right, so the accelerated test is the exact procedure
applied to a rank-m kernel: the degenerate-U-statistic calibration is
preserved (empirical Type-I error stays at the nominal level), and the
approximation trades statistical power -- not test validity -- for speed.
ksd_test() and concordance_test() gain an n_exact_max argument
(default 5000). Above this sample-size ceiling the call is delegated to the
low-rank counterpart, so a large sample stays tractable without an O(n^2)
blow-up. The switch is never silent: it is announced by a message, recorded
in the returned object (approximation and m, so the result is
reproducible from the object), and escapable with n_exact_max = Inf to
force the exact test at any size.
coverage_test(): a graded coverage / calibration diagnostic for a
predictive ensemble against held-out observations. Where mmd_ppc() and
ksd_test() give a binary reject/accept verdict, coverage_test() reports
how and which way an ensemble is mis-calibrated -- empirical coverage at
nominal interval levels, a signed dispersion ratio (Var(PIT)/(1/12): above
one is under-dispersion / over-confidence, below one is over-dispersion), a
bias indicator, and a rank-histogram uniformity test -- classifying the
ensemble as calibrated, under-dispersed, over-dispersed, or biased. It is the
interpretable companion to the kernel verdicts, and quantifies the
ensemble-under-dispersion that the cross-member PESTO validation surfaced
(e.g. "your 90% intervals cover 56% -- under-dispersed by a factor of 1.9").
Dispatches on a numeric matrix, a pesto_ensemble, or a
pesto_ensemble_manifest (threading fidelity provenance), mirroring
mmd_ppc(). Marginal (per-output) calibration; pure R.dr_date_scenario() now inspects the fidelity slot of the two input
PESTO::pesto_ensemble_manifest objects. A provenance mismatch -- one
scenario single-fidelity and the other multi-fidelity, or two
multi-fidelity runs with different stack shapes / final levels -- raises
a warning by default (the two ensembles may sit at different physical
fidelities, confounding the distributional contrast), escalated to an
error with the new strict_fidelity = TRUE argument. The fidelity
provenance (list(baseline, intervention)) is threaded into the result
and shown by print().mmd_ppc() on a manifest records the manifest's fidelity provenance in
result$pesto_metadata$fidelity, so a PPC verdict traces back to the
fidelity the producing ensemble was calibrated at.NULL and pass. Full fidelity provenance
is populated by PESTO's multi-fidelity pesto_ies_callback() runs.ksd_test(): a one-sample kernel Stein discrepancy goodness-of-fit
test. Where mmd_test() compares two samples, ksd_test() compares a
sample against a distribution supplied through its score
(the gradient of its log density), so the target may be unnormalised and
no reference sample is needed. The calibration framing is direct -- given
posterior or ensemble draws and the score of the distribution they claim
to represent, the test asks whether the draws actually follow it. It is
sensitive to mean, variance, and tail mis-specification, and calibrates
the degenerate U-statistic null with a wild bootstrap (Chwialkowski et
al., 2016).kernel = "rbf".gaussian_score(): a score-function factory for a multivariate-normal
target, for use as the score argument of ksd_test().concordance_test(): a kernel k-sample concordance test asking whether
several samples -- posterior draws from different inference engines, or
scenario ensembles from different simulators -- come from a common
distribution. The statistic is the summed pairwise Maximum Mean Discrepancy
with a single joint-permutation null (so the family-wise error is
controlled), and the result carries the full pairwise discrepancy matrix, so
a rejection localises which source diverges and on which margin.numeric_score(): a finite-difference score adapter that turns any
(possibly unnormalised) log density into the score ksd_test() needs, so a
target need only be expressible as a log-density function, not
hand-differentiated.ksd_test(), concordance_test(), and numeric_score() together.test-end-to-end.R). One
confounded data-generating process is run through the whole pipeline and
every analytical corner is checked for a meaningful, correct verdict:
marginal hsic_test() power and independence; bd_hsic_test() removing a
purely confounder-induced association while detecting a genuine causal one;
propensity recovery; dr_date_test() power, Type I control, and double
robustness (AIPW and IPW-only fallback agree); dr_dett_test();
two-sample mmd_test(); Nystrom and RFF agreement with exact HSIC;
hierarchical within-cluster Type I control; full-pipeline seed
reproducibility; and permutation-null calibration.test-density-ratio-api.R): fit_density_ratio() /
predict_density_ratio() round-trip and reproducibility, plot_weights(),
and the new print.cme_fit() method.print() method for fit_cme() objects (print.cme_fit()).@family tags added across the exported API so the documentation
cross-links related functions; dr_date_scenario()'s example now runs
(\donttest rather than \dontrun).R/sensitivity.R split: the hsic_sensitivity() S3 methods now live in
R/sensitivity-methods.R.Remotes: github::max578/PESTO line now that PESTO (>= 0.4.1)
is served from the max578 r-universe; the CI extra-repositories entry
resolves it.dr_date_test()
previously fitted a conditional mean embedding outcome model and then
discarded it, returning an inverse-probability-weighted statistic
regardless of outcome_model -- so outcome_model = "krr" and "zero"
gave identical results despite the documented double-robustness claim.
The statistic now forms the augmented (AIPW) counterfactual mean
embeddings, consistent if either the propensity or the outcome model
is correctly specified (Fawkes, Hu, Evans & Sejdinovic, 2024).(1 - e) / e; it now uses the correct treatment odds
e / (1 - e) with an augmented outcome-model correction on the control
arm.seed= now makes permutation tests reproducible. The C++ permutation
routines drew from Armadillo's internal RNG, which ignores set.seed();
they now draw through R's RNG, so a fixed seed reproduces the null
distribution and p-value of hsic_test(), mmd_test(),
bd_hsic_test(), dr_date_test(), dr_dett_test() and the
permutation-based sensitivity paths exactly.hierarchical_test() no longer silently swallows within-cluster
failures. Failed within-cluster sub-tests are counted and surfaced via
a warning (or an error if every eligible cluster fails). Clusters too
small for the chosen sub-test (DR sub-tests need at least 30
observations) are now skipped with a clear message and excluded from
the within-cluster average, rather than silently contributing zero.(double)(n * n) to (double)n * n).dr_date_test() and dr_dett_test() gain cross_fit (default TRUE)
and n_folds arguments: both nuisances are cross-fitted and evaluated
out-of-fold, as the doubly robust theory requires under flexible
nuisance estimators (Chernozhukov et al., 2018).dr_date_test() and dr_dett_test() gain min_ess_fraction and now
report the per-arm effective sample size (ess, ess_warning),
warning when the inverse-probability weights collapse.estimate_propensity() gains a seed argument for reproducible
cross-fitting folds.Suggests (future, future.apply, ggplot2,
viridisLite); raised the PESTO floor to the tested >= 0.4.1.aggregate_downscale().First publish of the local development line to AAGI-AUS. Lands the 0.0.0.9001 → 0.0.0.9015 cycle on top of the existing AAGI v0.1.x lineage; subsequent 0.0.0.x history below is retained as the per-feature changelog. The version-number jump (origin v0.1.1 → v0.2.0) signals the substantial new public surface arriving in this release.
kernel_spec(), kernel_matrix(),
select_bandwidth().hsic_test(),
mmd_test(), hsic_test_nystrom().bd_hsic_test() (backdoor-adjusted HSIC;
Hu, Sejdinovic & Evans, JMLR 2024).dr_date_test(),
dr_dett_test(), dr_date_scenario(), kernel_causal_test()
(Fawkes, Hu, Evans & Sejdinovic, TMLR 2024).hierarchical_test() with
within-cluster permutation.hsic_identifiability(),
hsic_sensitivity() (Da Veiga 2015; conditional-permutation null
for total-order significance).fit_density_ratio(),
predict_density_ratio(), estimate_density_ratio() (logistic /
ranger / xgboost / proxymix backends); estimate_propensity(),
assess_overlap(), plot_weights(), effective_sample_size().nystrom_factor() (Williams & Seeger
2001), rff_features() (Rahimi & Recht 2007).kernel_downscale() (Park, Muandet, Fukumizu & Sejdinovic 2013),
fit_cme(), dist_regression() (Szabó, Sriperumbudur, Póczos &
Gretton 2016), aggregate_downscale(),
posterior_sample_aggregate().mmd_ppc()
(consumes PESTO::pesto_ensemble_manifest via S3 dispatch).lhs_design() Latin-hypercube helper.PESTO (>= 0.3.0) for the pesto_ensemble_manifest S7
class.proxymix (>= 0.3.0) in Suggests as a density-ratio
backend (requireNamespace()-guarded).R CMD check --as-cran on the AAGI / CI Linux environment is
expected to report 0 errors / 0 warnings / a small number of
environmental NOTEs (new-submission boilerplate, HTML Tidy version
on macOS). Two Apple-clang-21 toolchain WARNINGs surface only on
the maintainer's local machine (R's own R_ext/Boolean.h and a
personal ~/.R/Makevars); both are absent on CRAN's build farm
and on standard GitHub Actions runners.
All historical entries below are retained for full traceability (0.0.0.9001 sole-authorship consolidation → 0.0.0.9015 third downscaling method).
aggregate_downscale()Closes the orchestra-completion gap surfaced after the 2026-05-16
deferral closeout: a downscaling method for the no-paired-training-
data regime, where only the aggregate observation and a known
aggregator are available. Companion to the proxymix Tier-2 stub
from_aggregate_likelihood(), hosted on the kernR (consumption)
side so proxymix's CRAN pre-submission stays untouched.
aggregate_downscale(y, aggregator, latent_prior, ...).
Dispatches on the aggregator's class:
A — closed-form per-component Kalman update
plus mixture-weight reweighting by per-component evidence
N(y | A mu_k, A Sigma_k A^T + sigma_y^2 I).T(x) — importance sampling within each prior
component (n_samples_per_component draws; ESS-floor
min_ess_fraction reliability gate with explicit warning()
on collapse).posterior_sample_aggregate() for drawing from the
posterior mixture (downstream uncertainty propagation).(means, covariances, weights) or as any object exposing those
slots — including proxymix::fit_proxymix() results (gated via
methods::slot(), no hard dependency added).kernR-downscaling.Rmd reframed from "Two flavours" to
"Three flavours"; full comparison table.tests/testthat/test-aggregate-downscale.R:
single-component closed-form recovery (Kalman update exact);
two-component mixture reweighting toward the likely cluster;
non-linear IS path runs with valid moments and p.s.d. covariance;
reproducibility under seed; ESS-floor warning fires under
collapse; posterior_sample_aggregate() recovers the posterior
mean; input validation; proxymix gmm_fit prior accepted via
slot extraction (skipped when proxymix absent).This is the third kernR downscaling method, structurally
distinct from kernel_downscale() (CME, paired training data) and
dist_regression() (bag-of-points, distribution-level regression).
Each occupies a different cell of the (training-data-shape ×
aggregator-knowledge) matrix.
Closes the three kernR-side tickets named as deferred in
DRAINSTORMING/reports/orchestra_critical_review_response_2026-05-16.md:
density-ratio fit/predict refactor, backend diagnostics, and
properly null-calibrated total-order significance test.
fit_density_ratio(x, z, method, ...) and
predict_density_ratio(object, new_x, new_z, type = c("log_ratio", "weight", "ratio")). All four backends (logistic, ranger,
xgboost, proxymix) return a density_ratio_fit object that can
be applied to held-out rows.bd_hsic_test() now honours the documented train/test split:
fits density-ratio on the training half, predicts on the held-out
test half. The runtime warning about the sample-split leak from
0.0.0.9013 is therefore retired. Closes P0 #2 of the critical
review.log_ratio = log(p_joint) - log(p_marg) for proxymix;
log_ratio = log(p) - log(1-p) + log(n_noise) for classifier
backends). Numerically stable on extreme tails.bd_hsic_test()$density_ratio_fit carries the fitted model so
callers can inspect backend diagnostics.estimate_density_ratio() retained as a thin
backwards-compatible wrapper that fits and predicts on the same
data; new code should prefer the explicit fit/predict pair.fit_density_ratio(method = "proxymix") now surfaces per-GMM
convergence diagnostics on fit$diagnostics:
joint_converged, marg_converged, joint_loglik, marg_loglik,
joint_bic, marg_bic, joint_aic, marg_aic,
joint_iterations, marg_iterations, n_components.print.density_ratio_fit() summarises components + BIC + per-GMM
convergence on screen.total_order_test = c("none", "cond_perm"). When
"cond_perm": cluster the design points by X_{~j} similarity
(k-means, n_clusters_cp bins; "auto" chooses
min(floor(n / 5), 20)); within each cluster permute Y;
recompute T_j on each of n_permutations permuted designs;
report p = (1 + #{T_perm ≥ T_obs}) / (1 + n_permutations).H_0: X_j ⫫ Y | X_{~j}, distinct from (and replacing) the
retracted 0.0.0.9012 pair-bootstrap method. The total_order_test
flag on the result distinguishes the new mode from the retracted
one.p_value_total_order and
p_value_total_order_adjusted under the new mode. The grid-wide
p_adjust applies as for first-order p-values.print() surfaces a min_p_total column when total_order_test = "cond_perm", with an honest annotation naming the null tested.Y, the new method
does not systematically reject — at least one parameter's raw
p-value remains ≥ 0.05 (the 0.0.0.9012 failure mode is pinned).total_order_p_value updated to point at
both total_order_ci (uncertainty) and
total_order_test = "cond_perm" (significance).Test suites at L99-coverage: density-ratio fit/predict + diagnostics
The 0.0.0.9012 total_order_p_value = TRUE mode was found by
critical review to be not null-calibrated. The pair-bootstrap
samples the empirical joint distribution, not a null-of-no-effect,
so under pure-noise Y every parameter was assigned a tiny p-value
(p ≈ 1/(1 + B)) by mechanical bootstrap geometry rather than real
signal. The orchestra smoke output active min-p = inert min-p = 0.010
was the visible failure.
Changes:
total_order_p_value arg is defunct. Passing any non-NULL
value now errors with a pointer to total_order_ci. Code that
used the field must migrate.total_order_ci = TRUE activates a pair-bootstrap
percentile CI on the index T_j itself — uncertainty
quantification, not a hypothesis test.p_value_total_order and
p_value_total_order_adjusted. The CI fields
ci_total_order_lower / ci_total_order_upper remain (still
valid).print() drops the misleading min_p_total column; instead
shows a T_CI range when total_order_ci = TRUE, with an
explicit "NOT a significance test" caveat.as.data.frame() loses the p-value columns; retains CI columns.Y, plus a
defunct-arg-error test.?hsic_sensitivity Details + vignettes/kernR-sensitivity.Rmd)
rewritten to reflect the retraction and the still-open future-work
item: a properly null-calibrated total-order significance test
(candidate path: conditional-independence rather than the marginal
complement formulation).A separate feedback_total_order_calibration.md memory entry has
been written to ensure the lesson — "bootstrap-around-empirical is
not a null" — persists across sessions.
hsic_sensitivity() gains three new arguments: total_order_p_value
(logical, default FALSE — backwards-compatible), n_bootstrap
(integer, default 200L), and ci_level (numeric, default 0.95).
When activated, computes Pick-Freeze pair-bootstrap p-values for the
null H_0: T_j = 0 and percentile CIs for each total-order index.p_value_total_order, p_value_total_order_adjusted,
ci_total_order_lower, ci_total_order_upper. The grid-wide
p_adjust method (default BH) applies to the total-order p-value
grid as well as the first-order grid.print() method surfaces a min_p_total column when total-order
p-values are present; as.data.frame() exposes the four new fields
as long-format columns alongside the existing first-order ones.T_j = 0 — under marginal independence T_j is 1, not 0 —
hence the bootstrap formulation (Da Veiga 2015 §4).tests/testthat/test-sensitivity.R (8 new blocks):
population, backwards-compat, validation, reproducibility,
additive-case CI claim, kwarg validation.proxymix (>= 0.3.0) formally declared in Suggests: to match the
optional density-ratio backend already wired in 0.0.0.9010. Closes the
DESCRIPTION-vs-NEWS gap noted during the 2026-05-16 cross-workspace
orchestra audit.kernR-proxymix-binding.Rmd — single-screen demo of all
four estimate_density_ratio() backends (logistic, ranger,
xgboost, proxymix) on one toy confounded problem, with ESS,
weight-range, and bd-HSIC p-value tabulated side-by-side. Chunks are
guarded by requireNamespace("proxymix"); the vignette renders
unconditionally and degrades gracefully when proxymix is unavailable.estimate_density_ratio() gains a fourth backend, method = "proxymix". Fits Gaussian-mixture proxies (Hoek & Elliott, 2024)
to the joint and product-of-marginals sample clouds via
proxymix::fit_proxymix(regime = "sample") and computes pointwise
density ratios from proxymix::dgmm() evaluations. Useful when the
underlying densities are multimodal or when NCE-classifier
calibration is unreliable.bd_hsic_test() exposes the new option via density_ratio = "proxymix" — the cross-package wedge between kernR (verdict) and
proxymix (density-ratio bridge) in the UQ ag stack.proxymix_components = (default 2L) sets the
Gaussian-mixture component count per density.proxymix (>= 0.3.0) added to Suggests (soft dependency,
GRDC-firewalled, MIT). requireNamespace() guard in the dispatch
emits a clear install hint when proxymix is unavailable.tests/testthat/test-density-ratio-proxymix.R
(skip_if_not_installed("proxymix") so CRAN's farm and downstream
users without proxymix are unaffected).dr_date_scenario() still uses logistic / ranger /
xgboost propensity backends. Proxymix-via-propensity is a different
statistical task (modelling P(T = 1 | X) rather than a density
ratio between two sample clouds) and is tracked as future work.mmd_ppc() for the PESTO 0.3.0 manifestmmd_ppc.pesto_ensemble_manifest() S3 method — mmd_ppc()
now consumes a PESTO::pesto_ensemble_manifest directly, completing
the v0.3.0 cross-package contract symmetry alongside
dr_date_scenario(). Posterior-predictive sample comes from
m@outputs; the user must supply held-out observed (the manifest's
obs_target slot is a single nobs-dim point — the data the posterior
was fit to — and is unsuitable as a two-sample comparator).outputs = argument (parallel to dr_date_scenario()'s
convention) lets the user focus the check on specific observation
columns.R/zzz.R .onLoad() now calls registerS3method() to wire the
method up under PESTO's package-qualified S7 class string
("PESTO::pesto_ensemble_manifest") — standard UseMethod()
dispatch can't reach it via the bare-name function file name
because R can't parse :: in an S3-method identifier.kernR-ppc vignette extended with a cross-package handoff section
demonstrating both true out-of-sample and retrodictive use against
the new contract.dr_date_scenario()) shipped earlier in 0.0.0.9007"PESTO::pesto_ensemble_manifest" (plus
"S7_object"), not the bare class name. .validate_manifest_pair()
now accepts both qualified and bare forms via a new
.is_pesto_manifest() helper.PESTO is now referenced via @importFrom PESTO pesto_ensemble_manifest as_manifest in R/kernR-package.R,
clearing the "Namespace in Imports field not imported from: PESTO"
NOTE without moving the dep to Suggests.p ≈ 1).
Test and vignette now both reflect the canonical pattern, with a
documented escape hatch for the different-posteriors case.R CMD check --as-cran now returns 0 errors / 0 notes / 2
baseline WARNINGs (unchanged local-env structural — gate held).Two complementary downscaling primitives, both rooted in the Park-Muandet-Fukumizu-Sejdinovic / Szabó-Sriperumbudur-Póczos-Gretton family of RKHS regression methods.
kernel_downscale(coarse, fine, new_coarse, ...): vector-in /
vector-out kernel-based downscaling via conditional mean embedding
(Park, Muandet, Fukumizu, Sejdinovic 2013). Trains a CME on paired
(coarse, fine) data and predicts fine-resolution outputs at new
coarse inputs. Multi-output fine supported. Lambda by LOO-CV by
default. S3: print, as.data.frame. Returns the
n_new x n_train weight matrix on demand.dist_regression(bags, y, ...): bag-in / vector-out distribution
regression (Szabó, Sriperumbudur, Póczos, Gretton 2016). Each input
is a bag of points mapped to its empirical mean embedding;
outer = "linear" (inner-product of embeddings) or "rbf"
(Gaussian over embedding-space distance). Variable bag sizes
supported. Multivariate y supported. predict() method for
out-of-bag prediction. S3: print, as.data.frame.fit_cme() and predict.cme_fit() are now exported (previously
@keywords internal); they remain the lower-level building block,
with kernel_downscale() as the user-facing wrapper.kernR-downscaling: covers both methods with
worked ag-systems examples (coarse climate → paddock yield;
bag-of-soil-cores → paddock yield).dr_date_scenario(baseline, intervention, ...) — DR-DATE distributional
treatment-effect test for the two-scenario APSIM use case, where
baseline and intervention are PESTO::pesto_ensemble_manifest
objects (the v0.3.0 cross-package S7 contract). Pools parameters as
covariates, outputs as the outcome, scenario label as binary
treatment; dispatches to the existing dr_date_test() machinery.
Returns a dr_date_scenario (subclass of kernel_test_result)
carrying both run-ids plus a directly actionable verdict line.print.dr_date_scenario() — verdict-focused printer.kernR-drdate-scenario — synthetic linear-Gaussian
scenario contrast end-to-end (PESTO IES → manifest → DR-DATE).PESTO (>= 0.3.0) becomes a hard Imports: so the S7 contract
resolves at install time.pesto_ensemble_manifest S7 class). The legacy lightweight
pesto_ensemble() S3 class for mmd_ppc() is unchanged; a future
release will add a mmd_ppc.pesto_ensemble_manifest() method for
consistency with the new contract.propensity_model option once landed; tracked as future work.hsic_sensitivity() gains total_order = FALSE argument
(default; backwards-compatible). When TRUE, computes total-order
indices via Da Veiga's complement formulation
T_j = 1 - HSIC(X_{~j}, Y) / sqrt(HSIC(X_{~j}, X_{~j}) HSIC(Y, Y)),
where X_{~j} is the design matrix with column j removed.
T_j - S_j (returned in the result and shown in print) quantifies
the contribution of X_j through interactions with other
parameters. Result gains index_total_order (p x q matrix),
statistic_total_order, and total_order (logical flag) fields.plot.hsic_sensitivity() gains which = c("first", "total", "both")
argument; "both" produces side-by-side first-vs-total bars.as.data.frame.hsic_sensitivity() includes total-order columns when
present.kernR-sensitivity extended with a pure-interaction
example (Y = X1 * X2) demonstrating S ~ 0 but T strong; and a
near-additive contrast where T ~ S.T_j = 0 is conditional independence of X_j
and Y given X_{~j} -- genuinely harder than the marginal-HSIC
permutation. Indices are interpreted directly; future work may add
Pick-Freeze-style p-values.F F^T is slower than exact computation at typical
kernR scales; the proper unblock is a factor-only HSIC primitive
(Nystrom-on-Nystrom), which is now the natural next acceleration
item.nystrom_factor(): Nystrom low-rank kernel factorisation
(Williams & Seeger, 2001). Returns an n x m factor F with
F %*% t(F) \approx K for any [kernel_spec()]. O(n m^2)
construction, O(n m) storage. Honours DESCRIPTION's Nystrom claim.rff_features(): Random Fourier Features (Rahimi & Recht, 2007) for
RBF kernels. Returns an n x D feature matrix with
Phi %*% t(Phi) \approx K. Data-independent random projection.
Honours DESCRIPTION's RFF claim.hsic_test_nystrom(): Drop-in accelerated HSIC independence test
via low-rank factorisation. method = "nystrom" (default) or
"rff". O(n m_x m_y) per permutation (vs O(n^2) for the exact
test); verdict-equivalent to hsic_test() at moderate m. Uses the
biased HSIC estimator (the form that factors cleanly through
low-rank approximations).kernR-nystrom: correctness check + scaling
benchmark + when-to-use guide.R CMD check --as-cran WARNINGs on the
development machine are local-environment artifacts:
-Wno-unused-command-line-argument and -mcpu=native come from
the user's global ~/.R/Makevars; bypassing it via
R_MAKEVARS_USER=/dev/null removes the "compilation flags"
WARNING.R_ext/Boolean.h:62 using a
#pragma clang diagnostic ignored "-Wfixed-enum-extension" that
bleeding-edge Apple clang 21.0.0 (MacOSX26.4.1.sdk) does not
recognise. Not a kernR issue; will not appear on CRAN's build
farm. Documented in PROJECT_LOG.bd_hsic_test() gains cluster_id = and permutation = arguments,
implementing roadmap item B4 (hierarchical bd-HSIC). When
cluster_id is supplied, the permutation null is built by
within-cluster reshuffling of y (the safer default for clustered ag
designs); the result carries permutation_scheme, cluster_id,
cluster_levels, and a per_cluster_statistic stratified breakdown.
Backwards-compatible: cluster_id = NULL preserves the original
Hu/Sejdinovic/Evans propensity-cluster behaviour.hsic_sensitivity(): First-order HSIC-Sensitivity Index per
Da Veiga 2015 -- normalised HSIC bounded in [0, 1], Sobol-comparable
in scale, captures distributional effects Sobol misses (variance,
skewness, tails). S3 methods: print, plot, as.data.frame.
Implements roadmap item B5 (first-order; total-order intentionally
deferred until Nystrom acceleration lands). Reuses the per-column
kernel-matrix cache pattern from hsic_identifiability().kernR-hierarchical-bdhsic: multi-site stub design comparing
naive vs within-cluster permutation; per-site stratified
contributions.kernR-sensitivity: HSIC-SI on a stub APSIM-like simulator with
mean / variance / tail / inert effects; demonstrates the
distributional-effect catch.@importFrom stats weighted.mean (clears NOTE on missing global
function definition).{ / } in math expressions in three Rcpp roxygen blocks
(mmd2_unbiased_cpp, rulsif_solve_cpp, weighted_hsic_stat_cpp)
using \deqn{...}{...} form (clears NOTE on Rd Lost braces).R CMD check --as-cran is now 0 errors / 2 WARNINGs / 0 NOTES;
the remaining WARNINGs are the toolchain-level non-portable Makevars
flags (-Wno-unused-command-line-argument, -mcpu=native), restored
at the FLIBS portability release-gate ritual per workspace
CLAUDE.md.mmd_ppc(): Posterior-predictive check via MMD two-sample test.
Returns the standard kernel_test_result plus a Shannon-information
surprise diagnostic (-log2(p_value)) and an explicit reject/accept
verdict at level alpha. Implements roadmap item B3.pesto_ensemble(): Lightweight constructor + S3 class
(pesto_ensemble) bundling a posterior-predictive sample matrix,
optional held-out observations, and free-form metadata. Defines the
kernR-side schema of the cross-package PESTO -> kernR contract until
PESTO's native emitter lands. mmd_ppc() dispatches on it.kernR-ppc: walkthrough on a stubbed ensemble across
calibrated / narrow-variance / mean-shifted scenarios.hsic_identifiability(): HSIC-based pre-IES screening that flags
unidentifiable APSIM (or any simulator) parameters before
ensemble-smoother calibration. Returns a p x q grid of HSIC
statistics + permutation p-values across parameters and outputs, with
Benjamini-Hochberg adjustment by default. S3 methods: print,
summary, plot, as.data.frame. Implements roadmap item B1.lhs_design(): Lightweight Latin-hypercube design helper over bounded
parameter ranges; base-R only.kernR-identifiability: walkthrough of the pre-IES
screening workflow on a stubbed APSIM archetype.aut, cre, cph). D. Sejdinovic
removed from Authors@R; paper citations to Hu/Sejdinovic/Evans (JMLR
2024) and Fawkes/Hu/Evans/Sejdinovic (TMLR 2024) retained throughout
vignettes, man pages, and source comments as scientific attribution.[email protected] (was
placeholder).author: YAML headers updated.hsic_test() (independence), mmd_test() (two-sample).bd_hsic_test(): Backdoor-adjusted HSIC for causal association testing.dr_date_test(): Doubly robust distributional average treatment effect.dr_dett_test(): Doubly robust distributional effect on the treated.hierarchical_test() for nested/clustered data with within/between decomposition.kernel_causal_test() with formula syntax y ~ treatment | confounders.glm/ranger/xgboost; RuLSIF (kernel-based).assess_overlap(), plot_weights(), effective_sample_size().