diff --git a/.devcontainer/Dockerfile.dev b/.devcontainer/Dockerfile.dev new file mode 100644 index 00000000..c5583ebb --- /dev/null +++ b/.devcontainer/Dockerfile.dev @@ -0,0 +1,73 @@ +FROM ubuntu:24.04 + +# Set non-interactive mode to avoid prompts +ENV DEBIAN_FRONTEND=noninteractive + +# Update package list and install dependencies +RUN apt-get update && \ + apt-get install -y \ + software-properties-common \ + graphviz \ + wget \ + dirmngr \ + gnupg \ + apt-transport-https \ + ca-certificates \ + git \ + cmake + +# Install locale packages +RUN apt-get update && \ + apt-get install -y locales && \ + locale-gen en_US.UTF-8 && \ + update-locale LANG=en_US.UTF-8 + +# Set environment variables for locale +ENV LANG=en_US.UTF-8 +ENV LANGUAGE=en_US:en +ENV LC_ALL=en_US.UTF-8 + +# Install Python 3.12 +RUN add-apt-repository ppa:deadsnakes/ppa && \ + apt-get update && \ + apt-get install -y python3.12 python3.12-venv python3.12-dev python3-pip python3-full && \ + apt-get clean && rm -rf /var/lib/apt/lists/* + +# Set Python 3.12 as the default for both python and python3 +RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.12 1 && \ + update-alternatives --install /usr/bin/python python /usr/bin/python3.12 1 + +# Add R repository and install R +RUN wget -qO- https://cloud.r-project.org/bin/linux/ubuntu/marutter_pubkey.asc | tee /etc/apt/trusted.gpg.d/cran_ubuntu_key.asc && \ + add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu noble-cran40/' && \ + apt-get update && \ + apt-get install -y r-base r-base-dev zlib1g-dev libicu-dev pandoc make libcurl4-openssl-dev libssl-dev + +# Install Python packages +COPY requirements.txt /tmp/requirements.txt +RUN python -m venv /opt/venv && \ + /opt/venv/bin/python -m pip install --upgrade pip && \ + /opt/venv/bin/pip install -r /tmp/requirements.txt + +# Set the virtual environment as the default Python environment +ENV PATH="/opt/venv/bin:$PATH" + +# Check out the repo containing the Python package DoubleML (dev) +RUN git clone https://github.com/DoubleML/doubleml-for-py.git /doubleml-for-py +WORKDIR /doubleml-for-py +RUN /opt/venv/bin/pip uninstall -y DoubleML && \ + /opt/venv/bin/pip install -e .[rdd] + +# Create a directory for R user libraries and set the default R user library path +RUN mkdir -p /usr/local/lib/R/site-library +ENV R_LIBS_USER=/usr/local/lib/R/site-library + +# Install R packages and Jupyter kernel +RUN Rscript -e "install.packages('remotes')" && \ + Rscript -e "remotes::install_github('DoubleML/doubleml-for-r', dependencies = TRUE)" && \ + Rscript -e "install.packages(c('ggplot2', 'IRkernel', 'xgboost', 'hdm', 'reshape2', 'gridExtra', 'igraph', 'mlr3filters', 'mlr3measures', 'did', dependencies=TRUE))" && \ + Rscript -e "IRkernel::installspec()" + +# Set the working directory +WORKDIR /workspace + diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000..b2900011 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,46 @@ +{ + "name": "DoubleML Documentation Development", + "dockerFile": "Dockerfile.dev", // Path to your Dockerfile + "context": "..", // Context for the build (root of your project) + "workspaceFolder": "/workspace", // Folder inside the container for your project + // Customizations for VS Code + "customizations": { + "vscode": { + "extensions": [ + "ms-python.python", // Python extension for VS Code + "ms-azuretools.vscode-docker", // Docker integration for VS Code + "njpwerner.autodocstring", // Optional: Auto-generate docstrings + "ms-python.black-formatter", // Optional: Black formatter + "streetsidesoftware.code-spell-checker", // Optional: Spell checker + "github.copilot" // Add GitHub Copilot extension + "GitHub.github-vscode-theme", // GitHub theme + "github.vscode-github-actions" // GitHub Actions extension + "ms-toolsai.jupyter", // Jupyter extension + "charliermarsh.ruff" // Ruff extension + ], + "settings": { + "python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python", // Poetry virtual environment path + "editor.formatOnSave": true, // Auto-format code when saving + "editor.codeActionsOnSave": { + "source.organizeImports": true // Auto-organize imports on save + }, + "python.linting.enabled": true, // Enable linting + "python.linting.flake8Enabled": false, // Disable Flake8 for linting + "python.linting.ruffEnabled": true, // Enable Ruff for linting + "python.formatting.provider": "black", // Use Black for formatting + "python.testing.pytestEnabled": false, // Enable Pytest for testing + "python.testing.pytestArgs": [], + "python.testing.unittestEnabled": false, + "files.exclude": { + "**/__pycache__": true, // Hide __pycache__ directories + "**/*.pyc": true, // Hide .pyc files + "**/.DS_Store": true // Hide .DS_Store files (macOS) + } + } + } + }, + "mounts": [ + "source=${localWorkspaceFolder},target=/workspace,type=bind" // Mount your local workspace into the container + ], + "remoteUser": "root" // Set the user inside the container +} \ No newline at end of file diff --git a/.devcontainer/guide.md b/.devcontainer/guide.md new file mode 100644 index 00000000..d508dfd2 --- /dev/null +++ b/.devcontainer/guide.md @@ -0,0 +1,64 @@ +# Build Documentation with Development Container + +This guide shows how to use WSL2 (Windows Subsystem for Linux), Docker Desktop, Visual Studio Code (VS Code), and how to work with Development Containers in VS Code on a Windows machine. + +Requirements: + - [VS Code](https://code.visualstudio.com/) + - [WSL2](https://learn.microsoft.com/en-us/windows/wsl/install) + - [Docker Desktop](https://docs.docker.com/desktop/setup/install/windows-install/) + +## Verify installations & Setup + +You can verify the installations in a terminal: + + ```bash + code --version + wsl --version + docker --version + ``` + +### Configure Docker to Use WSL2 + + See [Docker Desktop Documentation](https://docs.docker.com/desktop/features/wsl/#turn-on-docker-desktop-wsl-2). + - Open Docker Desktop. + - Go to **Settings > General** and make sure **Use the WSL 2 based engine** is checked. + - Under **Settings > Resources > WSL Integration**, ensure that your desired Linux distribution(s) are selected for integration with Docker. + +### Install Extensions + + - Open Visual Studio Code. + - Press `Ctrl+Shift+X` to open the Extensions view. + - Search and install (includes WSL and Dev Containers Extensions): + - [Remote Development Extension Pack](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack) + + VS Code Documentations: + - [Developing in WSL](https://code.visualstudio.com/docs/remote/wsl) + - [Developing inside a Container](https://code.visualstudio.com/docs/devcontainers/containers) + + +## Build & Open the Development Container + + - Open the project `doubleml-docs` in VS code: + + ```bash + code . + ``` + + - Open the Command Palette (`Ctrl+Shift+P`). + - Type `Remote-Containers: Reopen Folder in Container`. + - VS Code will build the new container(this may take some time) and open the project in it. + + +## Build the documentation + +You can build the documentation via + + ```bash + cd doc + make html + ``` + + Open the directory in WSL with + ```bash + explorer.exe . + ``` \ No newline at end of file diff --git a/.github/workflows/deploy_docu_dev.yml b/.github/workflows/deploy_docu_dev.yml index 3a70eb72..35f8631e 100644 --- a/.github/workflows/deploy_docu_dev.yml +++ b/.github/workflows/deploy_docu_dev.yml @@ -76,7 +76,7 @@ jobs: - name: Build docu with sphinx run: | - make -C doc html # build docu + make -C doc html - name: Deploy to dev uses: JamesIves/github-pages-deploy-action@v4 diff --git a/.github/workflows/deploy_docu_stable.yml b/.github/workflows/deploy_docu_stable.yml index 9260259b..d2c25664 100644 --- a/.github/workflows/deploy_docu_stable.yml +++ b/.github/workflows/deploy_docu_stable.yml @@ -65,7 +65,7 @@ jobs: - name: Build docu with sphinx run: | - make -C doc html # build docu + make -C doc html - name: Deploy to stable uses: JamesIves/github-pages-deploy-action@v4 diff --git a/.github/workflows/test_build_docu_dev.yml b/.github/workflows/test_build_docu_dev.yml index 33d6f972..ef5989de 100644 --- a/.github/workflows/test_build_docu_dev.yml +++ b/.github/workflows/test_build_docu_dev.yml @@ -20,6 +20,10 @@ on: description: 'Branch in https://github.com/DoubleML/doubleml-for-r' required: true default: 'main' + nbsphinx-execute: + description: 'Execute notebooks with nbsphinx' + required: false + default: 'auto' schedule: - cron: "0 9 * * 1,3,5" @@ -113,7 +117,7 @@ jobs: - name: Build docu with sphinx run: | - make -C doc html # build docu + make -C doc html NBSPHINX_EXECUTE=${{ github.event.inputs.nbsphinx-execute || 'auto' }} - name: Check for broken links / URLs run: | diff --git a/.github/workflows/test_build_docu_released.yml b/.github/workflows/test_build_docu_released.yml index 518fe29c..9d621880 100644 --- a/.github/workflows/test_build_docu_released.yml +++ b/.github/workflows/test_build_docu_released.yml @@ -11,6 +11,11 @@ on: - main - dev workflow_dispatch: + inputs: + nbsphinx-execute: + description: 'Execute notebooks with nbsphinx' + required: false + default: 'auto' schedule: - cron: "0 9 * * 1,3,5" @@ -74,9 +79,10 @@ jobs: - name: Build docu with sphinx run: | - make -C doc html # build docu + make -C doc html NBSPHINX_EXECUTE=${{ github.event.inputs.nbsphinx-execute || 'auto' }} - name: Check for broken links / URLs + run: | make -C doc linkcheck diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b81..00000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/doubleml-docs.iml b/.idea/doubleml-docs.iml deleted file mode 100644 index 039314de..00000000 --- a/.idea/doubleml-docs.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index 105ce2da..00000000 --- a/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 84a450c8..00000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 71901565..00000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/rGraphicsSettings.xml b/.idea/rGraphicsSettings.xml deleted file mode 100644 index bcc5a04c..00000000 --- a/.idea/rGraphicsSettings.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/rSettings.xml b/.idea/rSettings.xml deleted file mode 100644 index e3f0605a..00000000 --- a/.idea/rSettings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7f..00000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/doc/.gitignore b/doc/.gitignore index e35d8850..e17e9bdf 100644 --- a/doc/.gitignore +++ b/doc/.gitignore @@ -1 +1,4 @@ _build + +# Ignore generated API documentation +api/generated/ \ No newline at end of file diff --git a/doc/Makefile b/doc/Makefile index d4bb2cbb..9c168ec5 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -7,6 +7,11 @@ SPHINXOPTS ?= SPHINXBUILD ?= sphinx-build SOURCEDIR = . BUILDDIR = _build +NBSPHINX_EXECUTE = auto + +# Add NBSPHINX_EXECUTE to SPHINXOPTS +SPHINXOPTS += -D nbsphinx_execute=$(NBSPHINX_EXECUTE) + # Put it first so that "make" without argument is like "make help". help: diff --git a/doc/_static/switcher.json b/doc/_static/switcher.json new file mode 100644 index 00000000..e2188147 --- /dev/null +++ b/doc/_static/switcher.json @@ -0,0 +1,13 @@ +[ + { + "name": "dev", + "version": "dev", + "url": "https://docs.doubleml.org/dev/" + }, + { + "name": "stable", + "version": "stable", + "url": "https://docs.doubleml.org/stable/", + "preferred": true + } +] \ No newline at end of file diff --git a/doc/api/api.rst b/doc/api/api.rst index 5844055a..3a428cca 100644 --- a/doc/api/api.rst +++ b/doc/api/api.rst @@ -1,125 +1,22 @@ .. _python_api: -API reference -============= - -Double machine learning data class ----------------------------------- - -.. currentmodule:: doubleml - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - DoubleMLData - DoubleMLClusterData - -Double machine learning models ------------------------------- - -.. currentmodule:: doubleml - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - DoubleMLPLR - DoubleMLPLIV - DoubleMLIRM - DoubleMLAPO - DoubleMLAPOS - DoubleMLIIVM - DoubleMLDID - DoubleMLDIDCS - DoubleMLSSM - DoubleMLPQ - DoubleMLLPQ - DoubleMLCVAR - DoubleMLQTE - -Other models ------------------------------- -.. currentmodule:: doubleml - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - rdd.RDFlex - -Datasets module ---------------- - +:parenttoc: True -Dataset loaders -~~~~~~~~~~~~~~~ - -.. currentmodule:: doubleml - -.. autosummary:: - :toctree: generated/ - - datasets.fetch_401K - datasets.fetch_bonus - -Dataset generators -~~~~~~~~~~~~~~~~~~ - -.. currentmodule:: doubleml - -.. autosummary:: - :toctree: generated/ - - datasets.make_plr_CCDDHNR2018 - datasets.make_pliv_CHS2015 - datasets.make_irm_data - datasets.make_iivm_data - datasets.make_plr_turrell2018 - datasets.make_pliv_multiway_cluster_CKMS2021 - datasets.make_did_SZ2020 - datasets.make_ssm_data - datasets.make_confounded_plr_data - datasets.make_confounded_irm_data - datasets.make_heterogeneous_data - datasets.make_irm_data_discrete_treatments - rdd.datasets.make_simple_rdd_data - -Utility classes and functions ------------------------------ - -Utility classes -~~~~~~~~~~~~~~~ - -.. currentmodule:: doubleml - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - utils.DMLDummyRegressor - utils.DMLDummyClassifier - utils.DoubleMLBLP - utils.DoubleMLPolicyTree - -Utility functions -~~~~~~~~~~~~~~~~~ +API Reference +============= -.. currentmodule:: doubleml +.. toctree:: + :maxdepth: 2 + :numbered: -.. autosummary:: - :toctree: generated/ + DoubleML Data Class + DoubleML Models + Other Models + Datasets + Utility Classes and Functions + Score Mixin Classes for DoubleML Models - utils.gain_statistics -Score mixin classes for double machine learning models ------------------------------------------------------- -.. currentmodule:: doubleml -.. autosummary:: - :toctree: generated/ - :template: class.rst - double_ml_score_mixins.LinearScoreMixin - double_ml_score_mixins.NonLinearScoreMixin diff --git a/doc/api/data_class.rst b/doc/api/data_class.rst new file mode 100644 index 00000000..312bc2f4 --- /dev/null +++ b/doc/api/data_class.rst @@ -0,0 +1,13 @@ +.. _api_data_class: + +DoubleML Data Class +---------------------------------- + +.. currentmodule:: doubleml + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + DoubleMLData + DoubleMLClusterData diff --git a/doc/api/datasets.rst b/doc/api/datasets.rst new file mode 100644 index 00000000..5e1497d9 --- /dev/null +++ b/doc/api/datasets.rst @@ -0,0 +1,37 @@ +.. _api_datasets: + +Datasets +--------- + +Dataset Loaders +~~~~~~~~~~~~~~~ + +.. currentmodule:: doubleml + +.. autosummary:: + :toctree: generated/ + + datasets.fetch_401K + datasets.fetch_bonus + +Dataset Generators +~~~~~~~~~~~~~~~~~~ + +.. currentmodule:: doubleml + +.. autosummary:: + :toctree: generated/ + + datasets.make_plr_CCDDHNR2018 + datasets.make_pliv_CHS2015 + datasets.make_irm_data + datasets.make_iivm_data + datasets.make_plr_turrell2018 + datasets.make_pliv_multiway_cluster_CKMS2021 + datasets.make_did_SZ2020 + datasets.make_ssm_data + datasets.make_confounded_plr_data + datasets.make_confounded_irm_data + datasets.make_heterogeneous_data + datasets.make_irm_data_discrete_treatments + rdd.datasets.make_simple_rdd_data \ No newline at end of file diff --git a/doc/api/dml_models.rst b/doc/api/dml_models.rst new file mode 100644 index 00000000..84f5b8cb --- /dev/null +++ b/doc/api/dml_models.rst @@ -0,0 +1,24 @@ +.. _api_dml_models: + +DoubleML Models +------------------------------ + +.. currentmodule:: doubleml + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + DoubleMLPLR + DoubleMLPLIV + DoubleMLIRM + DoubleMLAPO + DoubleMLAPOS + DoubleMLIIVM + DoubleMLDID + DoubleMLDIDCS + DoubleMLSSM + DoubleMLPQ + DoubleMLLPQ + DoubleMLCVAR + DoubleMLQTE \ No newline at end of file diff --git a/doc/api/mixins.rst b/doc/api/mixins.rst new file mode 100644 index 00000000..bd61fb5d --- /dev/null +++ b/doc/api/mixins.rst @@ -0,0 +1,13 @@ +.. _api_mixins: + +Score Mixin Classes for DoubleML Models +--------------------------------------- + +.. currentmodule:: doubleml + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + double_ml_score_mixins.LinearScoreMixin + double_ml_score_mixins.NonLinearScoreMixin diff --git a/doc/api/other_models.rst b/doc/api/other_models.rst new file mode 100644 index 00000000..2595dd30 --- /dev/null +++ b/doc/api/other_models.rst @@ -0,0 +1,11 @@ +.. _api_other_models: + +Other models +------------------------------ +.. currentmodule:: doubleml + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + rdd.RDFlex diff --git a/doc/api/utility.rst b/doc/api/utility.rst new file mode 100644 index 00000000..28367bde --- /dev/null +++ b/doc/api/utility.rst @@ -0,0 +1,30 @@ +.. _api_utility: + +Utility Classes and Functions +----------------------------- + +Utility Classes +~~~~~~~~~~~~~~~ + +.. currentmodule:: doubleml + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + utils.DMLDummyRegressor + utils.DMLDummyClassifier + utils.DoubleMLBLP + utils.DoubleMLPolicyTree + utils.GlobalRegressor + utils.GlobalClassifier + +Utility Functions +~~~~~~~~~~~~~~~~~ + +.. currentmodule:: doubleml + +.. autosummary:: + :toctree: generated/ + + utils.gain_statistics \ No newline at end of file diff --git a/doc/conf.py b/doc/conf.py index 90686507..560e98e8 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -12,8 +12,10 @@ # import os import sys -sys.path.insert(0, os.path.abspath('..')) +import doubleml + +sys.path.insert(0, os.path.abspath('..')) # -- Project information ----------------------------------------------------- @@ -66,29 +68,79 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -# html_theme = 'pydata_sphinx_theme' +# version for the switcher +if "dev" in doubleml.__version__: + version = "dev" +else: + version = "stable" + html_theme_options = { - 'github_url': 'https://github.com/DoubleML/doubleml-for-py', - 'navigation_with_keys': False, + "navigation_with_keys": False, + "navbar_start": ["navbar-logo"], + "navbar_center": ["navbar-nav"], + "navbar_persistent": ["search-field"], + "navbar_end": ["theme-switcher", "navbar-icon-links", "version-switcher"], + "show_nav_level": 2, + "collapse_navigation": True, + "navigation_depth": 4, + "show_toc_level": 2, + "navbar_align": "left", + "logo": { + "text": project, + "image_light": "img/logo.png", + "image_dark": "img/logo_dark.png", + }, "header_links_before_dropdown": 6, + "use_edit_page_button": True, + "secondary_sidebar_items": ["page-toc", "edit-this-page", "sourcelink"], + "icon_links": [ + { + "name": "GitHub", + "url": "https://github.com/DoubleML/doubleml-for-py", + "icon": "fa-brands fa-square-github", + "type": "fontawesome", + }, + { + "name": "PyPI", + "url": "https://pypi.org/project/DoubleML/", + "icon": "fa-solid fa-cube", + "type": "fontawesome", + }, + ], + "switcher": { + "json_url": "https://docs.doubleml.org/dev/_static/switcher.json", + "version_match": version, + }, + "show_version_warning_banner": True, + "check_switcher": False, + "announcement": "Interested to learn more? We offer DoubleML Trainings!", } -# html_logo = '../img/logo.png' html_extra_path = ['../img/logo.png', '../img/logo_dark.png'] html_favicon = '../img/favicon.ico' -html_sidebars = {'**': ['logo.html', - 'search-field.html', - 'sidebar-nav-bs.html'], - 'workflow/workflow': ['logo.html', - 'search-field.html', - 'sidebar-nav-bs.html', - 'sidebar-doubleml-workflow.html'], - 'guide/guide': ['logo.html', - 'search-field.html', - 'sidebar-nav-bs.html']} +html_sidebars = { + '**': [ + 'logo.html', + 'search-field.html', + 'sidebar-nav-bs.html', + ], + 'index': [], + 'intro/install': [], + 'intro/intro': [], + 'workflow/workflow': [], + 'literature/literature': [], + 'release/release': [], +} + +html_context = { + "github_user": "DoubleML", + "github_repo": "doubleml-docs", + "github_version": "dev", + "doc_path": "doc", +} # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, @@ -212,4 +264,4 @@ jupyter_sphinx_linenos = False # option to disable the execution of notebooks -nbsphinx_execute = "auto" # "auto" | "always" | "never" +nbsphinx_execute = os.getenv("NBSPHINX_EXECUTE", "auto") # Default is "auto" diff --git a/doc/examples/py_double_ml_cate.ipynb b/doc/examples/py_double_ml_cate.ipynb index 62b7966b..ffaa14bf 100644 --- a/doc/examples/py_double_ml_cate.ipynb +++ b/doc/examples/py_double_ml_cate.ipynb @@ -33,7 +33,7 @@ "\n", "We define a data generating process to create synthetic data to compare the estimates to the true effect. The data generating process is based on the Monte Carlo simulation from [Oprescu et al. (2019)](http://proceedings.mlr.press/v97/oprescu19a.html).\n", "\n", - "The documentation of the data generating process can be found [here](https://docs.doubleml.org/dev/api/api.html#dataset-generators)." + "The documentation of the data generating process can be found [here](https://docs.doubleml.org/dev/api/datasets.html#dataset-generators)." ] }, { diff --git a/doc/examples/py_double_ml_cate_plr.ipynb b/doc/examples/py_double_ml_cate_plr.ipynb index 62beab2e..ef9dccd3 100644 --- a/doc/examples/py_double_ml_cate_plr.ipynb +++ b/doc/examples/py_double_ml_cate_plr.ipynb @@ -30,7 +30,7 @@ "\n", "We define a data generating process to create synthetic data to compare the estimates to the true effect. The data generating process is based on the Monte Carlo simulation from [Oprescu et al. (2019)](http://proceedings.mlr.press/v97/oprescu19a.html).\n", "\n", - "The documentation of the data generating process can be found [here](https://docs.doubleml.org/dev/api/api.html#dataset-generators)." + "The documentation of the data generating process can be found [here](https://docs.doubleml.org/dev/api/datasets.html#dataset-generators)." ] }, { diff --git a/doc/examples/py_double_ml_gate.ipynb b/doc/examples/py_double_ml_gate.ipynb index 382a6476..adf83167 100644 --- a/doc/examples/py_double_ml_gate.ipynb +++ b/doc/examples/py_double_ml_gate.ipynb @@ -33,7 +33,7 @@ "\n", "We define a data generating process to create synthetic data to compare the estimates to the true effect. The data generating process is based on the Monte Carlo simulation from [Oprescu et al. (2019)](http://proceedings.mlr.press/v97/oprescu19a.html).\n", "\n", - "The documentation of the data generating process can be found [here](https://docs.doubleml.org/dev/api/api.html#dataset-generators). In this example the true effect depends only the first covariate $X_0$ and takes the following form\n", + "The documentation of the data generating process can be found [here](https://docs.doubleml.org/dev/api/datasets.html#dataset-generators). In this example the true effect depends only the first covariate $X_0$ and takes the following form\n", "\n", "$$\n", "\\theta_0(X) = \\exp(2X_0) + 3\\sin(4X_0).\n", diff --git a/doc/examples/py_double_ml_gate_plr.ipynb b/doc/examples/py_double_ml_gate_plr.ipynb index d399768a..b8308fc8 100644 --- a/doc/examples/py_double_ml_gate_plr.ipynb +++ b/doc/examples/py_double_ml_gate_plr.ipynb @@ -30,7 +30,7 @@ "\n", "We define a data generating process to create synthetic data to compare the estimates to the true effect. The data generating process is based on the Monte Carlo simulation from [Oprescu et al. (2019)](http://proceedings.mlr.press/v97/oprescu19a.html).\n", "\n", - "The documentation of the data generating process can be found [here](https://docs.doubleml.org/dev/api/api.html#dataset-generators). In this example the true effect depends only the first covariate $X_0$ and takes the following form\n", + "The documentation of the data generating process can be found [here](https://docs.doubleml.org/dev/api/datasets.html#dataset-generators). In this example the true effect depends only the first covariate $X_0$ and takes the following form\n", "\n", "$$\n", "\\theta_0(X) = \\exp(2X_0) + 3\\sin(4X_0).\n", diff --git a/doc/examples/py_double_ml_pension.ipynb b/doc/examples/py_double_ml_pension.ipynb index b713ae1a..251baf7b 100644 --- a/doc/examples/py_double_ml_pension.ipynb +++ b/doc/examples/py_double_ml_pension.ipynb @@ -94,23 +94,6 @@ "data = fetch_401K(return_type='DataFrame')" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "853ba4be", - "metadata": {}, - "outputs": [], - "source": [ - "# Temporary fix for https://github.com/DoubleML/doubleml-docs/issues/45 / https://github.com/scikit-learn/scikit-learn/issues/21997\n", - "# Can be removed when scikit-learn version 1.2.0 is released\n", - "dtypes = data.dtypes\n", - "dtypes['nifa'] = 'float64'\n", - "dtypes['net_tfa'] = 'float64'\n", - "dtypes['tw'] = 'float64'\n", - "dtypes['inc'] = 'float64'\n", - "data = data.astype(dtypes)" - ] - }, { "cell_type": "code", "execution_count": null, @@ -1179,7 +1162,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.2" + "version": "3.12.4" }, "vscode": { "interpreter": { diff --git a/doc/examples/py_double_ml_rdflex.ipynb b/doc/examples/py_double_ml_rdflex.ipynb index d01b17ac..c7b5edb3 100644 --- a/doc/examples/py_double_ml_rdflex.ipynb +++ b/doc/examples/py_double_ml_rdflex.ipynb @@ -232,7 +232,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "It is visible that the flexible adjustment decreases the standard error in the estimation and therefore provides tighter confidence intervals. For coverage simulations, see the [DoubleML Coverage Repository](https://docs.doubleml.org/doubleml-coverage/dev/rdd/rdd.html).\n", + "It is visible that the flexible adjustment decreases the standard error in the estimation and therefore provides tighter confidence intervals. For coverage simulations, see the [DoubleML Coverage Repository](https://docs.doubleml.org/doubleml-coverage/rdd/rdd.html).\n", "\n", "`RDFlex` uses an iterative fitting approach to determine a preliminary bandwidth selections for the local adjustments. The default number of iterations is `n_iterations=2`, according to [Noack, Olma and Rothe (2024)](https://arxiv.org/abs/2107.07942)." ] diff --git a/doc/guide/guide.rst b/doc/guide/guide.rst index 10f0a830..2c2566cb 100644 --- a/doc/guide/guide.rst +++ b/doc/guide/guide.rst @@ -2,7 +2,7 @@ :parenttoc: True -User guide +User Guide ========== .. toctree:: diff --git a/doc/guide/heterogeneity.rst b/doc/guide/heterogeneity.rst index 12db4f71..a7cfcd85 100644 --- a/doc/guide/heterogeneity.rst +++ b/doc/guide/heterogeneity.rst @@ -345,7 +345,7 @@ Estimation is conducted via its ``fit()`` method: np.random.seed(3141) ml_g = RandomForestClassifier(n_estimators=100, max_features=20, max_depth=10, min_samples_leaf=2) ml_m = RandomForestClassifier(n_estimators=100, max_features=20, max_depth=10, min_samples_leaf=2) - data = make_iivm_data(theta=0.5, n_obs=1000, dim_x=20, return_type='DataFrame') + data = make_iivm_data(theta=0.5, n_obs=2000, dim_x=20, return_type='DataFrame') obj_dml_data = dml.DoubleMLData(data, 'y', 'd', z_cols='z') dml_lpq_obj = dml.DoubleMLLPQ(obj_dml_data, ml_g, ml_m, treatment=1, quantile=0.5) dml_lpq_obj.fit().summary diff --git a/doc/guide/sensitivity/apo_sensitivity.rst b/doc/guide/sensitivity/apo_sensitivity.rst index ff227228..ce49927d 100644 --- a/doc/guide/sensitivity/apo_sensitivity.rst +++ b/doc/guide/sensitivity/apo_sensitivity.rst @@ -14,6 +14,7 @@ This implies the following representations \alpha(W) &= \frac{1\lbrace D = d\rbrace }{m(X)}\cdot\mathbb{E}[\omega(Y,D,X)|X]. .. note:: + In the :ref:`irm-model` the form and interpretation of ``cf_y`` only depends on the conditional expectation :math:`\mathbb{E}[Y|D,X]`. - ``cf_y`` has the interpretation as the *nonparametric partial* :math:`R^2` *of* :math:`A` *with* :math:`Y` *given* :math:`(D,X)` @@ -37,6 +38,7 @@ This implies the following representations \frac{\mathbb{E}\left[\frac{1}{P(D=d|X,A)}\mathbb{E}[\omega(Y,D,X)|X,A]^2\right] - \mathbb{E}\left[\frac{1}{P(D=d|X)}\mathbb{E}[\omega(Y,D,X)|X]^2\right]}{\mathbb{E}\left[\frac{1}{P(D=d|X,A)}\mathbb{E}[\omega(Y,D,X)|X,A]^2\right]} which has a interpretation as the *relative weighted change in inverse propensity weights*. + The ``nuisance_elements`` are then computed with plug-in versions according to the general :ref:`sensitivity_implementation`. The default weights are set to one @@ -50,4 +52,4 @@ whereas \bar{\omega}(X) := \mathbb{E}[\omega(Y,D,X)|X], -have to be supplied for weights which depend on :math:`Y` or :math:`D`. \ No newline at end of file +have to be supplied for weights which depend on :math:`Y` or :math:`D`. diff --git a/doc/guide/sensitivity/implementation.rst b/doc/guide/sensitivity/implementation.rst index 725314d7..459df56b 100644 --- a/doc/guide/sensitivity/implementation.rst +++ b/doc/guide/sensitivity/implementation.rst @@ -92,7 +92,7 @@ The robustness value $RVa$ defined analogous, but additionally incorporates stat To obtain a more complete overview over the sensitivity one can call the ``sensitivity_plot()`` method. The methods creates a contour plot, which calculates estimate of the upper or lower bound for :math:`\theta` (based on the null hypothesis) for each combination of ``cf_y`` and ``cf_d`` in a grid of values. -.. figure:: ../_static/sensitivity_example_nb.png +.. figure:: /_static/sensitivity_example_nb.png :alt: Contour plot :figclass: captioned-image diff --git a/doc/guide/sensitivity/irm_sensitivity.rst b/doc/guide/sensitivity/irm_sensitivity.rst index cda81463..126a51a0 100644 --- a/doc/guide/sensitivity/irm_sensitivity.rst +++ b/doc/guide/sensitivity/irm_sensitivity.rst @@ -15,6 +15,7 @@ This implies the following representations .. note:: + In the :ref:`irm-model` with for the ATE (weights equal to :math:`1`), the form and interpretation of ``cf_y`` is the same as in the :ref:`plr-model`. - ``cf_y`` has the interpretation as the *nonparametric partial* :math:`R^2` *of* :math:`A` *with* :math:`Y` *given* :math:`(D,X)` @@ -50,6 +51,7 @@ This implies the following representations \frac{\mathbb{E}\left[\frac{\mathbb{E}[\omega(Y,D,X)|X,A]^2}{P(D=1|X,A)(1-P(D=1|X,A))}\right] - \mathbb{E}\left[\frac{\mathbb{E}[\omega(Y,D,X)|X]^2}{P(D=1|X)(1-P(D=1|X))}\right]}{\mathbb{E}\left[\frac{\mathbb{E}[\omega(Y,D,X)|X,A]^2}{P(D=1|X,A)(1-P(D=1|X,A))}\right]} which has a interpretation as the *relative weighted gain in average conditional precision*. + The ``nuisance_elements`` are then computed with plug-in versions according to the general :ref:`sensitivity_implementation`. For ``score='ATE'``, the weights are set to one @@ -67,4 +69,4 @@ such that .. math:: - \mathbb{E}[\omega(Y,D,X)|X] = \frac{m(X)}{\mathbb{E}[D]}. \ No newline at end of file + \mathbb{E}[\omega(Y,D,X)|X] = \frac{m(X)}{\mathbb{E}[D]}. diff --git a/doc/guide/sim_inf.rst b/doc/guide/sim_inf.rst deleted file mode 100644 index 1cdf507e..00000000 --- a/doc/guide/sim_inf.rst +++ /dev/null @@ -1,139 +0,0 @@ -.. _sim_inf: - -Confidence bands and multiplier bootstrap for valid simultaneous inference ---------------------------------------------------------------------------- - -:ref:`DoubleML ` provides methods to perform valid simultaneous inference for multiple treatment variables. -As an example, consider a PLR with :math:`p_1` causal parameters of interest :math:`\theta_{0,1}, \ldots, \theta_{0,p_1}` associated with -treatment variables :math:`D_1, \ldots, D_{p_1}`. Inference on multiple target coefficients can be performed by iteratively applying the DML inference procedure over the target variables of -interests: Each of the coefficients of interest, :math:`\theta_{0,j}`, with :math:`j \in \lbrace 1, \ldots, p_1 \rbrace`, solves a corresponding moment condition - -.. math:: - - \mathbb{E}[ \psi_j(W; \theta_{0,j}, \eta_{0,j})] = 0. - -Analogously to the case with a single parameter of interest, the PLR model with multiple treatment variables includes two regression steps to achieve orthogonality. -First, the main regression is given by - -.. math:: - - Y = D_j \theta_{0,j} + g_{0,j}([D_k, X]) + \zeta_j, \quad \mathbb{E}(\zeta_j | D, X) = 0, - -with :math:`[D_k, X]` being a matrix comprising the confounders, :math:`X`, and all remaining treatment variables -:math:`D_k` with :math:`k \in \lbrace 1, \ldots, p_1\rbrace \setminus j`, by default. -Second, the relationship between the treatment variable :math:`D_j` and the remaining explanatory variables is determined by the equation - -.. math:: - - D_j = m_{0,j}([D_k, X]) + V_j, \quad \mathbb{E}(V_j | D_k, X) = 0, - -For further details, we refer to Belloni et al. (2018). Simultaneous inference can be based on a multiplier bootstrap procedure introduced in Chernozhukov et al. (2013, 2014). -Alternatively, traditional correction approaches, for example the Bonferroni correction, can be used to adjust p-values. - -Multiplier bootstrap and joint confidence intervals -+++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -The ``bootstrap()`` method provides an implementation of a multiplier bootstrap for double machine learning models. -For :math:`b=1, \ldots, B` weights :math:`\xi_{i, b}` are generated according to a normal (Gaussian) bootstrap, wild -bootstrap or exponential bootstrap. -The number of bootstrap samples is provided as input ``n_rep_boot`` and for ``method`` one can choose ``'Bayes'``, -``'normal'`` or ``'wild'``. -Based on the estimates of the standard errors :math:`\hat{\sigma}_j` -and :math:`\hat{J}_{0,j} = \mathbb{E}_N(\psi_{a,j}(W; \eta_{0,j}))` -that are obtained from DML, we construct bootstrap coefficients -:math:`\theta^{*,b}_j` and bootstrap t-statistics :math:`t^{*,b}_j` -for :math:`j=1, \ldots, p_1` - -.. math:: - - \theta^{*,b}_{j} &= \frac{1}{\sqrt{N} \hat{J}_{0,j}}\sum_{k=1}^{K} \sum_{i \in I_k} \xi_{i}^b \cdot \psi_j(W_i; \tilde{\theta}_{0,j}, \hat{\eta}_{0,j;k}), - - t^{*,b}_{j} &= \frac{1}{\sqrt{N} \hat{J}_{0,j} \hat{\sigma}_{j}} \sum_{k=1}^{K} \sum_{i \in I_k} \xi_{i}^b \cdot \psi_j(W_i; \tilde{\theta}_{0,j}, \hat{\eta}_{0,j;k}). - -The output of the multiplier bootstrap can be used to determine the constant, :math:`c_{1-\alpha}` that is required for the construction of a -simultaneous :math:`(1-\alpha)` confidence band - -.. math:: - - \left[\tilde\theta_{0,j} \pm c_{1-\alpha} \cdot \hat\sigma_j/\sqrt{N} \right]. - -To demonstrate the bootstrap, we simulate data from a sparse partially linear regression model. -Then we estimate the PLR model and perform the multiplier bootstrap. -Joint confidence intervals based on the multiplier bootstrap are then obtained by setting the option ``joint`` -when calling the method ``confint``. - -Moreover, a multiple hypotheses testing adjustment of p-values from a high-dimensional model can be obtained with -the method ``p_adjust``. :ref:`DoubleML ` performs a version of the Romano-Wolf stepdown adjustment, -which is based on the multiplier bootstrap, by default. Alternatively, ``p_adjust`` allows users to apply traditional corrections -via the option ``method``. - -.. tab-set:: - - .. tab-item:: Python - :sync: py - - .. ipython:: python - - import doubleml as dml - import numpy as np - from sklearn.base import clone - from sklearn.linear_model import LassoCV - - # Simulate data - np.random.seed(1234) - n_obs = 500 - n_vars = 100 - X = np.random.normal(size=(n_obs, n_vars)) - theta = np.array([3., 3., 3.]) - y = np.dot(X[:, :3], theta) + np.random.standard_normal(size=(n_obs,)) - - dml_data = dml.DoubleMLData.from_arrays(X[:, 10:], y, X[:, :10]) - - learner = LassoCV() - ml_l = clone(learner) - ml_m = clone(learner) - dml_plr = dml.DoubleMLPLR(dml_data, ml_l, ml_m) - - print(dml_plr.fit().bootstrap().confint(joint=True)) - print(dml_plr.p_adjust()) - print(dml_plr.p_adjust(method='bonferroni')) - - .. tab-item:: R - :sync: r - - .. jupyter-execute:: - - library(DoubleML) - library(mlr3) - library(mlr3learners) - library(data.table) - lgr::get_logger("mlr3")$set_threshold("warn") - - set.seed(3141) - n_obs = 500 - n_vars = 100 - theta = rep(3, 3) - X = matrix(stats::rnorm(n_obs * n_vars), nrow = n_obs, ncol = n_vars) - y = X[, 1:3, drop = FALSE] %*% theta + stats::rnorm(n_obs) - dml_data = double_ml_data_from_matrix(X = X[, 11:n_vars], y = y, d = X[,1:10]) - - learner = lrn("regr.cv_glmnet", s="lambda.min") - ml_l = learner$clone() - ml_m = learner$clone() - dml_plr = DoubleMLPLR$new(dml_data, ml_l, ml_m) - - dml_plr$fit() - dml_plr$bootstrap() - dml_plr$confint(joint=TRUE) - dml_plr$p_adjust() - dml_plr$p_adjust(method="bonferroni") - - -References -++++++++++ - -* Belloni, A., Chernozhukov, V., Chetverikov, D., Wei, Y. (2018), Uniformly valid post-regularization confidence regions for many functional parameters in z-estimation framework. The Annals of Statistics, 46 (6B): 3643-75, `doi: 10.1214/17-AOS1671 `_. - -* Chernozhukov, V., Chetverikov, D., Kato, K. (2013). Gaussian approximations and multiplier bootstrap for maxima of sums of high-dimensional random vectors. The Annals of Statistics 41 (6): 2786-2819, `doi: 10.1214/13-AOS1161 `_. - -* Chernozhukov, V., Chetverikov, D., Kato, K. (2014), Gaussian approximation of suprema of empirical processes. The Annals of Statistics 42 (4): 1564-97, `doi: 10.1214/14-AOS1230 `_. diff --git a/doc/index.rst b/doc/index.rst index 7d1a5f50..e54b41a3 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -126,9 +126,9 @@ ecosystem `_ (Lang et a :hidden: Install - Getting started + Getting Started Workflow - User guide + User Guide Examples Python API R API diff --git a/doc/intro/intro.rst b/doc/intro/intro.rst index 9828c189..b87397d1 100644 --- a/doc/intro/intro.rst +++ b/doc/intro/intro.rst @@ -2,7 +2,7 @@ .. _intro: -Getting started +Getting Started =============== The purpose of the following case-studies is to demonstrate the core functionalities of diff --git a/doc/literature/literature.rst b/doc/literature/literature.rst index 5bbb0e74..03c18ec1 100644 --- a/doc/literature/literature.rst +++ b/doc/literature/literature.rst @@ -1,6 +1,6 @@ :parenttoc: True -Double machine learning literature +Double Machine Learning Literature ================================== .. grid:: 1 diff --git a/doc/release/release.rst b/doc/release/release.rst index c6b4d5d9..5123ebb9 100644 --- a/doc/release/release.rst +++ b/doc/release/release.rst @@ -1,6 +1,6 @@ :parenttoc: True -Release notes +Release Notes ============= .. tab-set:: @@ -12,23 +12,23 @@ Release notes :open: - Fix / adapted unit tests which failed in the release of 0.9.2 to conda-forge - `#208 `_ + `Docs #208 `_ .. dropdown:: DoubleML 0.9.2 :class-title: sd-bg-primary sd-font-weight-bold :open: - Make `rdrobust` optional for conda. Create `pyproject.toml` and remove `setup.py` for packaging - `#285 `_ - `#286 `_ + `Py #285 `_ + `Py #286 `_ - Maintenance package - `#284 `_ + `Py #284 `_ - Maintenance doccumentation - `#205 `_ - `#206 `_ - `#207 `_ + `Docs #205 `_ + `Docs #206 `_ + `Docs #207 `_ .. dropdown:: DoubleML 0.9.1 :class-title: sd-bg-primary sd-font-weight-bold @@ -37,202 +37,202 @@ Release notes - **Release highlight:** Regression Discontinuity Designs with Flexible Covariate Adjustment via ``RDFlex`` class (in cooperation with `Claudia Noack `_ and `Tomasz Olma `_; see `their paper `_) - `#276 `_ + `Py #276 `_ - Add ``cov_type=HC0`` and enable key-worded arguments to ``DoubleMLBLP`` - `#270 `_ - `#271 `_ + `Py #270 `_ + `Py #271 `_ - Update User Guide and Example Gallery - `#204 `_ + `Docs #204 `_ - Add AutoML example for tuning DoubleML estimators - `#199 `_ + `Docs #199 `_ - Maintenance package - `#268 `_ - `#278 `_ - `#279 `_ - `#281 `_ - `#282 `_ + `Py #268 `_ + `Py #278 `_ + `Py #279 `_ + `Py #281 `_ + `Py #282 `_ - Maintenance documentation - `#201 `_ - `#203 `_ + `Docs #201 `_ + `Docs #203 `_ .. dropdown:: DoubleML 0.9.0 :class-title: sd-bg-primary sd-font-weight-bold - **Release highlight:** Average potential outcomes for multiple discrete treatments via ``DoubleMLAPO`` and ``DoubleMLAPOS`` classes (proposed by `Apoorva Lal `_) - `#245 `_ - `#250 `_ + `Py #245 `_ + `Py #250 `_ - Update User Guide and Example Gallery - `#188 `_ - `#195 `_ + `Docs #188 `_ + `Docs #195 `_ - Add sensitivity analysis to ``DoubleMLFramework`` - `#249 `_ + `Py #249 `_ - Maintenance package - `#264 `_ - `#265 `_ - `#266 `_ + `Py #264 `_ + `Py #265 `_ + `Py #266 `_ - Maintenance documentation - `#182 `_ - `#184 `_ - `#186 `_ - `#193 `_ - `#194 `_ - `#196 `_ - `#197 `_ + `Docs #182 `_ + `Docs #184 `_ + `Docs #186 `_ + `Docs #193 `_ + `Docs #194 `_ + `Docs #196 `_ + `Docs #197 `_ .. dropdown:: DoubleML 0.8.2 :class-title: sd-bg-primary sd-font-weight-bold - **API Update**: Change nuisance evaluation for classifiers. The corresponding properties are renamed ``nuisance_loss`` instead of ``rmses``. - `#254 `_ - `#184 `_ + `Py #254 `_ + `Docs #184 `_ - Add new example on sensitivity analysis - `#190 `_ + `Docs #190 `_ - Add a new example on DiD with DoubleML in R - `#178 `_ + `Docs #178 `_ - Enable ``set_sample_splitting`` for cluster data - `#255 `_ + `Py #255 `_ - Update the ``make_confounded_irm_data`` data generating process - `#263 `_ + `Py #263 `_ - Maintenance package - `#264 `_ + `Py #264 `_ - Maintenance documentation - `#177 `_ - `#180 `_ - `#181 `_ - `#187 `_ - `#189 `_ + `Docs #177 `_ + `Docs #180 `_ + `Docs #181 `_ + `Docs #187 `_ + `Docs #189 `_ .. dropdown:: DoubleML 0.8.1 :class-title: sd-bg-primary sd-font-weight-bold - Increment package requirements and update workflows for python 3.9 (add tests for python 3.12) - `#247 `_ - `#175 `_ + `Py #247 `_ + `Docs #175 `_ - Additional example for ranking treatment effects (by `Apoorva Lal `_) - `#173 `_ - `#174 `_ + `Docs #173 `_ + `Docs #174 `_ - Maintenance documentation - `#172 `_ + `Docs #172 `_ .. dropdown:: DoubleML 0.8.0 :class-title: sd-bg-primary sd-font-weight-bold - **Release highlight:** Sample-selections models as ``DoubleMLSMM`` class (by `Michaela Kecskésová `_) - `#231 `_ - `#235 `_ - `#171 `_ + `Py #231 `_ + `Py #235 `_ + `Docs #171 `_ - **API change:** Remove options ``apply_crossfitting`` and ``dml_procedure`` from the ``DoubleML`` class - `#227 `_ - `#166 `_ + `Py #227 `_ + `Docs #166 `_ - Restructure the package to improve readability and maintainability - `#225 `_ + `Py #225 `_ - Add a ``DoubleMLFramework`` class to combine multiple DoubleML models (aggregation of estimates, boostrap and CI-procedures) - `#226 `_ - `#169 `_ + `Py #226 `_ + `Docs #169 `_ - Enable the use of external predictions for short models in benchmarks (by `Lucien `_) - `#238 `_ - `#239 `_ + `Py #238 `_ + `Py #239 `_ - Add the ``gain_statistics`` to ``utils`` to sensitivity analysis - `#229 `_ + `Py #229 `_ - Maintenance documentation - `#162 `_ - `#163 `_ - `#164 `_ - `#165 `_ - `#167 `_ - `#168 `_ + `Docs #162 `_ + `Docs #163 `_ + `Docs #164 `_ + `Docs #165 `_ + `Docs #167 `_ + `Docs #168 `_ - Maintenance package - `#225 `_ - `#229 `_ - `#246 `_ + `Py #225 `_ + `Py #229 `_ + `Py #246 `_ .. dropdown:: DoubleML 0.7.1 :class-title: sd-bg-primary sd-font-weight-bold - **Release highlight:** Add weights to ``DoubleMLIRM`` class to extend sensitivity to GATEs etc. - `#220 `_ - `#229 `_ - `#155 `_ - `#161 `_ + `Py #220 `_ + `Py #229 `_ + `Docs #155 `_ + `Docs #161 `_ - Extend GATE and CATE estimation to the ``DoubleMLPLR`` class - `#220 `_ - `#155 `_ + `Py #220 `_ + `Docs #155 `_ - Enable the use of external predictions for ``DoubleML`` classes - `#221 `_ - `#159 `_ + `Py #221 `_ + `Docs #159 `_ - Implementing utility classes and functions (gain statistics and dummy learners) - `#221 `_ - `#222 `_ - `#229 `_ - `#161 `_ + `Py #221 `_ + `Py #222 `_ + `Py #229 `_ + `Docs #161 `_ - Extend example Gallery - `#153 `_ - `#158 `_ - `#161 `_ + `Docs #153 `_ + `Docs #158 `_ + `Docs #161 `_ - Maintenance documentation - `#157 `_ - `#160 `_ + `Docs #157 `_ + `Docs #160 `_ - Maintenance package - `#223 `_ - `#224 `_ + `Py #223 `_ + `Py #224 `_ .. dropdown:: DoubleML 0.7.0 :class-title: sd-bg-primary sd-font-weight-bold - **Release highlight:** Benchmarking for Sensitivity Analysis (omitted variable bias) - `#211 `_ + `Py #211 `_ - Policy tree estimation for the ``DoubleMLIRM`` class - `#212 `_ + `Py #212 `_ - Extending sensitivity and policy tree documentation in User Guide and Example Gallery - `#148 `_ - `#150 `_ + `Docs #148 `_ + `Docs #150 `_ - The package requirements are set to python 3.8 or higher - `#211 `_ + `Py #211 `_ - Maintenance documentation - `#149 `_ + `Docs #149 `_ - Maintenance package - `#213 `_ + `Py #213 `_ .. dropdown:: DoubleML 0.6.3 :class-title: sd-bg-primary sd-font-weight-bold - Fix install requirements for 0.6.2 - `#208 `_ + `Py #208 `_ .. dropdown:: DoubleML 0.6.2 :class-title: sd-bg-primary sd-font-weight-bold - **Release highlight:** Sensitivity Analysis (omitted variable bias) for - `#201 `_ + `Py #201 `_ - ``DoubleMLPLR`` - ``DoubleMLIRM`` @@ -240,46 +240,46 @@ Release notes - ``DoubleMLDIDCS`` - Updated documentation - `#144 `_ - `#141 `_ + `Docs #144 `_ + `Docs #141 `_ - Extend the guide with sensitivity and add further examples - `#142 `_ + `Docs #142 `_ - Maintenance package - `#202 `_ - `#206 `_ + `Py #202 `_ + `Py #206 `_ - Maintenance documentation - `#137 `_ - `#138 `_ - `#140 `_ - `#143 `_ - `#145 `_ - `#146 `_ + `Docs #137 `_ + `Docs #138 `_ + `Docs #140 `_ + `Docs #143 `_ + `Docs #145 `_ + `Docs #146 `_ .. dropdown:: DoubleML 0.6.1 :class-title: sd-bg-primary sd-font-weight-bold - **Release highlight:** Difference-in-differences models for ATTE estimation - `#200 `_ - `#194 `_ + `Py #200 `_ + `Py #194 `_ - Panel data ``DoubleMLDID`` - Repeated cross sections ``DoubleMLDIDCS`` - Add a potential time variable to ``DoubleMLData`` (until now only used in ``DoubleMLDIDCS``) - `#200 `_ + `Py #200 `_ - Extend the guide in the documentation and add further examples - `#132 `_ - `#133 `_ - `#135 `_ + `Docs #132 `_ + `Docs #133 `_ + `Docs #135 `_ - Maintenance - `#199 `_ - `#134 `_ - `#136 `_ + `Py #199 `_ + `Docs #134 `_ + `Docs #136 `_ .. dropdown:: DoubleML 0.6.0 :class-title: sd-bg-primary sd-font-weight-bold @@ -287,13 +287,13 @@ Release notes - **Release highlight:** Heterogeneous treatment effects (GATE, CATE, Quantile effects, ...) - Add out-of-sample RMSE and targets for nuisance elements and implement nuisance estimation evaluation via ``evaluate_learners()``. - `#182 `_ - `#188 `_ + `Py #182 `_ + `Py #188 `_ - Implement ``gate()`` and ``cate()`` methods for ``DoubleMLIRM`` class. Both are based on the new ``DoubleMLBLP`` class. - `#169 `_ + `Py #169 `_ - Implement different type of quantile models - `#179 `_ + `Py #179 `_ - Potential quantiles (PQ) in class ``DoubleMLPQ`` - Local potential quantiles (LPQ) in class ``DoubleMLLPQ`` @@ -301,134 +301,134 @@ Release notes - Quantile treatment effects (QTE) in class ``DoubleMLQTE`` - Extend clustering to nonlinear scores - `#190 `_ + `Py #190 `_ - Add ``ipw_normalization`` option to ``DoubleMLIRM`` and ``DoubleMLIIVM`` - `#186 `_ + `Py #186 `_ - Implement an abstract base class for data backends - `#173 `_ + `Py #173 `_ - Extend the guide in the documentation and add further examples - `#116 `_ - `#125 `_ - `#126 `_ + `Docs #116 `_ + `Docs #125 `_ + `Docs #126 `_ - Code refactorings, bug fixes, docu updates, unit test extensions and continuous integration - `#183 `_ - `#192 `_ - `#195 `_ - `#196 `_ + `Py #183 `_ + `Py #192 `_ + `Py #195 `_ + `Py #196 `_ - Change License to BSD 3-Clause - `#198 `_ + `Py #198 `_ - Maintenance - `#174 `_ - `#178 `_ - `#181 `_ + `Py #174 `_ + `Py #178 `_ + `Py #181 `_ .. dropdown:: DoubleML 0.5.2 :class-title: sd-bg-primary sd-font-weight-bold - Fix / adapted unit tests which failed in the release of 0.5.1 to conda-forge - `#172 `_ + `Py #172 `_ .. dropdown:: DoubleML 0.5.1 :class-title: sd-bg-primary sd-font-weight-bold - Store estimated models for nuisance parameters - `#159 `_ + `Py #159 `_ - Bug fix: Overwrite for tune method (introduced for depreciation warning) did not return the tune result - `#160 `_ - `#162 `_ + `Py #160 `_ + `Py #162 `_ - Maintenance - `#166 `_ - `#167 `_ - `#168 `_ - `#170 `_ + `Py #166 `_ + `Py #167 `_ + `Py #168 `_ + `Py #170 `_ .. dropdown:: DoubleML 0.5.0 :class-title: sd-bg-primary sd-font-weight-bold - Implement a new score function ``score = 'IV-type'`` for the PLIV model (for details see - `#151 `_) |br| + `Py #151 `_) |br| --> **API change** from ``DoubleMLPLIV(obj_dml_data, ml_g, ml_m, ml_r [, ...])`` to ``DoubleMLPLIV(obj_dml_data, ml_g, ml_m, ml_r, ml_g [, ...])`` - Adapt the nuisance estimation for the ``'IV-type'`` score for the PLR model (for details see - `#151 `_) |br| + `Py #151 `_) |br| --> **API change** from ``DoubleMLPLR(obj_dml_data, ml_g, ml_m [, ...])`` to ``DoubleMLPLR(obj_dml_data, ml_l, ml_m, ml_g [, ...])`` - Allow the usage of classifiers for binary outcome variables in the model classes IRM and IIVM - `#134 `_ + `Py #134 `_ - **Published in JMLR: DoubleML - An Object-Oriented Implementation of Double Machine Learning in Python** (citation - info updated in `#138 `_) + info updated in `Py #138 `_) - Maintenance - `#143 `_ - `#148 `_ - `#149 `_ - `#152 `_ - `#153 `_ + `Py #143 `_ + `Py #148 `_ + `Py #149 `_ + `Py #152 `_ + `Py #153 `_ .. dropdown:: DoubleML 0.4.1 :class-title: sd-bg-primary sd-font-weight-bold - - We added `Contribution Guidelines `_, + - We added `Python Contribution Guidelines `_, issue templates, a pull request template and a - `discussion forum `_ to the Python package repository - `#132 `_ + `Python discussion forum `_ to the Python package repository + `Py #132 `_ - Code refactorings, docu updates, unit test extensions and continuous integration - `#126 `_ - `#127 `_ - `#128 `_ - `#130 `_ - `#131 `_ + `Py #126 `_ + `Py #127 `_ + `Py #128 `_ + `Py #130 `_ + `Py #131 `_ .. dropdown:: DoubleML 0.4.0 :class-title: sd-bg-primary sd-font-weight-bold - **Release highlight:** Clustered standard errors for double machine learning models - `#116 `_ + `Py #116 `_ - Improve exception handling for missings and infinite values in the confounders, predictions, etc. - (fixes `#120 `_ by allowing null confounder values) - `#122 `_ + (fixes `Py #120 `_ by allowing null confounder values) + `Py #122 `_ - Clean up dev requirements and use dev requirements on github actions - `#121 `_ + `Py #121 `_ - Other updates - `#123 `_ + `Py #123 `_ .. dropdown:: DoubleML 0.3.0 :class-title: sd-bg-primary sd-font-weight-bold - Always use the same bootstrap algorithm independent of ``dml1`` vs ``dml2`` and consistent with docu and paper - `#101 `_ & - `#102 `_ + `Py #101 `_ & + `Py #102 `_ - Added an exception handling to assure that an IV variable is specified when using a PLIV or IIVM model - `#107 `_ + `Py #107 `_ - Improve exception handling for externally provided sample splitting - `#110 `_ + `Py #110 `_ - Minor update of the str representation of ``DoubleMLData`` objects - `#112 `_ + `Py #112 `_ - Code refactorings and unit test extensions - `#103 `_, - `#105 `_, - `#106 `_, - `#111 `_ & - `#113 `_ + `Py #103 `_, + `Py #105 `_, + `Py #106 `_, + `Py #111 `_ & + `Py #113 `_ .. dropdown:: DoubleML 0.2.2 :class-title: sd-bg-primary sd-font-weight-bold - IIVM model: Added a subgroups option to adapt to cases with and without the subgroups of always-takers and - never-takers (`#96 `_). + never-takers (`Py #96 `_). - Add checks for the intersections of ``y_col``, ``d_cols``, ``x_cols``, ``z_cols`` - (`#84 `_, - `#97 `_). - This also fixes `#83 `_ (with intersection + (`Py #84 `_, + `Py #97 `_). + This also fixes `Py #83 `_ (with intersection between ``x_cols`` and ``d_cols`` a column could have been added multiple times to the covariate matrix). - Added checks and exception handling for duplicate entries in ``d_cols``, ``x_cols`` or ``z_cols`` - (`#100 `_). + (`Py #100 `_). - Check the datatype of ``data`` when initializing ``DoubleMLData`` objects. Also check for duplicate column names - (`#100 `_). - - Fix bug `#95 `_ - in `#97 `_: It occurred when ``x_cols`` where inferred via + (`Py #100 `_). + - Fix bug `Py #95 `_ + in `Py #97 `_: It occurred when ``x_cols`` where inferred via setdiff and ``y_col`` was a string with multiple characters. - We updated the citation info to refer to the arXiv paper - (`#98 `_): + (`Py #98 `_): Bach, P., Chernozhukov, V., Kurz, M. S., and Spindler, M. (2021), DoubleML - An Object-Oriented Implementation of Double Machine Learning in Python, `arXiv:2104.03220 `_. @@ -436,46 +436,46 @@ Release notes :class-title: sd-bg-primary sd-font-weight-bold - Provide an option to store & export the first-stage predictions - `#91 `_ + `Py #91 `_ - Added the package logo to the doc .. dropdown:: DoubleML 0.2.0 :class-title: sd-bg-primary sd-font-weight-bold - Major extensions of the unit test framework which result in a coverage >98% (a summary is given in - `#82 `_) + `Py #82 `_) - In the PLR one can now also specify classifiers for ``ml_m`` in case of a binary treatment variable with values 0 - and 1 (see `#86 `_ for details) + and 1 (see `Py #86 `_ for details) - The joint Python and R docu and user guide is now served to `https://docs.doubleml.org `_ from a separate repo `https://github.com/DoubleML/doubleml-docs `_ - Generate and upload a unit test coverage report to codecov `https://app.codecov.io/gh/DoubleML/doubleml-for-py `_ - `#76 `_ - - Run lint checks with flake8 `#78 `_, align code with PEP8 - standards `#79 `_, activate code quality checks at codacy - `#80 `_ + `Py #76 `_ + - Run lint checks with flake8 `Py #78 `_, align code with PEP8 + standards `Py #79 `_, activate code quality checks at codacy + `Py #80 `_ - Refactoring (reduce code redundancy) of the code for tuning of the ML learners used for approximation the - nuisance functions `#81 `_ + nuisance functions `Py #81 `_ - Minor updates, bug fixes and improvements of the exception handling - (contained in `#82 `_ & - `#89 `_) + (contained in `Py #82 `_ & + `Py #89 `_) .. dropdown:: DoubleML 0.1.2 :class-title: sd-bg-primary sd-font-weight-bold - Fixed a compatibility issue with ``scikit-learn`` 0.24, which only affected some unit tests - (`#70 `_, `#71 `_) - - Added scheduled unit tests on github-action (three times a week) `#69 `_ + (`Py #70 `_, `Py #71 `_) + - Added scheduled unit tests on github-action (three times a week) `Py #69 `_ - Split up estimation of nuisance functions and computation of score function components. Further introduced a - private method ``_est_causal_pars_and_se()``, see `#72 `_. + private method ``_est_causal_pars_and_se()``, see `Py #72 `_. This is needed for the DoubleML-Serverless project: https://github.com/DoubleML/doubleml-serverless. .. dropdown:: DoubleML 0.1.1 :class-title: sd-bg-primary sd-font-weight-bold - Bug fix in the drawing of bootstrap weights for the multiple treatment case - `#66 `_ (see also https://github.com/DoubleML/doubleml-for-r/pull/28) + `Py #66 `_ (see also https://github.com/DoubleML/doubleml-for-r/pull/28) - Update install instructions as DoubleML is now listed on pypi - Prepare submission to conda-forge: Include LICENSE file in source distribution - Documentation is now served with HTTPS `https://docs.doubleml.org/ `_ @@ -504,165 +504,166 @@ Release notes :open: - Maintenance (upcoming breaking changes from ``paradox`` package), thanks to new contributor Martin Binder `@mb706 `_ - `# 195 `_ - `# 198 `_ + `R #195 `_ + `R #198 `_ .. dropdown:: DoubleML 1.0.0 :class-title: sd-bg-primary sd-font-weight-bold :open: - Update citation info to publication in Journal of Statistical Software, rename helper function and fix links and GH actions - `191 `_ + `R #191 `_ .. dropdown:: DoubleML 0.5.3 :class-title: sd-bg-primary sd-font-weight-bold + - Add documentation for estimated models for nuisance parameters - `#181 `_ + `R #181 `_ - New contributor `@SvenKlaassen `_ - Maintenance - `#179 `_ + `R #179 `_ .. dropdown:: DoubleML 0.5.2 :class-title: sd-bg-primary sd-font-weight-bold - Store estimated models for nuisance parameters - `#169 `_ + `R #169 `_ - New maintainer of the CRAN package DoubleML `@PhilippBach `_ - Maintenance - `#170 `_ - `#173 `_ - `#174 `_ - `#177 `_ - `#178 `_ + `R #170 `_ + `R #173 `_ + `R #174 `_ + `R #177 `_ + `R #178 `_ .. dropdown:: DoubleML 0.5.1 :class-title: sd-bg-primary sd-font-weight-bold - Fix a CRAN issue (html checks) by regenerating ``.Rd``-files with the newest version of ``roxygen2``. - `#166 `_ - `#167 `_ - `#168 `_ + `R #166 `_ + `R #167 `_ + `R #168 `_ .. dropdown:: DoubleML 0.5.0 :class-title: sd-bg-primary sd-font-weight-bold - Implement a new score function ``score = 'IV-type'`` for the PLIV model (for details see - `#161 `_) |br| + `R #161 `_) |br| --> **API change** from ``DoubleMLPLIV$new(obj_dml_data, ml_g, ml_m, ml_r [, ...])`` to ``DoubleMLPLIV$new(obj_dml_data, ml_g, ml_m, ml_r, ml_g [, ...])`` - Adapt the nuisance estimation for the ``'IV-type'`` score for the PLR model (for details see - `#161 `_) |br| + `R #161 `_) |br| --> **API change** from ``DoubleMLPLR$new(obj_dml_data, ml_g, ml_m [, ...])`` to ``DoubleMLPLR$new(obj_dml_data, ml_l, ml_m, ml_g [, ...])`` - Use ``task_type`` instead of ``learner_class`` to identify whether a learner is meant to regress or classify (this change makes it possible to easily integrate pipelines from ``mlr3pipelines`` as learner for the nuisance functions) - `#141 `_ - - Add `Contribution Guidelines `_, + `R #141 `_ + - Add `R Contribution Guidelines `_, issue templates, a pull request template and a - `discussion forum `_ to the R package repository - `#142 `_ - `#146 `_ - `#147 `_ + `R discussion forum `_ to the R package repository + `R #142 `_ + `R #146 `_ + `R #147 `_ - Allow the usage of classifiers for binary outcome variables in the model classes IRM and IIVM - `#114 `_ + `R #114 `_ - Bug fixes and maintenance - `#155 `_ - `#156 `_ - `#157 `_ - `#158 `_ - `#160 `_ - `#163 `_ + `R #155 `_ + `R #156 `_ + `R #157 `_ + `R #158 `_ + `R #160 `_ + `R #163 `_ .. dropdown:: DoubleML 0.4.1 :class-title: sd-bg-primary sd-font-weight-bold - Prevent usage of ``glmnet`` learner for unit testing as recommended by CRAN (failing tests on Solaris) - `#137 `_ + `R #137 `_ - Prepare for the upcoming release of ``checkmate`` which is not backward compatible with our unit tests - `#134 `_ + `R #134 `_ .. dropdown:: DoubleML 0.4.0 :class-title: sd-bg-primary sd-font-weight-bold - **Release highlight:** Clustered standard errors for double machine learning models - `#119 `_ + `R #119 `_ - Apply styler as described in the wiki (https://github.com/DoubleML/doubleml-for-r/wiki/Style-Guidelines) and add a - corresponding CI on github actions `#120 `_ - `#122 `_ + corresponding CI on github actions `R #120 `_ + `R #122 `_ - Other refactoring, bug fixes and documentation updates - `#127 `_ - `#129 `_ - `#130 `_ - `#131 `_ - `#132 `_ - `#133 `_ + `R #127 `_ + `R #129 `_ + `R #130 `_ + `R #131 `_ + `R #132 `_ + `R #133 `_ .. dropdown:: DoubleML 0.3.1 :class-title: sd-bg-primary sd-font-weight-bold - Initialize all numeric matrices, vectors and arrays with the correct data type by using ``NA_real_`` instead of - ``NA`` and replace a ``print()`` call with ``cat()`` `#115 `_ + ``NA`` and replace a ``print()`` call with ``cat()`` `R #115 `_ .. dropdown:: DoubleML 0.3.0 :class-title: sd-bg-primary sd-font-weight-bold - Use active bindings in the R6 OOP implementation - `#106 `_ & - `#93 `_ + `R #106 `_ & + `R #93 `_ - Fix the aggregation formula for standard errors from repeated cross-fitting - `#94 `_ & - `#95 `_ + `R #94 `_ & + `R #95 `_ - Always use the same bootstrap algorithm independent of ``dml1`` vs ``dml2`` and consistent with docu and paper - `#98 `_ & - `#99 `_ + `R #98 `_ & + `R #99 `_ - Initialize predictions with NA and make sure that there are no misleading entries in the evaluated score - functions `#96 `_ & - `#105 `_ + functions `R #96 `_ & + `R #105 `_ - Avoid overriding learner parameters during tuning - `#83 `_ & - `#84 `_ + `R #83 `_ & + `R #84 `_ - Fixes in the exception handling and extension of the unit tests for the score function choice - `#82 `_ + `R #82 `_ - Prevent overwriting parameters from initialization when calling set_ml_nuisance_params - `#87 `_ & - `#89 `_ + `R #87 `_ & + `R #89 `_ - Major refactoring and cleanup and extension of the unit test framework - `#101 `_ + `R #101 `_ - Extension and reorganization of exception handling for ``DoubleMLData`` objects - `#63 `_ & - `#90 `_ + `R #63 `_ & + `R #90 `_ - Introduce style guide and clean up code - `#80 `_ & - `#81 `_ + `R #80 `_ & + `R #81 `_ - Adaption to be compatible with an API change in the next ``mlr3`` release - `#103 `_ + `R #103 `_ - Run unit tests with mlr3 in dev version on github actions - `#104 `_ + `R #104 `_ - Updated the citation info - `#78 `_, - `#79 `_ & - `#86 `_ + `R #78 `_, + `R #79 `_ & + `R #86 `_ - Added a short version of and a reference to the arXiv paper as vignette - `#110 `_ & - `#113 `_ + `R #110 `_ & + `R #113 `_ - Prevent using the subclassed methods check_score and check_data when constructing DoubleML objects - `#107 `_ + `R #107 `_ - Other refactoring and minor adaptions - `#91 `_, - `#92 `_, - `#102 `_ & - `#108 `_ + `R #91 `_, + `R #92 `_, + `R #102 `_ & + `R #108 `_ .. dropdown:: DoubleML 0.2.1 :class-title: sd-bg-primary sd-font-weight-bold - Provide an option to store & export the first-stage predictions - `#74 `_ + `R #74 `_ - Reduce and refine messaging to the console during estimation - `#72 `_ + `R #72 `_ - Fix bug in IIVM model if the IV variable is not named ``z`` - `#75 `_ - - Fix failing unit test `#71 `_ + `R #75 `_ + - Fix failing unit test `R #71 `_ - Added the package logo to the doc .. dropdown:: DoubleML 0.2.0 @@ -672,14 +673,14 @@ Release notes - Major refactoring of core-parts of the estimation and tuning of the ML estimators for the nuisance functions: All models now use central helper functions ``dml_cv_predict()`` and ``dml_tune()`` - Extensions to the unit test framework to improve upon test coverage - Added unit test coverage via codecov: `https://app.codecov.io/gh/DoubleML/doubleml-for-r `_ - - Minor docu updates and adaptions: `#58 `_, `#61 `_ & `#70 `_ + - Minor docu updates and adaptions: `R #58 `_, `R #61 `_ & `R #70 `_ .. dropdown:: DoubleML 0.1.2 :class-title: sd-bg-primary sd-font-weight-bold - - Adapt calls to ``mlr3tuning`` due to a change in their API (since version 0.6.0): fixes `#51 `_ - - Add ``bbotk`` to suggests: fixes R CMD check note `#47 `_ - - Use ``doi{}`` command: fixes R CMD check note `#54 `_ + - Adapt calls to ``mlr3tuning`` due to a change in their API (since version 0.6.0): fixes `R #51 `_ + - Add ``bbotk`` to suggests: fixes R CMD check note `R #47 `_ + - Use ``doi{}`` command: fixes R CMD check note `R #54 `_ - Minor docu updates as ``DoubleML`` is now available on CRAN .. dropdown:: DoubleML 0.1.1 diff --git a/requirements.txt b/requirements.txt index 03e69cec..ec8c13b2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,15 +5,16 @@ pytest rpy2 # doc -sphinx==7.3.7 +sphinx==8.1.3 sphinx-copybutton -nbsphinx==0.9.3 +nbsphinx==0.9.6 ipykernel sphinx-gallery sphinx-panels sphinx-design jupyter-sphinx -pydata-sphinx-theme==0.15.3 +pydata-sphinx-theme==0.15.4 +pickleshare matplotlib plotly seaborn