Skip to content

Commit 1c734f3

Browse files
committed
add did pa multi tune
1 parent c31b082 commit 1c734f3

File tree

9 files changed

+223
-38
lines changed

9 files changed

+223
-38
lines changed

doc/did/did_pa_multi.qmd

Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,3 +320,192 @@ generate_and_show_styled_table(
320320
coverage_highlight_cols=["Coverage", "Uniform Coverage"]
321321
)
322322
```
323+
324+
325+
## Tuning
326+
327+
The simulations are based on the the [make_did_CS2021](https://docs.doubleml.org/stable/api/generated/doubleml.did.datasets.make_did_CS2021.html)-DGP with $2000$ observations. Due to time constraints we only consider one learner, use in-sample normalization and the following DGPs:
328+
329+
- Type 4: Nonlinear outcome model and treatment assignment
330+
331+
The non-uniform results (coverage, ci length and bias) refer to averaged values over all $ATTs$ (point-wise confidende intervals). This is only an example as the untuned version just relies on the default configuration.
332+
333+
::: {.callout-note title="Metadata" collapse="true"}
334+
335+
```{python}
336+
#| echo: false
337+
metadata_file = '../../results/did/did_pa_multi_tune_metadata.csv'
338+
metadata_df = pd.read_csv(metadata_file)
339+
print(metadata_df.T.to_string(header=False))
340+
```
341+
342+
:::
343+
344+
```{python}
345+
#| echo: false
346+
347+
# set up data
348+
df = pd.read_csv("../../results/did/did_pa_multi_tune_detailed.csv", index_col=None)
349+
350+
assert df["repetition"].nunique() == 1
351+
n_rep = df["repetition"].unique()[0]
352+
353+
display_columns = ["Learner g", "Learner m", "Tuned", "Bias", "CI Length", "Coverage", "Uniform CI Length", "Uniform Coverage"]
354+
```
355+
356+
### Observational Score
357+
358+
```{python}
359+
#| echo: false
360+
generate_and_show_styled_table(
361+
main_df=df,
362+
filters={"level": 0.95, "Score": "observational"},
363+
display_cols=display_columns,
364+
n_rep=n_rep,
365+
level_col="level",
366+
coverage_highlight_cols=["Coverage", "Uniform Coverage"]
367+
)
368+
```
369+
370+
```{python}
371+
#| echo: false
372+
generate_and_show_styled_table(
373+
main_df=df,
374+
filters={"level": 0.9, "Score": "observational"},
375+
display_cols=display_columns,
376+
n_rep=n_rep,
377+
level_col="level",
378+
coverage_highlight_cols=["Coverage", "Uniform Coverage"]
379+
)
380+
```
381+
382+
## Tuning Aggregated Effects
383+
384+
These simulations test different types of aggregation, as described in [DiD User Guide](https://docs.doubleml.org/stable/guide/models.html#difference-in-differences-models-did).
385+
386+
As before, we only consider one learner, use in-sample normalization and the following DGPs:
387+
388+
- Type 4: Nonlinear outcome model and treatment assignment
389+
390+
The non-uniform results (coverage, ci length and bias) refer to averaged values over all $ATTs$ (point-wise confidende intervals). This is only an example as the untuned version just relies on the default configuration.
391+
392+
### Group Effects
393+
394+
```{python}
395+
#| echo: false
396+
397+
# set up data
398+
df_group = pd.read_csv("../../results/did/did_pa_multi_tune_group.csv", index_col=None)
399+
400+
assert df_group["repetition"].nunique() == 1
401+
n_rep_group = df_group["repetition"].unique()[0]
402+
403+
display_columns = ["Learner g", "Learner m", "Tuned", "Bias", "CI Length", "Coverage", "Uniform CI Length", "Uniform Coverage"]
404+
```
405+
406+
#### Observational Score
407+
408+
```{python}
409+
#| echo: false
410+
generate_and_show_styled_table(
411+
main_df=df_group,
412+
filters={"level": 0.95, "Score": "observational"},
413+
display_cols=display_columns,
414+
n_rep=n_rep_group,
415+
level_col="level",
416+
coverage_highlight_cols=["Coverage", "Uniform Coverage"]
417+
)
418+
```
419+
420+
```{python}
421+
#| echo: false
422+
generate_and_show_styled_table(
423+
main_df=df_group,
424+
filters={"level": 0.9, "Score": "observational"},
425+
display_cols=display_columns,
426+
n_rep=n_rep_group,
427+
level_col="level",
428+
coverage_highlight_cols=["Coverage", "Uniform Coverage"]
429+
)
430+
```
431+
432+
433+
### Time Effects
434+
435+
```{python}
436+
#| echo: false
437+
438+
# set up data
439+
df_time = pd.read_csv("../../results/did/did_pa_multi_tune_time.csv", index_col=None)
440+
441+
assert df_time["repetition"].nunique() == 1
442+
n_rep_time = df_time["repetition"].unique()[0]
443+
444+
display_columns = ["Learner g", "Learner m", "Tuned", "Bias", "CI Length", "Coverage", "Uniform CI Length", "Uniform Coverage"]
445+
```
446+
447+
#### Observational Score
448+
449+
```{python}
450+
#| echo: false
451+
generate_and_show_styled_table(
452+
main_df=df_time,
453+
filters={"level": 0.95, "Score": "observational"},
454+
display_cols=display_columns,
455+
n_rep=n_rep_time,
456+
level_col="level",
457+
coverage_highlight_cols=["Coverage", "Uniform Coverage"]
458+
)
459+
```
460+
461+
```{python}
462+
#| echo: false
463+
generate_and_show_styled_table(
464+
main_df=df_time,
465+
filters={"level": 0.9, "Score": "observational"},
466+
display_cols=display_columns,
467+
n_rep=n_rep_time,
468+
level_col="level",
469+
coverage_highlight_cols=["Coverage", "Uniform Coverage"]
470+
)
471+
```
472+
473+
### Event Study Aggregation
474+
475+
```{python}
476+
#| echo: false
477+
478+
# set up data
479+
df_es = pd.read_csv("../../results/did/did_pa_multi_tune_eventstudy.csv", index_col=None)
480+
481+
assert df_es["repetition"].nunique() == 1
482+
n_rep_es = df_es["repetition"].unique()[0]
483+
484+
display_columns = ["Learner g", "Learner m", "Tuned", "Bias", "CI Length", "Coverage", "Uniform CI Length", "Uniform Coverage"]
485+
```
486+
487+
#### Observational Score
488+
489+
```{python}
490+
#| echo: false
491+
generate_and_show_styled_table(
492+
main_df=df_es,
493+
filters={"level": 0.95, "Score": "observational"},
494+
display_cols=display_columns,
495+
n_rep=n_rep_es,
496+
level_col="level",
497+
coverage_highlight_cols=["Coverage", "Uniform Coverage"]
498+
)
499+
```
500+
501+
```{python}
502+
#| echo: false
503+
generate_and_show_styled_table(
504+
main_df=df_es,
505+
filters={"level": 0.9, "Score": "observational"},
506+
display_cols=display_columns,
507+
n_rep=n_rep_es,
508+
level_col="level",
509+
coverage_highlight_cols=["Coverage", "Uniform Coverage"]
510+
)
511+
```

monte-cover/src/montecover/did/did_pa_multi_tune.py

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -37,37 +37,33 @@ def __init__(
3737
# parameter space for the outcome regression tuning
3838
def ml_g_params(trial):
3939
return {
40-
"n_estimators": trial.suggest_int("n_estimators", 100, 200, step=50),
41-
"learning_rate": trial.suggest_float(
42-
"learning_rate", 1e-3, 0.1, log=True
43-
),
40+
"n_estimators": trial.suggest_int("n_estimators", 100, 300, step=25),
41+
"learning_rate": trial.suggest_float("learning_rate", 0.005, 0.1),
4442
"min_child_samples": trial.suggest_int(
45-
"min_child_samples", 20, 50, step=5
43+
"min_child_samples", 5, 50, step=5
4644
),
47-
"max_depth": 5,
48-
"lambda_l1": trial.suggest_float("lambda_l1", 1e-3, 10.0, log=True),
49-
"lambda_l2": trial.suggest_float("lambda_l2", 1e-3, 10.0, log=True),
45+
"max_depth": 3,
46+
"lambda_l1": trial.suggest_float("lambda_l1", 1e-1, 10.0),
47+
"lambda_l2": trial.suggest_float("lambda_l2", 1e-1, 10.0),
5048
}
5149

5250
# parameter space for the propensity score tuning
5351
def ml_m_params(trial):
5452
return {
55-
"n_estimators": trial.suggest_int("n_estimators", 100, 200, step=50),
56-
"learning_rate": trial.suggest_float(
57-
"learning_rate", 1e-3, 0.1, log=True
58-
),
53+
"n_estimators": trial.suggest_int("n_estimators", 100, 300, step=25),
54+
"learning_rate": trial.suggest_float("learning_rate", 0.005, 0.1),
5955
"min_child_samples": trial.suggest_int(
60-
"min_child_samples", 20, 50, step=5
56+
"min_child_samples", 5, 50, step=5
6157
),
62-
"max_depth": 5,
63-
"lambda_l1": trial.suggest_float("lambda_l1", 1e-3, 10.0, log=True),
64-
"lambda_l2": trial.suggest_float("lambda_l2", 1e-3, 10.0, log=True),
58+
"max_depth": 3,
59+
"lambda_l1": trial.suggest_float("lambda_l1", 1e-1, 10.0),
60+
"lambda_l2": trial.suggest_float("lambda_l2", 1e-1, 10.0),
6561
}
6662

6763
self._param_space = {"ml_g": ml_g_params, "ml_m": ml_m_params}
6864

6965
self._optuna_settings = {
70-
"n_trials": 200,
66+
"n_trials": 50,
7167
"show_progress_bar": False,
7268
"verbosity": optuna.logging.WARNING, # Suppress Optuna logs
7369
}

results/did/did_pa_multi_tune_config.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
simulation_parameters:
2-
repetitions: 2
2+
repetitions: 50
33
max_runtime: 19800
44
random_seed: 42
55
n_jobs: -2
66
dgp_parameters:
77
DGP:
8-
- 1
8+
- 4
99
n_obs:
1010
- 2000
1111
learner_definitions:
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
Learner g,Learner m,Score,In-sample-norm.,DGP,level,Tuned,Coverage,CI Length,Bias,Uniform Coverage,Uniform CI Length,repetition
2-
LGBM Regr.,LGBM Clas.,observational,True,1,0.9,False,0.9166666666666667,0.9768034697095042,0.23400349839993873,1.0,1.5475751781406841,2
3-
LGBM Regr.,LGBM Clas.,observational,True,1,0.9,True,0.875,0.606470751441224,0.1614408775625408,0.5,0.9452913645347121,2
4-
LGBM Regr.,LGBM Clas.,observational,True,1,0.95,False,1.0,1.163933124038929,0.23400349839993873,1.0,1.6901781219508825,2
5-
LGBM Regr.,LGBM Clas.,observational,True,1,0.95,True,0.875,0.7226544727294515,0.1614408775625408,0.5,1.033662115539573,2
2+
LGBM Regr.,LGBM Clas.,observational,True,4,0.9,False,0.9316666666666668,1.4966891600161318,0.32660664033390235,0.92,2.3216053508736927,50
3+
LGBM Regr.,LGBM Clas.,observational,True,4,0.9,True,0.7116666666666667,0.6931755373364055,0.26877949164802883,0.52,1.075386978472972,50
4+
LGBM Regr.,LGBM Clas.,observational,True,4,0.95,False,0.9666666666666667,1.783415132883231,0.32660664033390235,0.98,2.5480137105876035,50
5+
LGBM Regr.,LGBM Clas.,observational,True,4,0.95,True,0.805,0.8259695974659736,0.26877949164802883,0.8,1.1805791952374205,50
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
Learner g,Learner m,Score,In-sample-norm.,DGP,level,Tuned,Coverage,CI Length,Bias,Uniform Coverage,Uniform CI Length,repetition
2-
LGBM Regr.,LGBM Clas.,observational,True,1,0.9,False,1.0,0.8932471261067743,0.22134836624169563,1.0,1.2842220318304163,2
3-
LGBM Regr.,LGBM Clas.,observational,True,1,0.9,True,0.8333333333333333,0.5517000133722438,0.171384287662864,0.5,0.7722944107543078,2
4-
LGBM Regr.,LGBM Clas.,observational,True,1,0.95,False,1.0,1.0643695996876914,0.22134836624169563,1.0,1.4044272167279779,2
5-
LGBM Regr.,LGBM Clas.,observational,True,1,0.95,True,0.9166666666666667,0.6573911129611814,0.171384287662864,0.5,0.8460573095770816,2
2+
LGBM Regr.,LGBM Clas.,observational,True,4,0.9,False,0.93,1.4917723511590009,0.31094318906305424,1.0,2.046812212784216,50
3+
LGBM Regr.,LGBM Clas.,observational,True,4,0.9,True,0.6133333333333334,0.6538130173979115,0.2872303658356806,0.56,0.9020402355007543,50
4+
LGBM Regr.,LGBM Clas.,observational,True,4,0.95,False,0.9866666666666667,1.777556393770557,0.31094318906305424,1.0,2.302979981417753,50
5+
LGBM Regr.,LGBM Clas.,observational,True,4,0.95,True,0.7533333333333333,0.7790662620225798,0.2872303658356806,0.7,1.0094757455236818,50
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
Learner g,Learner m,Score,In-sample-norm.,DGP,level,Tuned,Coverage,CI Length,Bias,Uniform Coverage,Uniform CI Length,repetition
2-
LGBM Regr.,LGBM Clas.,observational,True,1,0.9,False,0.8333333333333333,0.9252764729189984,0.27505916642335154,1.0,1.1910838199026417,2
3-
LGBM Regr.,LGBM Clas.,observational,True,1,0.9,True,0.8333333333333333,0.6185581636672488,0.18895139098415115,0.5,0.7900541517154416,2
4-
LGBM Regr.,LGBM Clas.,observational,True,1,0.95,False,1.0,1.10253492040176,0.27505916642335154,1.0,1.328849771012091,2
5-
LGBM Regr.,LGBM Clas.,observational,True,1,0.95,True,0.8333333333333333,0.7370575127575214,0.18895139098415115,0.5,0.8906147435536307,2
2+
LGBM Regr.,LGBM Clas.,observational,True,4,0.9,False,0.9533333333333333,1.523584682406954,0.2957296523184597,0.98,1.9163577588137022,50
3+
LGBM Regr.,LGBM Clas.,observational,True,4,0.9,True,0.68,0.7074931257281757,0.29440880930589985,0.6,0.9006828631295234,50
4+
LGBM Regr.,LGBM Clas.,observational,True,4,0.95,False,0.9933333333333333,1.8154631244903028,0.2957296523184597,0.98,2.1923219567713677,50
5+
LGBM Regr.,LGBM Clas.,observational,True,4,0.95,True,0.7666666666666666,0.8430300563016622,0.29440880930589985,0.74,1.0223420230094116,50
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
DoubleML Version,Script,Date,Total Runtime (minutes),Python Version,Config File
2-
0.12.dev0,DIDMultiTuningCoverageSimulation,2025-11-27 21:14,8.742515516281127,3.12.9,scripts/did/did_pa_multi_tune_config.yml
2+
0.12.dev0,DIDMultiTuningCoverageSimulation,2025-11-28 08:04,10.720669198036195,3.12.9,scripts/did/did_pa_multi_tune_config.yml
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
Learner g,Learner m,Score,In-sample-norm.,DGP,level,Tuned,Coverage,CI Length,Bias,Uniform Coverage,Uniform CI Length,repetition
2-
LGBM Regr.,LGBM Clas.,observational,True,1,0.9,False,0.8333333333333333,0.9347149637122762,0.21239079355381435,1.0,1.1850129288693911,2
3-
LGBM Regr.,LGBM Clas.,observational,True,1,0.9,True,0.8333333333333333,0.5539493870014797,0.16522070900786323,1.0,0.6750979119813514,2
4-
LGBM Regr.,LGBM Clas.,observational,True,1,0.95,False,1.0,1.1137815758610201,0.21239079355381435,1.0,1.299771642249359,2
5-
LGBM Regr.,LGBM Clas.,observational,True,1,0.95,True,1.0,0.6600714069574607,0.16522070900786323,1.0,0.7914255322117764,2
2+
LGBM Regr.,LGBM Clas.,observational,True,4,0.9,False,0.9533333333333333,1.5850230603285973,0.31390770251930433,0.96,1.9287985346498584,50
3+
LGBM Regr.,LGBM Clas.,observational,True,4,0.9,True,0.5333333333333333,0.6805542616676624,0.31796626809821743,0.46,0.8338119946003776,50
4+
LGBM Regr.,LGBM Clas.,observational,True,4,0.95,False,0.9733333333333333,1.888671467179226,0.31390770251930433,0.98,2.212665951882592,50
5+
LGBM Regr.,LGBM Clas.,observational,True,4,0.95,True,0.68,0.8109304199097704,0.31796626809821743,0.62,0.9546449744673592,50

scripts/did/did_pa_multi_tune_config.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
# Simulation parameters for DID Multi Coverage
22

33
simulation_parameters:
4-
repetitions: 2
4+
repetitions: 50
55
max_runtime: 19800 # 5.5 hours in seconds
66
random_seed: 42
77
n_jobs: -2
88

99
dgp_parameters:
10-
DGP: [1] # Different DGP specifications
10+
DGP: [4] # Different DGP specifications
1111
n_obs: [2000] # Sample size for each simulation (has to be a list)
1212

1313
# Define reusable learner configurations

0 commit comments

Comments
 (0)