Skip to content

Commit 4a29fc2

Browse files
authored
Merge pull request #23 from DoubleML/s-update-irm-scripts
Update irm scripts
2 parents 8afc70b + c3119f4 commit 4a29fc2

File tree

100 files changed

+4671
-503
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

100 files changed

+4671
-503
lines changed

.github/workflows/apo_sim.yml

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ jobs:
1717
strategy:
1818
matrix:
1919
script: [
20-
'scripts/irm/irm_apo_coverage.py',
20+
'scripts/irm/apo.py',
21+
'scripts/irm/apos.py',
2122
]
2223

2324
steps:
@@ -47,28 +48,37 @@ jobs:
4748
with:
4849
ref: ${{ env.TARGET_BRANCH }}
4950

51+
- name: Install uv
52+
uses: astral-sh/setup-uv@v5
53+
with:
54+
version: "0.7.8"
55+
5056
- name: Set up Python
5157
uses: actions/setup-python@v5
5258
with:
53-
python-version: '3.12'
59+
python-version-file: "monte-cover/pyproject.toml"
5460

55-
- name: Install dependencies
61+
- name: Install Monte-Cover
5662
run: |
57-
python -m pip install --upgrade pip
58-
pip install -r requirements.txt
63+
cd monte-cover
64+
uv venv
65+
uv sync
5966
6067
- name: Install DoubleML from correct branch
6168
run: |
62-
pip uninstall -y doubleml
63-
pip install "doubleml @ git+https://github.com/DoubleML/doubleml-for-py@${{ env.DML_BRANCH }}"
69+
source monte-cover/.venv/bin/activate
70+
uv pip uninstall doubleml
71+
uv pip install "doubleml @ git+https://github.com/DoubleML/doubleml-for-py@${{ env.DML_BRANCH }}"
6472
6573
- name: Set up Git configuration
6674
run: |
6775
git config --global user.name 'github-actions'
6876
git config --global user.email '[email protected]'
6977
7078
- name: Run scripts
71-
run: python ${{ matrix.script }}
79+
run: |
80+
source monte-cover/.venv/bin/activate
81+
uv run ${{ matrix.script }}
7282
7383
- name: Commit any existing changes
7484
run: |

.github/workflows/irm_sim.yml

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ jobs:
1717
strategy:
1818
matrix:
1919
script: [
20-
'scripts/irm/irm_ate_coverage.py',
21-
'scripts/irm/irm_atte_coverage.py',
22-
'scripts/irm/irm_cate_coverage.py',
23-
'scripts/irm/irm_gate_coverage.py',
20+
'scripts/irm/irm_ate.py',
21+
'scripts/irm/irm_atte.py',
22+
'scripts/irm/irm_cate.py',
23+
'scripts/irm/irm_gate.py',
2424
'scripts/irm/irm_ate_sensitivity.py',
2525
'scripts/irm/irm_atte_sensitivity.py',
2626
]
@@ -52,28 +52,37 @@ jobs:
5252
with:
5353
ref: ${{ env.TARGET_BRANCH }}
5454

55+
- name: Install uv
56+
uses: astral-sh/setup-uv@v5
57+
with:
58+
version: "0.7.8"
59+
5560
- name: Set up Python
5661
uses: actions/setup-python@v5
5762
with:
58-
python-version: '3.12'
63+
python-version-file: "monte-cover/pyproject.toml"
5964

60-
- name: Install dependencies
65+
- name: Install Monte-Cover
6166
run: |
62-
python -m pip install --upgrade pip
63-
pip install -r requirements.txt
67+
cd monte-cover
68+
uv venv
69+
uv sync
6470
6571
- name: Install DoubleML from correct branch
6672
run: |
67-
pip uninstall -y doubleml
68-
pip install "doubleml @ git+https://github.com/DoubleML/doubleml-for-py@${{ env.DML_BRANCH }}"
73+
source monte-cover/.venv/bin/activate
74+
uv pip uninstall doubleml
75+
uv pip install "doubleml @ git+https://github.com/DoubleML/doubleml-for-py@${{ env.DML_BRANCH }}"
6976
7077
- name: Set up Git configuration
7178
run: |
7279
git config --global user.name 'github-actions'
7380
git config --global user.email '[email protected]'
7481
7582
- name: Run scripts
76-
run: python ${{ matrix.script }}
83+
run: |
84+
source monte-cover/.venv/bin/activate
85+
uv run ${{ matrix.script }}
7786
7887
- name: Commit any existing changes
7988
run: |

.github/workflows/quant_sim.yml

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ jobs:
1717
strategy:
1818
matrix:
1919
script: [
20-
'scripts/irm/cvar_coverage.py',
21-
'scripts/irm/pq_coverage.py',
22-
'scripts/irm/lpq_coverage.py',
20+
'scripts/irm/cvar.py',
21+
'scripts/irm/pq.py',
22+
'scripts/irm/lpq.py',
2323
]
2424

2525
steps:
@@ -49,28 +49,37 @@ jobs:
4949
with:
5050
ref: ${{ env.TARGET_BRANCH }}
5151

52+
- name: Install uv
53+
uses: astral-sh/setup-uv@v5
54+
with:
55+
version: "0.7.8"
56+
5257
- name: Set up Python
5358
uses: actions/setup-python@v5
5459
with:
55-
python-version: '3.12'
60+
python-version-file: "monte-cover/pyproject.toml"
5661

57-
- name: Install dependencies
62+
- name: Install Monte-Cover
5863
run: |
59-
python -m pip install --upgrade pip
60-
pip install -r requirements.txt
64+
cd monte-cover
65+
uv venv
66+
uv sync
6167
6268
- name: Install DoubleML from correct branch
6369
run: |
64-
pip uninstall -y doubleml
65-
pip install "doubleml @ git+https://github.com/DoubleML/doubleml-for-py@${{ env.DML_BRANCH }}"
70+
source monte-cover/.venv/bin/activate
71+
uv pip uninstall doubleml
72+
uv pip install "doubleml @ git+https://github.com/DoubleML/doubleml-for-py@${{ env.DML_BRANCH }}"
6673
6774
- name: Set up Git configuration
6875
run: |
6976
git config --global user.name 'github-actions'
7077
git config --global user.email '[email protected]'
7178
7279
- name: Run scripts
73-
run: python ${{ matrix.script }}
80+
run: |
81+
source monte-cover/.venv/bin/activate
82+
uv run ${{ matrix.script }}
7483
7584
- name: Commit any existing changes
7685
run: |

.github/workflows/ssm_sim.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ jobs:
1717
strategy:
1818
matrix:
1919
script: [
20-
'scripts/irm/ssm_mar_ate_coverage.py',
21-
'scripts/irm/ssm_nonignorable_ate_coverage.py',
20+
'scripts/ssm/ssm_mar_ate.py',
21+
'scripts/ssm/ssm_nonig_ate.py',
2222
]
2323

2424
steps:
@@ -73,7 +73,7 @@ jobs:
7373

7474
- name: Commit any existing changes
7575
run: |
76-
git add results/irm
76+
git add results/ssm
7777
git commit -m "Update results from script: ${{ matrix.script }}" || echo "No changed results to commit"
7878
7979
- name: Wait random time

doc/irm/apo.qmd

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ The simulations are based on the the [make_irm_data_discrete_treatments](https:
3030

3131
```{python}
3232
#| echo: false
33-
metadata_file = '../../results/irm/irm_apo_coverage_metadata.csv'
33+
metadata_file = '../../results/irm/apo_metadata.csv'
3434
metadata_df = pd.read_csv(metadata_file)
3535
print(metadata_df.T.to_string(header=False))
3636
```
@@ -41,7 +41,7 @@ print(metadata_df.T.to_string(header=False))
4141
#| echo: false
4242
4343
# set up data
44-
df_apo = pd.read_csv("../../results/irm/irm_apo_coverage_apo.csv", index_col=None)
44+
df_apo = pd.read_csv("../../results/irm/apo_coverage.csv", index_col=None)
4545
4646
assert df_apo["repetition"].nunique() == 1
4747
n_rep_apo = df_apo["repetition"].unique()[0]
@@ -88,7 +88,7 @@ The non-uniform results (coverage, ci length and bias) refer to averaged values
8888

8989
```{python}
9090
#| echo: false
91-
metadata_file = '../../results/irm/irm_apo_coverage_metadata.csv'
91+
metadata_file = '../../results/irm/apos_metadata.csv'
9292
metadata_df = pd.read_csv(metadata_file)
9393
print(metadata_df.T.to_string(header=False))
9494
```
@@ -99,7 +99,7 @@ print(metadata_df.T.to_string(header=False))
9999
#| echo: false
100100
101101
# set up data
102-
df_apos = pd.read_csv("../../results/irm/irm_apo_coverage_apos.csv", index_col=None)
102+
df_apos = pd.read_csv("../../results/irm/apos_coverage.csv", index_col=None)
103103
104104
assert df_apos["repetition"].nunique() == 1
105105
n_rep_apos = df_apos["repetition"].unique()[0]
@@ -144,7 +144,7 @@ The non-uniform results (coverage, ci length and bias) refer to averaged values
144144

145145
```{python}
146146
#| echo: false
147-
metadata_file = '../../results/irm/irm_apo_coverage_metadata.csv'
147+
metadata_file = '../../results/irm/apos_metadata.csv'
148148
metadata_df = pd.read_csv(metadata_file)
149149
print(metadata_df.T.to_string(header=False))
150150
```
@@ -155,7 +155,7 @@ print(metadata_df.T.to_string(header=False))
155155
#| echo: false
156156
157157
# set up data
158-
df_contrast = pd.read_csv("../../results/irm/irm_apo_coverage_apos_contrast.csv", index_col=None)
158+
df_contrast = pd.read_csv("../../results/irm/apos_causal_contrast.csv", index_col=None)
159159
160160
assert df_contrast["repetition"].nunique() == 1
161161
n_rep_contrast = df_contrast["repetition"].unique()[0]

doc/irm/irm.qmd

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ As for the ATE, the simulations are based on the the [make_irm_data](https://do
8686

8787
```{python}
8888
#| echo: false
89-
metadata_file = '../../results/irm/irm_atte_coverage_metadata.csv'
89+
metadata_file = '../../results/irm/irm_atte_metadata.csv'
9090
metadata_df = pd.read_csv(metadata_file)
9191
print(metadata_df.T.to_string(header=False))
9292
```
@@ -135,7 +135,7 @@ generate_and_show_styled_table(
135135

136136
## Sensitivity
137137

138-
The simulations are based on the the ADD-DGP with $10,000$ observations. As the DGP is nonlinear, we will only use corresponding learners. Since the DGP includes an unobserved confounder, we would expect a bias in the ATE estimates, leading to low coverage of the true parameter.
138+
The simulations are based on the the [make_confounded_irm_data](https://docs.doubleml.org/stable/api/generated/doubleml.datasets.make_confounded_irm_data.html#doubleml.datasets.make_confounded_irm_data)-DGP with $5,000$ observations. Since the DGP includes an unobserved confounder, we would expect a bias in the ATE estimates, leading to low coverage of the true parameter.
139139

140140
The confounding is set such that both sensitivity parameters are approximately $cf_y=cf_d=0.1$, such that the robustness value $RV$ should be approximately $10\%$.
141141
Further, the corresponding confidence intervals are one-sided (since the direction of the bias is unkown), such that only one side should approximate the corresponding coverage level (here only the lower coverage is relevant since the bias is positive). Remark that for the coverage level the value of $\rho$ has to be correctly specified, such that the coverage level will be generally (significantly) larger than the nominal level under the conservative choice of $|\rho|=1$.
@@ -157,7 +157,7 @@ print(metadata_df.T.to_string(header=False))
157157
#| echo: false
158158
159159
# set up data and rename columns
160-
df_ate_sens = pd.read_csv("../../results/irm/irm_ate_sensitivity.csv", index_col=None)
160+
df_ate_sens = pd.read_csv("../../results/irm/irm_ate_sensitivity_coverage.csv", index_col=None)
161161
162162
assert df_ate_sens["repetition"].nunique() == 1
163163
n_rep_ate_sens = df_ate_sens["repetition"].unique()[0]
@@ -211,7 +211,7 @@ print(metadata_df.T.to_string(header=False))
211211
#| echo: false
212212
213213
# set up data
214-
df_atte_sens = pd.read_csv("../../results/irm/irm_atte_sensitivity.csv", index_col=None)
214+
df_atte_sens = pd.read_csv("../../results/irm/irm_atte_sensitivity_coverage.csv", index_col=None)
215215
216216
assert df_atte_sens["repetition"].nunique() == 1
217217
n_rep_atte_sens = df_atte_sens["repetition"].unique()[0]

doc/irm/qte.qmd

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ The non-uniform results (coverage, ci length and bias) refer to averaged values
3131

3232
```{python}
3333
#| echo: false
34-
metadata_file = '../../results/irm/pq_coverage_metadata.csv'
34+
metadata_file = '../../results/irm/pq_metadata.csv'
3535
metadata_df = pd.read_csv(metadata_file)
3636
print(metadata_df.T.to_string(header=False))
3737
```
@@ -42,7 +42,7 @@ print(metadata_df.T.to_string(header=False))
4242
#| echo: false
4343
4444
# set up data
45-
df_qte = pd.read_csv("../../results/irm/pq_coverage_qte.csv", index_col=None)
45+
df_qte = pd.read_csv("../../results/irm/pq_effect_coverage.csv", index_col=None)
4646
4747
assert df_qte["repetition"].nunique() == 1
4848
n_rep_qte = df_qte["repetition"].unique()[0]
@@ -85,7 +85,7 @@ generate_and_show_styled_table(
8585
#| echo: false
8686
8787
# set up data
88-
df_pq0 = pd.read_csv("../../results/irm/pq_coverage_pq0.csv", index_col=None)
88+
df_pq0 = pd.read_csv("../../results/irm/pq_Y0_coverage.csv", index_col=None)
8989
9090
assert df_pq0["repetition"].nunique() == 1
9191
n_rep_pq0 = df_pq0["repetition"].unique()[0]
@@ -125,7 +125,7 @@ generate_and_show_styled_table(
125125
#| echo: false
126126
127127
# set up data and rename columns
128-
df_pq1 = pd.read_csv("../../results/irm/pq_coverage_pq1.csv", index_col=None)
128+
df_pq1 = pd.read_csv("../../results/irm/pq_Y1_coverage.csv", index_col=None)
129129
130130
assert df_pq1["repetition"].nunique() == 1
131131
n_rep_pq1 = df_pq1["repetition"].unique()[0]
@@ -161,15 +161,15 @@ generate_and_show_styled_table(
161161

162162
## LQTE
163163

164-
The results are based on a location-scale model as described the corresponding [Example](https://docs.doubleml.org/stable/examples/py_double_ml_pq.html#Local-Potential-Quantiles-(LPQs)) with $10,000$ observations.
164+
The results are based on a location-scale model as described the corresponding [Example](https://docs.doubleml.org/stable/examples/py_double_ml_pq.html#Local-Potential-Quantiles-(LPQs)) with $5,000$ observations.
165165

166166
The non-uniform results (coverage, ci length and bias) refer to averaged values over all quantiles (point-wise confidende intervals).
167167

168168
::: {.callout-note title="Metadata" collapse="true"}
169169

170170
```{python}
171171
#| echo: false
172-
metadata_file = '../../results/irm/lpq_coverage_metadata.csv'
172+
metadata_file = '../../results/irm/lpq_metadata.csv'
173173
metadata_df = pd.read_csv(metadata_file)
174174
print(metadata_df.T.to_string(header=False))
175175
```
@@ -180,7 +180,7 @@ print(metadata_df.T.to_string(header=False))
180180
#| echo: false
181181
182182
# set up data
183-
df_lqte = pd.read_csv("../../results/irm/lpq_coverage_lqte.csv", index_col=None)
183+
df_lqte = pd.read_csv("../../results/irm/lpq_effect_coverage.csv", index_col=None)
184184
185185
assert df_lqte["repetition"].nunique() == 1
186186
n_rep_lqte = df_lqte["repetition"].unique()[0]
@@ -222,7 +222,7 @@ generate_and_show_styled_table(
222222
#| echo: false
223223
224224
# set up data
225-
df_lpq0 = pd.read_csv("../../results/irm/lpq_coverage_lpq0.csv", index_col=None)
225+
df_lpq0 = pd.read_csv("../../results/irm/lpq_Y0_coverage.csv", index_col=None)
226226
227227
assert df_lpq0["repetition"].nunique() == 1
228228
n_rep_lpq0 = df_lpq0["repetition"].unique()[0]
@@ -262,7 +262,7 @@ generate_and_show_styled_table(
262262
#| echo: false
263263
264264
# set up data
265-
df_lpq1 = pd.read_csv("../../results/irm/lpq_coverage_lpq1.csv", index_col=None)
265+
df_lpq1 = pd.read_csv("../../results/irm/lpq_Y1_coverage.csv", index_col=None)
266266
267267
assert df_lpq1["repetition"].nunique() == 1
268268
n_rep_lpq1 = df_lpq1["repetition"].unique()[0]
@@ -306,7 +306,7 @@ The non-uniform results (coverage, ci length and bias) refer to averaged values
306306

307307
```{python}
308308
#| echo: false
309-
metadata_file = '../../results/irm/cvar_coverage_metadata.csv'
309+
metadata_file = '../../results/irm/cvar_metadata.csv'
310310
metadata_df = pd.read_csv(metadata_file)
311311
print(metadata_df.T.to_string(header=False))
312312
```
@@ -317,7 +317,7 @@ print(metadata_df.T.to_string(header=False))
317317
#| echo: false
318318
319319
# set up data
320-
df_cvar_qte = pd.read_csv("../../results/irm/cvar_coverage_qte.csv", index_col=None)
320+
df_cvar_qte = pd.read_csv("../../results/irm/cvar_effect_coverage.csv", index_col=None)
321321
322322
assert df_cvar_qte["repetition"].nunique() == 1
323323
n_rep_cvar_qte = df_cvar_qte["repetition"].unique()[0]
@@ -359,7 +359,7 @@ generate_and_show_styled_table(
359359
#| echo: false
360360
361361
# set up data
362-
df_cvar_pq0 = pd.read_csv("../../results/irm/cvar_coverage_pq0.csv", index_col=None)
362+
df_cvar_pq0 = pd.read_csv("../../results/irm/cvar_Y0_coverage.csv", index_col=None)
363363
364364
assert df_cvar_pq0["repetition"].nunique() == 1
365365
n_rep_cvar_pq0 = df_cvar_pq0["repetition"].unique()[0]
@@ -399,7 +399,7 @@ generate_and_show_styled_table(
399399
#| echo: false
400400
401401
# set up data
402-
df_cvar_pq1 = pd.read_csv("../../results/irm/cvar_coverage_pq1.csv", index_col=None)
402+
df_cvar_pq1 = pd.read_csv("../../results/irm/cvar_Y1_coverage.csv", index_col=None)
403403
404404
assert df_cvar_pq1["repetition"].nunique() == 1
405405
n_rep_cvar_pq1 = df_cvar_pq1["repetition"].unique()[0]

0 commit comments

Comments
 (0)