Commit b5e1847
Round 13: honor rank_deficient_action='error' on fitted TWFE path
P1: the blanket except Exception around the TWFE diagnostic call in
fit() Step 5a swallowed ALL exceptions, including the ValueError that
solve_ols raises when rank_deficient_action="error". This broke the
public-parameter contract: a user requesting strict failure on a
rank-deficient TWFE design would get a successful fit with the
diagnostic silently omitted instead. The standalone twowayfeweights()
already honored the parameter correctly; only the fitted path was
broken.
Fix: in the except block, re-raise ValueError when
rank_deficient_action=="error" so the user's strict-failure request
is honored. Other exceptions (genuinely non-fatal diagnostic failures)
are still downgraded to a warning + skipped diagnostic.
P3: fixed two stale docstrings that still described the old "warning
+ majority rounding" behavior for fractional within-cell treatment
(the _validate_and_aggregate_to_cells step 5 docstring and the
fit() group parameter docstring). Both now correctly describe the
Phase 1 ValueError rejection.
Regression test: test_rank_deficient_action_error_raises_on_fitted_twfe
in TestForwardCompatGates. Uses a minimal 1-group 2-period panel
(2 cells < 3 FE columns) to trigger the underdetermined-system
ValueError. Asserts rank_deficient_action="error" raises, and
rank_deficient_action="warn" does NOT raise the TWFE-specific error.
Test counts: 112 -> 113. Black, ruff clean.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>1 parent a8b161c commit b5e1847
2 files changed
Lines changed: 95 additions & 6 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
120 | 120 | | |
121 | 121 | | |
122 | 122 | | |
123 | | - | |
124 | | - | |
| 123 | + | |
| 124 | + | |
125 | 125 | | |
126 | 126 | | |
127 | 127 | | |
| |||
477 | 477 | | |
478 | 478 | | |
479 | 479 | | |
480 | | - | |
481 | | - | |
482 | | - | |
483 | | - | |
| 480 | + | |
| 481 | + | |
| 482 | + | |
| 483 | + | |
| 484 | + | |
484 | 485 | | |
485 | 486 | | |
486 | 487 | | |
| |||
588 | 589 | | |
589 | 590 | | |
590 | 591 | | |
| 592 | + | |
| 593 | + | |
| 594 | + | |
| 595 | + | |
| 596 | + | |
| 597 | + | |
| 598 | + | |
| 599 | + | |
591 | 600 | | |
592 | 601 | | |
593 | 602 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
370 | 370 | | |
371 | 371 | | |
372 | 372 | | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + | |
| 396 | + | |
| 397 | + | |
| 398 | + | |
| 399 | + | |
| 400 | + | |
| 401 | + | |
| 402 | + | |
| 403 | + | |
| 404 | + | |
| 405 | + | |
| 406 | + | |
| 407 | + | |
| 408 | + | |
| 409 | + | |
| 410 | + | |
| 411 | + | |
| 412 | + | |
| 413 | + | |
| 414 | + | |
| 415 | + | |
| 416 | + | |
| 417 | + | |
| 418 | + | |
| 419 | + | |
| 420 | + | |
| 421 | + | |
| 422 | + | |
| 423 | + | |
| 424 | + | |
| 425 | + | |
| 426 | + | |
| 427 | + | |
| 428 | + | |
| 429 | + | |
| 430 | + | |
| 431 | + | |
| 432 | + | |
| 433 | + | |
| 434 | + | |
| 435 | + | |
| 436 | + | |
| 437 | + | |
| 438 | + | |
| 439 | + | |
| 440 | + | |
| 441 | + | |
| 442 | + | |
| 443 | + | |
| 444 | + | |
| 445 | + | |
| 446 | + | |
| 447 | + | |
| 448 | + | |
| 449 | + | |
| 450 | + | |
| 451 | + | |
| 452 | + | |
373 | 453 | | |
374 | 454 | | |
375 | 455 | | |
| |||
0 commit comments