Convenience wrapper that converts subject visit indices into a density
input. Density-native methods dispatch to fit.density.
LPS/PS-LPS methods fit ordinary smoother objects first and then call
normalize.density; they are subject-occupation workflows, not
standalone density-native methods.
Usage
fit.subject.od(
X,
subject.index,
method = c("empirical", "graph_random_walk", "lps_count", "ps_lps_count",
"lps_logistic_binary", "chart_kernel", "local_likelihood_density",
"local_likelihood_bernoulli"),
graph = NULL,
graph.control = list(),
od.control = list(),
return.details = TRUE,
od.cv = c("none", "visit"),
visit.foldid = NULL,
visit.cv.folds = 5L,
visit.cv.seed = 1L,
visit.cv.epsilon = 1e-15,
...
)Arguments
- X
Numeric matrix with one row per support point.
- subject.index
Integer row indices of subject visits in
X. Repeated indices are allowed.- method
Density method identifier.
- graph
Optional precomputed graph object.
- graph.control
Named list for random walks:
walk.steps(orwalk.step),affinity.method,affinity.scale,affinity.epsilon, and logicalnormalize. Underscore aliases are accepted, but conflicting aliases and unknown names are rejected. Must be empty for the empirical estimator.- od.control
OD-facing alias for
density.control.- return.details
Logical; if
TRUE, keep diagnostic details in the result.- od.cv
OD-level selection mode.
"none"preserves the direct fit."visit"holds out subject visits, fits candidates on the remaining visits, and selects the candidate minimizing held-out negative log occupation mass.- visit.foldid
Optional positive integer vector assigning subject visits to OD-level cross-validation folds. Its length must equal
length(subject.index).- visit.cv.folds
Number of visit folds when
visit.foldidis not supplied.- visit.cv.seed
Random seed for generated visit folds.
- visit.cv.epsilon
Positive floor used in held-out
-log(rho[visit])scoring.- ...
Reserved for future methods; unused arguments are errors.
Value
A list of class "density_fit". Its rho component is
the estimated probability mass over the rows of X, and
empirical.rho is the normalized visit-count mass. The
subject component summarizes the number of visits, the number of
distinct visited support points, the largest visit multiplicity, and the
fraction of repeatedly visited support points. Other components describe
the fitted method, normalization accounting, smoothing diagnostics, and
warnings as documented in fit.density. With
od.cv = "visit" and return.details = TRUE, the result also
contains the visit-level cross-validation table, fold assignments, and
held-out predicted masses.
Details
The "lps_logistic_binary" method name is historical. In the current
OD workflow it calls fit.lps(..., outcome.family = "bernoulli"), which
fits a clipped probability field with the LPS least-squares core and then
converts that field to a density with normalize.density. It is
not the outcome.family = "binomial" local-logistic IRLS path.
When od.cv = "visit", graph random-walk candidates may pass
OD-level grids inside graph.control: walk.step.grid,
affinity.method.grid, affinity.scale.grid,
affinity.epsilon.grid, and normalize.grid. Missing
affinity.scale values mean the usual data-derived affinity scale.
When od.cv = "visit", chart-based and LPS-family methods may pass
chart.dim.grid through .... For "chart_kernel",
"local_likelihood_density", "local_likelihood_bernoulli",
"lps_count", "lps_logistic_binary", and
"ps_lps_count", this grid compares fixed integer chart dimensions
with optional "auto" and "local.auto" chart-dimension policies
under the same held-out-visit negative-log-occupation score. For LPS-family
OD visit CV, each outer candidate is passed to the source smoother as a
scalar local model configuration; this avoids nested row-level
multi-candidate selection inside each held-out-visit fold.
Examples
X <- matrix(seq(0, 1, length.out = 6), ncol = 1)
fit.subject.od(X, subject.index = c(1L, 3L, 3L, 6L),
method = "empirical")
#> Probability mass
#> Training rows: NA ; evaluation rows: 6 ; responses: 1
#> Observed responses: NA ; nonfinite fitted entries: 0
#> Output: ok
#> Convergence: unavailable (no stored stopping certificate)
#> Total mass: 1 ; positive support: 3
#> Accounting: mass=1e+00, min.rho=0e+00, max.rho=5e-01, raw.mass=1e+00,
#> neg.mass=0e+00, clip.mass=0e+00, normalization.constant=1e+00,
#> mass.tol=1e-08, neg.tol=1e-12
#> Prediction scope: mass on the stored support