Skip to content

feat(fitting): support continuous [0,1] responses in IRT fitting methods (fixes #7)#30

Open
sparkyluvscode wants to merge 1 commit into
aims-foundations:mainfrom
sparkyluvscode:fix/continuous-response-support-issue-7
Open

feat(fitting): support continuous [0,1] responses in IRT fitting methods (fixes #7)#30
sparkyluvscode wants to merge 1 commit into
aims-foundations:mainfrom
sparkyluvscode:fix/continuous-response-support-issue-7

Conversation

@sparkyluvscode
Copy link
Copy Markdown
Contributor

Summary

IRT fitting methods (MLE, EM, JML) crashed on continuous [0, 1] response data because the default bernoulli_nll loss routes through torch.distributions.Bernoulli, whose domain validation rejects non-{0, 1} values. Users with partial-credit or soft-label scoring data had no option besides BetaRasch, which assumes a specific distributional shape that rarely fits uniform-ish [0, 1] data.

Adds cross_entropy_nll to _losses.py, which computes the same formula as bernoulli_nll via F.binary_cross_entropy without domain validation. All three fitting methods now auto-detect continuous responses and select the appropriate loss when loss_fn is not explicitly provided. Binary {0, 1} data continues to use bernoulli_nll with no behavior change.

Fixes #7

Tests

  • TestCrossEntropyNLL: accepts continuous targets, matches bernoulli_nll on binary, confirms bernoulli_nll rejects continuous, gradient flows.
  • TestMLEFitContinuous: Rasch fits continuous data via MLE (Adam + LBFGS).
  • TestEMFitContinuous: Rasch fits continuous data via EM.
  • TestJMLFitContinuous: Rasch fits continuous data via JML with loss decrease.

All 56 existing fitting tests unaffected; 294 total tests pass.

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.

IRT models assume a strict {0,1} response matrix rather than continuous [0,1]?

1 participant