Skip to content

feat(psychometric): recover Driver p.16 TIPREDMEANSstd on main - #339

Draft
seonghobae wants to merge 1 commit into
mainfrom
agent/psychometric-tipred-means-std-on-main
Draft

feat(psychometric): recover Driver p.16 TIPREDMEANSstd on main#339
seonghobae wants to merge 1 commit into
mainfrom
agent/psychometric-tipred-means-std-on-main

Conversation

@seonghobae

Copy link
Copy Markdown
Contributor

Summary

psychometric_core recovers the Driver, Oud, and Voelkle (2017, p. 16) scalar TIPREDMEANSstd as μ_z / √v after strictly positive TIPREDVAR v.

This is an independent successor of the already-named TIPREDVARstd correlation and of queued TDPREDMEANSstd (#338). It does not depend on unpublished crates. Table 3 names TIPREDMEANS the free n.TIpred × 1 matrix of time-independent predictor means and names TIPREDVAR the Cholesky of time-independent predictor variance. Page 16 prints standardised matrices with the suffix std when appropriate. The printed example on p. 16 is discreteDRIFTstd, not TIPREDMEANSstd. Footnote 4 standardises using only the relevant variance, not the total. The relevant variance for that named predictor mean is TIPREDVAR v, not process-dynamics asymDIFFUSION -q / (2 a).

CRAN-era ctsem summary.ctsemFit.R forms unstandardised TIPREDVAR and forms TIPREDVARstd whenever verbose = TRUE and n.TIpred > 0 as solve(sqrt(diag(TIPREDVAR) + ridging)) %&% TIPREDVAR. That source does not form TIPREDMEANS or a TIPREDMEANSstd matrix. This crate therefore owns the footnote-4 standardisation of that named mean after a modeled v.

JSS PDF re-opened 2026-08-31T03:30Z from https://www.jstatsoft.org/index.php/jss/article/download/v077i05/1104.

Map

Form strictly positive v first, then divide μ_z by √v:

TIPREDMEANSstd = μ_z / √v

A zero mean is exactly zero. Overflow of the ratio fails closed.

Claim boundary

  • Unstandardised TIPREDMEANS μ_z is defined for a zero predictor variance and is not TIPREDMEANSstd.
  • TIPREDVARstd v / v = 1 recovers the same number when μ_z = √v and remains a distinct named quantity. This crate does not currently export a TIPREDVARstd recover function; the refuse still names that quantity.
  • μ_z / √asymDIFFUSION uses process-dynamics variance and is not this predictor map.

Event time only. Zero v has no positive SD and fails closed. TIPREDMEANS does not require stable a < 0. Negative means remain valid signed locations.

Still not a Kalman filter, not a matrix expm, not ESEM estimation, not DSEM, and not ctsem estimation.

Meredith (1993) remains unread (Unpaywall historically is_oa: false; Springer content/pdf is an HTML stub). Mislevy (1991, Psychometrika, 56, 177–196) remains unread on the same terms (DOI 10.1007/bf02294457).

Verification

  • cargo test -p psychometric_core (full crate, including the new unit, recovery, and claim-boundary tests)
  • cargo clippy -p psychometric_core --all-targets -- -D warnings
  • cargo fmt -p psychometric_core -- --check
  • RUSTDOCFLAGS='-D warnings' cargo doc -p psychometric_core --no-deps

Do not convert #310. Do not merge without independent non-author APPROVE and exact-head required-check success.

Table 3 names TIPREDMEANS the free n.TIpred×1 time-independent
predictor means. Footnote 4 standardises that named mean with only
the relevant TIPREDVAR, so the scalar map is μ_z/√v after strictly
positive v. The 2017-era summary forms TIPREDVARstd and does not
form TIPREDMEANSstd. Zero mean is +0 bits. Zero v, a non-event
clock, and overflow fail closed. Unstandardised TIPREDMEANS,
TIPREDVARstd v/v=1, and μ_z/√asymDIFFUSION remain distinct named
quantities.
@coderabbitai

coderabbitai Bot commented Aug 31, 2026

Copy link
Copy Markdown

Warning

Review limit reached

Next included review available in 25 minutes.

View limit details

Limit details: You’ve used the included review currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: dc1f2b74-4d24-4e61-8465-484b73b575da

📥 Commits

Reviewing files that changed from the base of the PR and between 1bc02f5 and 8024a00.

📒 Files selected for processing (11)
  • ARCHITECTURE.md
  • CHANGELOG.md
  • CLAUDE.md
  • crates/psychometric_core/src/error.rs
  • crates/psychometric_core/src/event_time.rs
  • crates/psychometric_core/src/lib.rs
  • crates/psychometric_core/tests/multilevel_event_time_recovery_contract.rs
  • crates/psychometric_core/tests/scientific_claim_boundary_contract.rs
  • docs/TRACEABILITY.md
  • docs/adr/0005-posterior-esem-dsem.md
  • docs/research/multilevel-event-time-recovery.md

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.

Copy link
Copy Markdown
Contributor Author

Independent review requested on exact head 8024a004da148d6662655307709ceea84f70f766. Do not self-approve. Do not merge without independent non-author APPROVE and exact-head required-check success.

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 31, 2026

Copy link
Copy Markdown

@seonghobae I will review pull request #339 at exact head 8024a004da148d6662655307709ceea84f70f766. I will not self-approve or merge it.

⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

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

Labels

enhancement New feature or request priority: medium

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant