feat(psychometric): recover 2017-era active asymptotes=TRUE TIPREDEFFECT rewrite on main - #352
Conversation
…ECT rewrite on main cran/ctsem 2.5.0 summary.ctsemFit.R forms if(asymptotes==TRUE) TIPREDEFFECT <- -DRIFT %*% mxobj$TIPREDEFFECT$values when n.TIpred > 0. Scalar -a · B. Form a first, then negate, then multiply by B. The rewrite is the coefficient B, not Bz. Zero coefficient is exactly zero even if a >= 0. a >= 0 with a nonzero coefficient fails closed. Numeric a=-0.5, B=0.4 recovers 0.2. Distinct from unstandardised B, unit asymTIPREDEFFECT -B/a, discreteTIPREDEFFECT, and Table 2 CINT. JSS PDF re-opened 2026-08-31T05:20Z. Independent on current main. Do not import unpublished #318-#349 APIs.
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: trueThanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Queue-consolidation classification for the current recovery cycle: This PR overlaps #355 in the Driver/ctsem A separate crate or ADR number is not, by itself, a bounded-context boundary. The product boundary is the coherent Longitudinal Psychometrics model/recovery contract. |
Summary
psychometric_corerecovers the 2017-era activeasymptotes=TRUETIPREDEFFECTrewrite as the scalar−a · Bon current main.This is an independent successor of on-main
asymTIPREDEFFECT-B z / aand on-maindiscreteTIPREDEFFECT. It does not depend on unpublished crates and is not stacked on queued#318–#349. cran/ctsem 2.5.0summary.ctsemFit.Rformsif(asymptotes==TRUE) TIPREDEFFECT <- -DRIFT %*% mxobj$TIPREDEFFECT$valueswhenn.TIpred > 0. That rewrite is active and is in theoutlist. Driver, Oud, and Voelkle (2017, Table 2, p. 12; Eq. 1, p. 4; Eq. 3, p. 5; §7.2, pp. 20–21; p. 16; JSS PDF re-opened 2026-08-31T05:20Z from https://www.jstatsoft.org/index.php/jss/article/download/v077i05/1104) nameBTIPREDEFFECT. Formafirst, then negate, then multiply byB. The rewrite is the coefficientB, notB z. Whenasymptotes=TRUEthe storedTIPREDEFFECTis the asymptotic parameterization §7.2 namesasymTIPREDEFFECT-B / a; multiplying by-DRIFTconverts that stored value back to originalB. The companion active rewriteCINT <- -DRIFT %*% CINTuses the same operator on a different matrix and is not this coefficient map.A zero coefficient is exactly zero even if
a ≥ 0.a ≥ 0with a nonzero coefficient fails closed. Numeric:a = −0.5,B = 0.4recovers 0.2, distinct from unstandardisedTIPREDEFFECT(0.4), from unitasymTIPREDEFFECT-B / a(0.8), fromdiscreteTIPREDEFFECTatΔt = 1(≈ 0.3148), and from Table 2CINTwhenκ = B. Stored-B / a = 0.8recovers originalTIPREDEFFECT0.4. UnstandardisedTIPREDEFFECTis not this rewrite. A non-event clock fails closed.Meredith (1993) remains unread (Unpaywall 2026-08-31T05:10Z:
is_oa: false; Springercontent/pdfis an HTML stub; escholarship hits are citations). Mislevy (1991, Psychometrika, 56, 177–196, DOI 10.1007/bf02294457) remains unread on the same terms. Still not a Kalman filter, not a matrixexpm, not ESEM estimation, not DSEM, and not ctsem estimation.Verification
cargo fmt --allcargo clippy -p psychometric_core --all-targets -- -D warningscargo test -p psychometric_core --lib(189)cargo test -p psychometric_core --test multilevel_event_time_recovery_contract(108)cargo test -p psychometric_core --test scientific_claim_boundary_contract(53)RUSTDOCFLAGS='-D warnings' cargo doc -p psychometric_core --no-depsDo not merge without independent non-author APPROVE + exact-head required-check success. Do not convert from draft. Do not self-approve.