diff-diff 2.1.4__tar.gz → 2.1.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. {diff_diff-2.1.4 → diff_diff-2.1.6}/PKG-INFO +3 -3
  2. {diff_diff-2.1.4 → diff_diff-2.1.6}/README.md +2 -2
  3. {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/__init__.py +1 -1
  4. {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/honest_did.py +8 -1
  5. {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/prep.py +13 -765
  6. diff_diff-2.1.6/diff_diff/prep_dgp.py +777 -0
  7. {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/pretrends.py +6 -0
  8. {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/staggered.py +75 -24
  9. {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/staggered_aggregation.py +70 -13
  10. {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/staggered_bootstrap.py +139 -29
  11. {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/staggered_results.py +2 -0
  12. {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/utils.py +6 -3
  13. {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/visualization.py +32 -11
  14. {diff_diff-2.1.4 → diff_diff-2.1.6}/pyproject.toml +5 -1
  15. {diff_diff-2.1.4 → diff_diff-2.1.6}/rust/Cargo.lock +7 -7
  16. {diff_diff-2.1.4 → diff_diff-2.1.6}/rust/Cargo.toml +1 -1
  17. {diff_diff-2.1.4 → diff_diff-2.1.6}/rust/src/bootstrap.rs +66 -12
  18. {diff_diff-2.1.4 → diff_diff-2.1.6}/rust/src/linalg.rs +2 -1
  19. {diff_diff-2.1.4 → diff_diff-2.1.6}/rust/src/trop.rs +3 -0
  20. {diff_diff-2.1.4 → diff_diff-2.1.6}/rust/src/weights.rs +3 -3
  21. {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/_backend.py +0 -0
  22. {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/bacon.py +0 -0
  23. {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/datasets.py +0 -0
  24. {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/diagnostics.py +0 -0
  25. {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/estimators.py +0 -0
  26. {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/linalg.py +0 -0
  27. {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/power.py +0 -0
  28. {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/results.py +0 -0
  29. {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/sun_abraham.py +0 -0
  30. {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/synthetic_did.py +0 -0
  31. {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/triple_diff.py +0 -0
  32. {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/trop.py +0 -0
  33. {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/twfe.py +0 -0
  34. {diff_diff-2.1.4 → diff_diff-2.1.6}/rust/src/lib.rs +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: diff-diff
3
- Version: 2.1.4
3
+ Version: 2.1.6
4
4
  Classifier: Development Status :: 5 - Production/Stable
5
5
  Classifier: Intended Audience :: Science/Research
6
6
  Classifier: Operating System :: OS Independent
@@ -745,7 +745,7 @@ CallawaySantAnna(
745
745
  alpha=0.05, # Significance level
746
746
  cluster=None, # Column for cluster SEs
747
747
  n_bootstrap=0, # Bootstrap iterations (0 = analytical SEs)
748
- bootstrap_weight_type='rademacher', # 'rademacher', 'mammen', or 'webb'
748
+ bootstrap_weights='rademacher', # 'rademacher', 'mammen', or 'webb'
749
749
  seed=None # Random seed
750
750
  )
751
751
  ```
@@ -758,7 +758,7 @@ With few clusters or when analytical standard errors may be unreliable, use the
758
758
  # Bootstrap inference with 999 iterations
759
759
  cs = CallawaySantAnna(
760
760
  n_bootstrap=999,
761
- bootstrap_weight_type='rademacher', # or 'mammen', 'webb'
761
+ bootstrap_weights='rademacher', # or 'mammen', 'webb'
762
762
  seed=42
763
763
  )
764
764
  results = cs.fit(
@@ -710,7 +710,7 @@ CallawaySantAnna(
710
710
  alpha=0.05, # Significance level
711
711
  cluster=None, # Column for cluster SEs
712
712
  n_bootstrap=0, # Bootstrap iterations (0 = analytical SEs)
713
- bootstrap_weight_type='rademacher', # 'rademacher', 'mammen', or 'webb'
713
+ bootstrap_weights='rademacher', # 'rademacher', 'mammen', or 'webb'
714
714
  seed=None # Random seed
715
715
  )
716
716
  ```
@@ -723,7 +723,7 @@ With few clusters or when analytical standard errors may be unreliable, use the
723
723
  # Bootstrap inference with 999 iterations
724
724
  cs = CallawaySantAnna(
725
725
  n_bootstrap=999,
726
- bootstrap_weight_type='rademacher', # or 'mammen', 'webb'
726
+ bootstrap_weights='rademacher', # or 'mammen', 'webb'
727
727
  seed=42
728
728
  )
729
729
  results = cs.fit(
@@ -136,7 +136,7 @@ from diff_diff.datasets import (
136
136
  load_mpdta,
137
137
  )
138
138
 
139
- __version__ = "2.1.4"
139
+ __version__ = "2.1.6"
140
140
  __all__ = [
141
141
  # Estimators
142
142
  "DifferenceInDifferences",
@@ -584,7 +584,12 @@ def _extract_event_study_params(
584
584
  )
585
585
 
586
586
  # Extract event study effects by relative time
587
- event_effects = results.event_study_effects
587
+ # Filter out normalization constraints (n_groups=0) and non-finite SEs
588
+ event_effects = {
589
+ t: data for t, data in results.event_study_effects.items()
590
+ if data.get('n_groups', 1) > 0
591
+ and np.isfinite(data.get('se', np.nan))
592
+ }
588
593
  rel_times = sorted(event_effects.keys())
589
594
 
590
595
  # Split into pre and post
@@ -1261,10 +1266,12 @@ class HonestDiD:
1261
1266
  from diff_diff.staggered import CallawaySantAnnaResults
1262
1267
  if isinstance(results, CallawaySantAnnaResults):
1263
1268
  if results.event_study_effects:
1269
+ # Filter out normalization constraints (n_groups=0, e.g. reference period)
1264
1270
  pre_effects = [
1265
1271
  abs(results.event_study_effects[t]['effect'])
1266
1272
  for t in results.event_study_effects
1267
1273
  if t < 0
1274
+ and results.event_study_effects[t].get('n_groups', 1) > 0
1268
1275
  ]
1269
1276
  if pre_effects:
1270
1277
  return max(pre_effects)