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.
- {diff_diff-2.1.4 → diff_diff-2.1.6}/PKG-INFO +3 -3
- {diff_diff-2.1.4 → diff_diff-2.1.6}/README.md +2 -2
- {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/__init__.py +1 -1
- {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/honest_did.py +8 -1
- {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/prep.py +13 -765
- diff_diff-2.1.6/diff_diff/prep_dgp.py +777 -0
- {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/pretrends.py +6 -0
- {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/staggered.py +75 -24
- {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/staggered_aggregation.py +70 -13
- {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/staggered_bootstrap.py +139 -29
- {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/staggered_results.py +2 -0
- {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/utils.py +6 -3
- {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/visualization.py +32 -11
- {diff_diff-2.1.4 → diff_diff-2.1.6}/pyproject.toml +5 -1
- {diff_diff-2.1.4 → diff_diff-2.1.6}/rust/Cargo.lock +7 -7
- {diff_diff-2.1.4 → diff_diff-2.1.6}/rust/Cargo.toml +1 -1
- {diff_diff-2.1.4 → diff_diff-2.1.6}/rust/src/bootstrap.rs +66 -12
- {diff_diff-2.1.4 → diff_diff-2.1.6}/rust/src/linalg.rs +2 -1
- {diff_diff-2.1.4 → diff_diff-2.1.6}/rust/src/trop.rs +3 -0
- {diff_diff-2.1.4 → diff_diff-2.1.6}/rust/src/weights.rs +3 -3
- {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/_backend.py +0 -0
- {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/bacon.py +0 -0
- {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/datasets.py +0 -0
- {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/diagnostics.py +0 -0
- {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/estimators.py +0 -0
- {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/linalg.py +0 -0
- {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/power.py +0 -0
- {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/results.py +0 -0
- {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/sun_abraham.py +0 -0
- {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/synthetic_did.py +0 -0
- {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/triple_diff.py +0 -0
- {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/trop.py +0 -0
- {diff_diff-2.1.4 → diff_diff-2.1.6}/diff_diff/twfe.py +0 -0
- {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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
726
|
+
bootstrap_weights='rademacher', # or 'mammen', 'webb'
|
|
727
727
|
seed=42
|
|
728
728
|
)
|
|
729
729
|
results = cs.fit(
|
|
@@ -584,7 +584,12 @@ def _extract_event_study_params(
|
|
|
584
584
|
)
|
|
585
585
|
|
|
586
586
|
# Extract event study effects by relative time
|
|
587
|
-
|
|
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)
|