Skip to content

feat(psychometric): recover Driver p.16 MANIFESTVARstd after positive Θ - #210

Draft
seonghobae wants to merge 2 commits into
agent/psychometric-standardised-manifest-trait-variancefrom
agent/psychometric-standardised-manifest-variance
Draft

feat(psychometric): recover Driver p.16 MANIFESTVARstd after positive Θ#210
seonghobae wants to merge 2 commits into
agent/psychometric-standardised-manifest-trait-variancefrom
agent/psychometric-standardised-manifest-variance

Conversation

@seonghobae

Copy link
Copy Markdown
Contributor

Stacked on #208 (MANIFESTTRAITVARstd). Next licensed 2017-era summary.ctsemFit.R std after the measurement-side trait matrix is MANIFESTVARstd (Θ correlation; counterpart to Ψ_τ).

Driver, Oud, and Voelkle (2017, Table 2, p. 12 MANIFESTVAR Θ; Eq. 5, p. 5; p. 16 suffix std; footnote 4; JSS PDF re-opened 2026-08-23T22:40Z) name MANIFESTVAR the residual covariance of the indicators. The 2017-era source forms MANIFESTVARstd whenever verbose = TRUE:

MANIFESTVARdiag <- diag(diag(MANIFESTVAR), n.manifest) + diag(c(ridging), n.manifest)
MANIFESTVARstd <- solve(sqrt(MANIFESTVARdiag)) %&% MANIFESTVAR

OpenMx %&% is t(A) %*% B %*% A. Unlike TRAITVARstd, the 2017-era source does add diag(c(ridging), n.manifest). The default ridging = FALSE adds 0, not 0.0001; that ridge is a numerical hack and is not this exact map. The 2017-era source assigns dimnames(MANIFESTVARstd) to latentNames; the matrix is n.manifest × n.manifest. That assignment is a source bug and is not this exact map. Scalar map after strictly positive MANIFESTVAR is θ / θ = 1.

Recovery

  • recover_standardised_manifest_variance(θ, clock) forms strictly positive θ, then 1/√θ, then the quadratic.
  • Distinct positive θ recover the same 1 (to_bits equal).
  • Zero MANIFESTVAR fails closed. Unlike TRAITVAR / MANIFESTTRAITVAR, the 2017-era source does not skip forming MANIFESTVARstd when θ = 0; solve(sqrt(0)) fails.
  • Non-event clock fails closed.
  • MANIFESTVAR does not require a < 0.

Claim boundary

  • Unstandardised MANIFESTVAR is not MANIFESTVARstd.
  • MANIFESTTRAITVARstd is not MANIFESTVARstd even when both equal 1 (indicator-level trait vs contemporaneous measurement error).
  • Equation 5 Var(y) = λ² Var(η) + θ is not MANIFESTVARstd.

Meredith (1993) and Mislevy (1991) remain closed (Unpaywall re-checked this cycle: is_oa: false, 0 locations).

Do not merge without an independent APPROVE plus exact-head required-check success. Do not self-approve. Do not request Copilot.

Map measurement-error MANIFESTVAR through 2017-era
summary.ctsemFit.R as solve(sqrt(diag(MANIFESTVAR))) %&%
MANIFESTVAR after strictly positive θ. OpenMx %&% is
t(A)%*%B%*%A; unlike TRAITVARstd the 2017-era source adds ridging
and the default ridge is 0. The 2017-era dimnames assignment to
latentNames is a source bug and is not this map. The scalar
correlation is θ/θ = 1. Zero θ makes solve(sqrt(0)) fail and
fails closed. Refuse unstandardised MANIFESTVAR, MANIFESTTRAITVARstd
even when both equal 1, and Eq. 5 Var(y). MANIFESTVAR does not
require a<0.
@coderabbitai

coderabbitai Bot commented Aug 23, 2026

Copy link
Copy Markdown

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@seonghobae

Copy link
Copy Markdown
Contributor Author

Current-head verification\n\n- Exact head: 22202c57c0818d3efb28438e95bdde5d0e7143b0\n- Exact base: a65d13db4c21337fe991d9e2dfe09f71ce11aa96\n- Classification: WAIT_AND_REMEDIATE (draft PR; protected merge path is unavailable).\n- Root cause fixed: rustfmt drift in the stacked psychometric tests and the final production branch uncovered edge.\n- Local evidence: workspace tests, clippy -D warnings, rustfmt, rustdoc -D warnings, Python quality coverage 100%, documentation/workspace contracts, line coverage LCOV gate, branch coverage 1834/1834 (100%), and git diff --check passed.\n- Hosted evidence: all six required checks are newly queued for this exact head; no result is reused from the predecessor head.\n- Review state: no qualifying independent approval yet; no force-merge candidate.\n\nNext action: re-fetch exact-head checks and review state, then process the next stack item while this head runs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant