pub struct OrthogonalReparam { /* private fields */ }Expand description
An exact orthogonal reparameterization of one confound block against one
primary block’s column span in a fixed row metric W.
Holds the shear matrix B (p_m × p_c) and the reparameterized confound
design C̃ = C − M·B (n × p_c). The transform is a pure change of basis, so
it is fully described by B; C̃ is cached because the solver needs the new
design and recomputing it is wasteful.
Build with OrthogonalReparam::build_unconditional. The round-trip
recover_original maps fitted reparameterized
coefficients back to the original basis exactly.
Implementations§
Source§impl OrthogonalReparam
impl OrthogonalReparam
Sourcepub fn build_unconditional(
primary: ArrayView2<'_, f64>,
confound: ArrayView2<'_, f64>,
w_metric: &Array1<f64>,
) -> Result<Self, String>
pub fn build_unconditional( primary: ArrayView2<'_, f64>, confound: ArrayView2<'_, f64>, w_metric: &Array1<f64>, ) -> Result<Self, String>
Build the exact orthogonal reparameterization of the confound block
against the primary block’s column span in the w_metric row metric.
Robustness is unconditional, so this always constructs the reparam (the
caller decides whether there is anything to orthogonalize; an empty span
p_m == 0 or p_c == 0 yields an identity-on-confound transform).
Returns:
Ok(reparam)withC̃exactly W-orthogonal tospan(primary).Erron a dimension mismatch, a non-finite/negative metric, or a non-finite result.
primary is n × p_m, confound is n × p_c, w_metric is length n
with w_i ≥ 0 (the PIRLS row inner product at the pilot, so the resulting
orthogonality holds in the metric the penalized joint solve actually sees;
pass all-ones for the plain Euclidean metric).
Sourcepub fn shear(&self) -> ArrayView2<'_, f64>
pub fn shear(&self) -> ArrayView2<'_, f64>
The shear matrix B (p_m × p_c). Original primary coefficients are
β_m = β̃_m − B·β_c.
Sourcepub fn reparameterized_confound(&self) -> ArrayView2<'_, f64>
pub fn reparameterized_confound(&self) -> ArrayView2<'_, f64>
The reparameterized confound design C̃ = C − M·B (n × p_c), exactly
W-orthogonal to span(primary). This is the design the solver fits the
confound coefficients against.
Sourcepub fn primary_cols(&self) -> usize
pub fn primary_cols(&self) -> usize
Number of primary columns p_m.
Sourcepub fn confound_cols(&self) -> usize
pub fn confound_cols(&self) -> usize
Number of confound columns p_c.
Sourcepub fn recover_original(
&self,
beta_m_reparam: &Array1<f64>,
beta_c: &Array1<f64>,
) -> Result<(Array1<f64>, Array1<f64>), String>
pub fn recover_original( &self, beta_m_reparam: &Array1<f64>, beta_c: &Array1<f64>, ) -> Result<(Array1<f64>, Array1<f64>), String>
Map the fitted reparameterized coefficients (β̃_m, β_c) back to the
original basis (β_m, β_c) exactly:
β_m = β̃_m − B·β_c, β_c unchanged.beta_m_reparam has length p_m, beta_c has length p_c. Returns the
original-basis (β_m, β_c). Because the predictor M·β̃_m + C̃·β_c equals
M·β_m + C·β_c for these recovered coefficients, predictions in the
original basis are unchanged.
Sourcepub fn to_reparameterized(
&self,
beta_m: &Array1<f64>,
beta_c: &Array1<f64>,
) -> Result<Array1<f64>, String>
pub fn to_reparameterized( &self, beta_m: &Array1<f64>, beta_c: &Array1<f64>, ) -> Result<Array1<f64>, String>
Forward shear: map original-basis primary coefficients β_m to the
reparameterized basis β̃_m = β_m + B·β_c (the inverse of
recover_original). Useful for warm-starting the
reparameterized solve from an original-basis initial guess.
Trait Implementations§
Source§impl Clone for OrthogonalReparam
impl Clone for OrthogonalReparam
Source§fn clone(&self) -> OrthogonalReparam
fn clone(&self) -> OrthogonalReparam
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl Freeze for OrthogonalReparam
impl RefUnwindSafe for OrthogonalReparam
impl Send for OrthogonalReparam
impl Sync for OrthogonalReparam
impl Unpin for OrthogonalReparam
impl UnsafeUnpin for OrthogonalReparam
impl UnwindSafe for OrthogonalReparam
Blanket Implementations§
impl<T> Allocation for T
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> DistributionExt for Twhere
T: ?Sized,
impl<T> DistributionExt for Twhere
T: ?Sized,
impl<T, U> Imply<T> for U
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.