Skip to content

Clean repository #24

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 35 commits into from
Jun 6, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
381e5b2
remove old scripts
SvenKlaassen Jun 5, 2025
d891567
remove results
SvenKlaassen Jun 5, 2025
7e4e364
add iivm to monte-cover
SvenKlaassen Jun 5, 2025
6b3b92a
update iivm scripts
SvenKlaassen Jun 5, 2025
4dcb55a
update qmd and workflow files
SvenKlaassen Jun 5, 2025
a3f53ec
fix iivm workflow
SvenKlaassen Jun 5, 2025
c0a9a27
Update results from script: scripts/irm/iivm_late.py
invalid-email-address Jun 5, 2025
028a99a
increase iivm repetitions
SvenKlaassen Jun 5, 2025
685ce7b
Update results from script: scripts/irm/irm_ate_sensitivity.py
invalid-email-address Jun 5, 2025
424860a
Update results from script: scripts/irm/irm_atte_sensitivity.py
invalid-email-address Jun 5, 2025
3d8ff93
Update results from script: scripts/irm/apos.py
invalid-email-address Jun 5, 2025
47a4aac
Update results from script: scripts/irm/apo.py
invalid-email-address Jun 5, 2025
df190c5
Update results from script: scripts/irm/irm_gate.py
invalid-email-address Jun 5, 2025
6c9197e
Update results from script: scripts/irm/irm_cate.py
invalid-email-address Jun 5, 2025
07a6398
Update results from script: scripts/irm/cvar.py
invalid-email-address Jun 5, 2025
b614f94
Update results from script: scripts/irm/lpq.py
invalid-email-address Jun 5, 2025
4495d60
Update results from script: scripts/irm/pq.py
invalid-email-address Jun 5, 2025
8f56dbf
Update results from script: scripts/irm/irm_ate.py
invalid-email-address Jun 5, 2025
4900fb0
Update results from script: scripts/irm/irm_atte.py
invalid-email-address Jun 5, 2025
ce79b56
Update results from script: scripts/plm/plr_cate.py
invalid-email-address Jun 5, 2025
e7d2bee
Update results from script: scripts/plm/plr_gate.py
invalid-email-address Jun 5, 2025
65b80f0
Update results from script: scripts/plm/plr_ate.py
invalid-email-address Jun 5, 2025
dd729b6
Update results from script: scripts/plm/plr_ate_sensitivity.py
invalid-email-address Jun 5, 2025
67afc5e
fix ssm workflow
SvenKlaassen Jun 5, 2025
110af85
Update results from script: scripts/rdd/rdd_sharp.py
invalid-email-address Jun 5, 2025
011e27f
Update results from script: scripts/plm/pliv_late.py
invalid-email-address Jun 5, 2025
26c6b50
Update results from script: scripts/ssm/ssm_nonig_ate.py
invalid-email-address Jun 5, 2025
3d37f89
Update results from script: scripts/rdd/rdd_fuzzy.py
invalid-email-address Jun 5, 2025
af46e5a
Update results from script: scripts/ssm/ssm_mar_ate.py
invalid-email-address Jun 5, 2025
235a797
small did multi test run
SvenKlaassen Jun 6, 2025
459f5de
Update results from script: scripts/did/did_pa_atte_coverage.py
invalid-email-address Jun 6, 2025
7d9eeb4
Update results from script: scripts/did/did_cs_atte_coverage.py
invalid-email-address Jun 6, 2025
35d2a86
Update results from script: scripts/did/did_pa_multi.py
invalid-email-address Jun 6, 2025
22b5452
update did multi results
SvenKlaassen Jun 6, 2025
b85b2ed
fix metadata paths
SvenKlaassen Jun 6, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 17 additions & 8 deletions .github/workflows/iivm_sim.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
strategy:
matrix:
script: [
'scripts/irm/iivm_late_coverage.py',
'scripts/irm/iivm_late.py',
]

steps:
Expand Down Expand Up @@ -47,28 +47,37 @@ jobs:
with:
ref: ${{ env.TARGET_BRANCH }}

- name: Install uv
uses: astral-sh/setup-uv@v5
with:
version: "0.7.8"

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
python-version-file: "monte-cover/pyproject.toml"

- name: Install dependencies
- name: Install Monte-Cover
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
cd monte-cover
uv venv
uv sync

- name: Install DoubleML from correct branch
run: |
pip uninstall -y doubleml
pip install "doubleml @ git+https://github.com/DoubleML/doubleml-for-py@${{ env.DML_BRANCH }}"
source monte-cover/.venv/bin/activate
uv pip uninstall doubleml
uv pip install "doubleml @ git+https://github.com/DoubleML/doubleml-for-py@${{ env.DML_BRANCH }}"

- name: Set up Git configuration
run: |
git config --global user.name 'github-actions'
git config --global user.email '[email protected]'

- name: Run scripts
run: python ${{ matrix.script }}
run: |
source monte-cover/.venv/bin/activate
uv run ${{ matrix.script }}

- name: Commit any existing changes
run: |
Expand Down
23 changes: 16 additions & 7 deletions .github/workflows/ssm_sim.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,28 +48,37 @@ jobs:
with:
ref: ${{ env.TARGET_BRANCH }}

- name: Install uv
uses: astral-sh/setup-uv@v5
with:
version: "0.7.8"

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
python-version-file: "monte-cover/pyproject.toml"

- name: Install dependencies
- name: Install Monte-Cover
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
cd monte-cover
uv venv
uv sync

- name: Install DoubleML from correct branch
run: |
pip uninstall -y doubleml
pip install "doubleml @ git+https://github.com/DoubleML/doubleml-for-py@${{ env.DML_BRANCH }}"
source monte-cover/.venv/bin/activate
uv pip uninstall doubleml
uv pip install "doubleml @ git+https://github.com/DoubleML/doubleml-for-py@${{ env.DML_BRANCH }}"

- name: Set up Git configuration
run: |
git config --global user.name 'github-actions'
git config --global user.email '[email protected]'

- name: Run scripts
run: python ${{ matrix.script }}
run: |
source monte-cover/.venv/bin/activate
uv run ${{ matrix.script }}

- name: Commit any existing changes
run: |
Expand Down
4 changes: 2 additions & 2 deletions doc/irm/iivm.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ The simulations are based on the the [make_iivm_data](https://docs.doubleml.org

```{python}
#| echo: false
metadata_file = '../../results/irm/iivm_late_coverage_metadata.csv'
metadata_file = '../../results/irm/iivm_late_metadata.csv'
metadata_df = pd.read_csv(metadata_file)
print(metadata_df.T.to_string(header=False))
```
Expand All @@ -46,7 +46,7 @@ df = pd.read_csv("../../results/irm/iivm_late_coverage.csv", index_col=None)
assert df["repetition"].nunique() == 1
n_rep = df["repetition"].unique()[0]

display_columns = ["Learner g", "Learner m", "Bias", "CI Length", "Coverage"]
display_columns = ["Learner g", "Learner m", "Learner r", "Bias", "CI Length", "Coverage"]
```


Expand Down
2 changes: 1 addition & 1 deletion doc/irm/irm.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ The simulations are based on the the [make_irm_data](https://docs.doubleml.org/

```{python}
#| echo: false
metadata_file = '../../results/irm/irm_ate_coverage_metadata.csv'
metadata_file = '../../results/irm/irm_ate_metadata.csv'
metadata_df = pd.read_csv(metadata_file)
print(metadata_df.T.to_string(header=False))
```
Expand Down
2 changes: 1 addition & 1 deletion doc/irm/irm_cate.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ The non-uniform results (coverage, ci length and bias) refer to averaged values

```{python}
#| echo: false
metadata_file = '../../results/irm/irm_cate_coverage_metadata.csv'
metadata_file = '../../results/irm/irm_cate_metadata.csv'
metadata_df = pd.read_csv(metadata_file)
print(metadata_df.T.to_string(header=False))
```
Expand Down
2 changes: 1 addition & 1 deletion doc/irm/irm_gate.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ The non-uniform results (coverage, ci length and bias) refer to averaged values

```{python}
#| echo: false
metadata_file = '../../results/irm/irm_gate_coverage_metadata.csv'
metadata_file = '../../results/irm/irm_gate_metadata.csv'
metadata_df = pd.read_csv(metadata_file)
print(metadata_df.T.to_string(header=False))
```
Expand Down
2 changes: 1 addition & 1 deletion doc/plm/pliv.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ The simulations are based on the the [make_pliv_CHS2015](https://docs.doubleml.

```{python}
#| echo: false
metadata_file = '../../results/plm/pliv_late_coverage_metadata.csv'
metadata_file = '../../results/plm/pliv_late_metadata.csv'
metadata_df = pd.read_csv(metadata_file)
print(metadata_df.T.to_string(header=False))
```
Expand Down
2 changes: 1 addition & 1 deletion doc/plm/plr.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ The simulations are based on the the [make_plr_CCDDHNR2018](https://docs.double

```{python}
#| echo: false
metadata_file = '../../results/plm/plr_ate_coverage_metadata.csv'
metadata_file = '../../results/plm/plr_ate_metadata.csv'
metadata_df = pd.read_csv(metadata_file)
print(metadata_df.T.to_string(header=False))
```
Expand Down
4 changes: 2 additions & 2 deletions doc/plm/plr_cate.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ The non-uniform results (coverage, ci length and bias) refer to averaged values

```{python}
#| echo: false
metadata_file = '../../results/plm/plr_cate_coverage_metadata.csv'
metadata_file = '../../results/plm/plr_cate_metadata.csv'
metadata_df = pd.read_csv(metadata_file)
print(metadata_df.T.to_string(header=False))
```
Expand Down Expand Up @@ -116,4 +116,4 @@ generate_and_show_styled_table(
rename_map={"Learner g": "Learner l"},
coverage_highlight_cols=["Coverage", "Uniform Coverage"]
)
```
```
2 changes: 1 addition & 1 deletion doc/plm/plr_gate.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ The non-uniform results (coverage, ci length and bias) refer to averaged values

```{python}
#| echo: false
metadata_file = '../../results/plm/plr_gate_coverage_metadata.csv'
metadata_file = '../../results/plm/plr_gate_metadata.csv'
metadata_df = pd.read_csv(metadata_file)
print(metadata_df.T.to_string(header=False))
```
Expand Down
4 changes: 2 additions & 2 deletions doc/rdd/rdd.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ The simulations are based on the [make_simple_rdd_data](https://docs.doubleml.or

```{python}
#| echo: false
metadata_file = '../../results/rdd/rdd_sharp_coverage_metadata.csv'
metadata_file = '../../results/rdd/rdd_sharp_metadata.csv'
metadata_df = pd.read_csv(metadata_file)
print(metadata_df.T.to_string(header=False))
```
Expand Down Expand Up @@ -83,7 +83,7 @@ The simulations are based on the [make_simple_rdd_data](https://docs.doubleml.or

```{python}
#| echo: false
metadata_file = '../../results/rdd/rdd_fuzzy_coverage_metadata.csv'
metadata_file = '../../results/rdd/rdd_fuzzy_metadata.csv'
metadata_df = pd.read_csv(metadata_file)
print(metadata_df.T.to_string(header=False))
```
Expand Down
2 changes: 2 additions & 0 deletions monte-cover/src/montecover/irm/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from montecover.irm.apo import APOCoverageSimulation
from montecover.irm.apos import APOSCoverageSimulation
from montecover.irm.cvar import CVARCoverageSimulation
from montecover.irm.iivm_late import IIVMLATECoverageSimulation
from montecover.irm.irm_ate import IRMATECoverageSimulation
from montecover.irm.irm_ate_sensitivity import IRMATESensitivityCoverageSimulation
from montecover.irm.irm_atte import IRMATTECoverageSimulation
Expand All @@ -17,6 +18,7 @@
"APOSCoverageSimulation",
"CVARCoverageSimulation",
"IRMATECoverageSimulation",
"IIVMLATECoverageSimulation",
"IRMATESensitivityCoverageSimulation",
"IRMATTECoverageSimulation",
"IRMATTESensitivityCoverageSimulation",
Expand Down
122 changes: 122 additions & 0 deletions monte-cover/src/montecover/irm/iivm_late.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
from typing import Any, Dict, Optional

import doubleml as dml
from doubleml.datasets import make_iivm_data

from montecover.base import BaseSimulation
from montecover.utils import create_learner_from_config


class IIVMLATECoverageSimulation(BaseSimulation):
"""Simulation class for coverage properties of DoubleMLIIVM for LATE estimation."""

def __init__(
self,
config_file: str,
suppress_warnings: bool = True,
log_level: str = "INFO",
log_file: Optional[str] = None,
):
super().__init__(
config_file=config_file,
suppress_warnings=suppress_warnings,
log_level=log_level,
log_file=log_file,
)

# Calculate oracle values
self._calculate_oracle_values()

def _process_config_parameters(self):
"""Process simulation-specific parameters from config"""
# Process ML models in parameter grid
assert "learners" in self.dml_parameters, "No learners specified in the config file"

required_learners = ["ml_g", "ml_m", "ml_r"]
for learner in self.dml_parameters["learners"]:
for ml in required_learners:
assert ml in learner, f"No {ml} specified in the config file"

def _calculate_oracle_values(self):
"""Calculate oracle values for the simulation."""
self.logger.info("Calculating oracle values")

self.oracle_values = dict()
self.oracle_values["theta"] = self.dgp_parameters["theta"]

def run_single_rep(self, dml_data: dml.DoubleMLData, dml_params: Dict[str, Any]) -> Dict[str, Any]:
"""Run a single repetition with the given parameters."""
# Extract parameters
learner_config = dml_params["learners"]
learner_g_name, ml_g = create_learner_from_config(learner_config["ml_g"])
learner_m_name, ml_m = create_learner_from_config(learner_config["ml_m"])
learner_r_name, ml_r = create_learner_from_config(learner_config["ml_r"])

# Model
dml_model = dml.DoubleMLIIVM(
obj_dml_data=dml_data,
ml_g=ml_g,
ml_m=ml_m,
ml_r=ml_r,
)
dml_model.fit()

result = {
"coverage": [],
}
for level in self.confidence_parameters["level"]:
level_result = dict()
level_result["coverage"] = self._compute_coverage(
thetas=dml_model.coef,
oracle_thetas=self.oracle_values["theta"],
confint=dml_model.confint(level=level),
joint_confint=None,
)

# add parameters to the result
for res_metric in level_result.values():
res_metric.update(
{
"Learner g": learner_g_name,
"Learner m": learner_m_name,
"Learner r": learner_r_name,
"level": level,
}
)
for key, res in level_result.items():
result[key].append(res)

return result

def summarize_results(self):
"""Summarize the simulation results."""
self.logger.info("Summarizing simulation results")

# Group by parameter combinations
groupby_cols = ["Learner g", "Learner m", "Learner r", "level"]
aggregation_dict = {
"Coverage": "mean",
"CI Length": "mean",
"Bias": "mean",
"repetition": "count",
}

# Aggregate results (possibly multiple result dfs)
result_summary = dict()
for result_name, result_df in self.results.items():
result_summary[result_name] = result_df.groupby(groupby_cols).agg(aggregation_dict).reset_index()
self.logger.debug(f"Summarized {result_name} results")

return result_summary

def _generate_dml_data(self, dgp_params: Dict[str, Any]) -> dml.DoubleMLData:
"""Generate data for the simulation."""
data = make_iivm_data(
theta=dgp_params["theta"],
n_obs=dgp_params["n_obs"],
dim_x=dgp_params["dim_x"],
alpha_x=dgp_params["alpha_x"],
return_type="DataFrame",
)
dml_data = dml.DoubleMLData(data, "y", "d", z_cols="z")
return dml_data
2 changes: 1 addition & 1 deletion results/did/did_cs_atte_coverage_metadata.csv
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
DoubleML Version,Script,Date,Total Runtime (seconds),Python Version
0.11.dev0,did_cs_atte_coverage.py,2025-06-02 15:42:26,12669.156663179398,3.12.3
0.11.dev0,did_cs_atte_coverage.py,2025-06-06 09:10:00,12688.770802021027,3.12.3
Loading