From b0a1dddb27a3ba6628f00c06118904cf2a8a3df6 Mon Sep 17 00:00:00 2001 From: Hadrien Mariaccia Date: Tue, 5 Mar 2024 12:03:34 +0100 Subject: [PATCH 01/33] add random_state to scikit_learn functions --- src/med_bench/utils/nuisances.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/med_bench/utils/nuisances.py b/src/med_bench/utils/nuisances.py index fd23c90..05fbb85 100644 --- a/src/med_bench/utils/nuisances.py +++ b/src/med_bench/utils/nuisances.py @@ -81,7 +81,7 @@ def _get_classifier(regularization, forest, calibration, random_state=42): clf = RandomForestClassifier(random_state=random_state, n_estimators=100, min_samples_leaf=10) if calibration in {"sigmoid", "isotonic"}: - clf = CalibratedClassifierCV(clf, method=calibration) + clf = CalibratedClassifierCV(clf, method=calibration, random_state=random_state) return clf @@ -97,9 +97,9 @@ def _get_regressor(regularization, forest, random_state=42): _, alphas = _get_regularization_parameters(regularization) if not forest: - reg = RidgeCV(alphas=alphas, cv=CV_FOLDS) + reg = RidgeCV(alphas=alphas, cv=CV_FOLDS, random_state=random_state) else: - reg = RandomForestRegressor(n_estimators=100, min_samples_leaf=10) + reg = RandomForestRegressor(n_estimators=100, min_samples_leaf=10, random_state=random_state) return reg From ab6e72148b341304b2c6fa00eb99afe2d862f75d Mon Sep 17 00:00:00 2001 From: Hadrien Mariaccia Date: Tue, 5 Mar 2024 12:10:05 +0100 Subject: [PATCH 02/33] remove unexpected random_state --- src/med_bench/utils/nuisances.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/med_bench/utils/nuisances.py b/src/med_bench/utils/nuisances.py index 05fbb85..98bee8a 100644 --- a/src/med_bench/utils/nuisances.py +++ b/src/med_bench/utils/nuisances.py @@ -81,7 +81,7 @@ def _get_classifier(regularization, forest, calibration, random_state=42): clf = RandomForestClassifier(random_state=random_state, n_estimators=100, min_samples_leaf=10) if calibration in {"sigmoid", "isotonic"}: - clf = CalibratedClassifierCV(clf, method=calibration, random_state=random_state) + clf = CalibratedClassifierCV(clf, method=calibration) return clf @@ -97,7 +97,7 @@ def _get_regressor(regularization, forest, random_state=42): _, alphas = _get_regularization_parameters(regularization) if not forest: - reg = RidgeCV(alphas=alphas, cv=CV_FOLDS, random_state=random_state) + reg = RidgeCV(alphas=alphas, cv=CV_FOLDS) else: reg = RandomForestRegressor(n_estimators=100, min_samples_leaf=10, random_state=random_state) From edd684fb546e9d2e836484ab529bb4ff775773dd Mon Sep 17 00:00:00 2001 From: Hadrien Mariaccia Date: Mon, 18 Mar 2024 18:58:00 +0100 Subject: [PATCH 03/33] add DS_STORE in gitignore file --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index b6e4761..834d0a8 100644 --- a/.gitignore +++ b/.gitignore @@ -127,3 +127,7 @@ dmypy.json # Pyre type checker .pyre/ + +# DS_STORE files +src/.DS_Store +.DS_Store From 5eaef73a3a88a0c2bc40423a41fd5a5f3c0aca22 Mon Sep 17 00:00:00 2001 From: Hadrien Mariaccia Date: Mon, 18 Mar 2024 18:59:13 +0100 Subject: [PATCH 04/33] force pandas version to 1.2.1 - add pytest to setup file --- setup.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ca61aa1..ed1af7d 100644 --- a/setup.py +++ b/setup.py @@ -17,13 +17,14 @@ ), package_dir={"": "src"}, install_requires=[ - 'pandas>=1.2.1', + 'pandas==1.2.1', 'scikit-learn>=0.22.1', 'numpy>=1.19.2', 'rpy2>=2.9.4', 'scipy>=1.5.2', 'seaborn>=0.11.1', - 'matplotlib>=3.3.2' + 'matplotlib>=3.3.2', + "pytest" ], classifiers=[ 'Programming Language :: Python :: 3', From 84f8922371e07e199df5a4e3bba2e6c26b367468 Mon Sep 17 00:00:00 2001 From: Hadrien Mariaccia Date: Mon, 18 Mar 2024 19:00:12 +0100 Subject: [PATCH 05/33] add generate_tests_results.py and tests_results.npy files --- .../estimation/generate_tests_results.py | 58 ++++++++++++++++++ src/tests/estimation/tests_results.npy | Bin 0 -> 378964 bytes 2 files changed, 58 insertions(+) create mode 100644 src/tests/estimation/generate_tests_results.py create mode 100644 src/tests/estimation/tests_results.npy diff --git a/src/tests/estimation/generate_tests_results.py b/src/tests/estimation/generate_tests_results.py new file mode 100644 index 0000000..34c7b25 --- /dev/null +++ b/src/tests/estimation/generate_tests_results.py @@ -0,0 +1,58 @@ + +import numpy as np + +from med_bench.get_simulated_data import simulate_data +from med_bench.get_estimation import get_estimation + +from med_bench.utils.constants import ESTIMATORS, PARAMETER_LIST, PARAMETER_NAME + + +def get_data_from_list(data): + x = data[0] + t = data[1].ravel() + m = data[2] + y = data[3].ravel() + + return x, t, m, y + + +def get_config_from_dict(dict_params): + if dict_params["dim_m"] == 1 and dict_params["type_m"] == "binary": + config = 0 + else: + config = 5 + return config + + +def get_estimators_results(x, t, m, y, config, estimator): + + try: + res = get_estimation(x, t, m, y, estimator, config)[0:5] + return res + + except Exception as e: + print(f"{e}") + return str(e) + + +if __name__ == "__main__": + + results = [] + + for param_list in PARAMETER_LIST: + + # Get synthetic input data from parameters list defined above + dict_params = dict(zip(PARAMETER_NAME, param_list)) + data = simulate_data(**dict_params) + x, t, m, y = get_data_from_list(data) + config = get_config_from_dict(dict_params=dict_params) + + for estimator in ESTIMATORS: + + # Get results from synthetic inputs + result = get_estimators_results(x, t, m, y, config, estimator) + row = [estimator, x, t, m, y, config, result] + results.append(row) + + # Store the results in a npy file + np.save("tests_results.npy", np.array(results, dtype="object")) diff --git a/src/tests/estimation/tests_results.npy b/src/tests/estimation/tests_results.npy new file mode 100644 index 0000000000000000000000000000000000000000..274ec8863bc332ab0c377f043db81de059213e58 GIT binary patch literal 378964 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%0Ai|JXw%w8SrzD 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

BT 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
vh0*@wZ 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�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

NS&kWEFfc6ccc79t8$n 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

o{~9sA^zK0 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�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 literal 0 HcmV?d00001 From 2b8a7bcf13dba59dea439815644fed9c58754c4b Mon Sep 17 00:00:00 2001 From: Hadrien Mariaccia Date: Mon, 18 Mar 2024 19:00:40 +0100 Subject: [PATCH 06/33] add constants file --- src/med_bench/utils/constants.py | 190 +++++++++++++++++++++++++++++++ 1 file changed, 190 insertions(+) create mode 100644 src/med_bench/utils/constants.py diff --git a/src/med_bench/utils/constants.py b/src/med_bench/utils/constants.py new file mode 100644 index 0000000..c625ea5 --- /dev/null +++ b/src/med_bench/utils/constants.py @@ -0,0 +1,190 @@ +import itertools +import os +import numpy as np +from numpy.random import default_rng + +# CONSTANTS USED FOR TESTS + +# TOLERANCE THRESHOLDS + +SMALL_ATE_TOLERANCE = 0.05 +SMALL_DIRECT_TOLERANCE = 0.05 +SMALL_INDIRECT_TOLERANCE = 0.2 + +MEDIUM_ATE_TOLERANCE = 0.10 +MEDIUM_DIRECT_TOLERANCE = 0.10 +MEDIUM_INDIRECT_TOLERANCE = 0.4 + +LARGE_ATE_TOLERANCE = 0.15 +LARGE_DIRECT_TOLERANCE = 0.15 +LARGE_INDIRECT_TOLERANCE = 0.8 +# indirect effect is weak, leading to a large relative error + +SMALL_TOLERANCE = np.array( + [ + SMALL_ATE_TOLERANCE, + SMALL_DIRECT_TOLERANCE, + SMALL_DIRECT_TOLERANCE, + SMALL_INDIRECT_TOLERANCE, + SMALL_INDIRECT_TOLERANCE, + ] +) + +MEDIUM_TOLERANCE = np.array( + [ + MEDIUM_ATE_TOLERANCE, + MEDIUM_DIRECT_TOLERANCE, + MEDIUM_DIRECT_TOLERANCE, + MEDIUM_INDIRECT_TOLERANCE, + MEDIUM_INDIRECT_TOLERANCE, + ] +) + +LARGE_TOLERANCE = np.array( + [ + LARGE_ATE_TOLERANCE, + LARGE_DIRECT_TOLERANCE, + LARGE_DIRECT_TOLERANCE, + LARGE_INDIRECT_TOLERANCE, + LARGE_INDIRECT_TOLERANCE, + ] +) + +INFINITE_TOLERANCE = np.array( + [ + np.inf, + np.inf, + np.inf, + np.inf, + np.inf, + ] +) + +TOLERANCE_DICT = { + "coefficient_product": LARGE_TOLERANCE, + "mediation_ipw_noreg": INFINITE_TOLERANCE, + "mediation_ipw_reg": INFINITE_TOLERANCE, + "mediation_ipw_reg_calibration": INFINITE_TOLERANCE, + "mediation_ipw_forest": INFINITE_TOLERANCE, + "mediation_ipw_forest_calibration": INFINITE_TOLERANCE, + "mediation_g_computation_noreg": LARGE_TOLERANCE, + "mediation_g_computation_reg": MEDIUM_TOLERANCE, + "mediation_g_computation_reg_calibration": LARGE_TOLERANCE, + "mediation_g_computation_forest": LARGE_TOLERANCE, + "mediation_g_computation_forest_calibration": INFINITE_TOLERANCE, + "mediation_multiply_robust_noreg": INFINITE_TOLERANCE, + "mediation_multiply_robust_reg": LARGE_TOLERANCE, + "mediation_multiply_robust_reg_calibration": LARGE_TOLERANCE, + "mediation_multiply_robust_forest": INFINITE_TOLERANCE, + "mediation_multiply_robust_forest_calibration": LARGE_TOLERANCE, + "simulation_based": LARGE_TOLERANCE, + "mediation_DML": INFINITE_TOLERANCE, + "mediation_DML_reg_fixed_seed": INFINITE_TOLERANCE, + "mediation_g_estimator": SMALL_TOLERANCE, + "mediation_ipw_noreg_cf": INFINITE_TOLERANCE, + "mediation_ipw_reg_cf": INFINITE_TOLERANCE, + "mediation_ipw_reg_calibration_cf": INFINITE_TOLERANCE, + "mediation_ipw_forest_cf": INFINITE_TOLERANCE, + "mediation_ipw_forest_calibration_cf": INFINITE_TOLERANCE, + "mediation_g_computation_noreg_cf": SMALL_TOLERANCE, + "mediation_g_computation_reg_cf": LARGE_TOLERANCE, + "mediation_g_computation_reg_calibration_cf": LARGE_TOLERANCE, + "mediation_g_computation_forest_cf": INFINITE_TOLERANCE, + "mediation_g_computation_forest_calibration_cf": LARGE_TOLERANCE, + "mediation_multiply_robust_noreg_cf": MEDIUM_TOLERANCE, + "mediation_multiply_robust_reg_cf": LARGE_TOLERANCE, + "mediation_multiply_robust_reg_calibration_cf": MEDIUM_TOLERANCE, + "mediation_multiply_robust_forest_cf": INFINITE_TOLERANCE, + "mediation_multiply_robust_forest_calibration_cf": INFINITE_TOLERANCE, +} + +ESTIMATORS = [ + "coefficient_product", + "mediation_ipw_noreg", + "mediation_ipw_reg", + "mediation_ipw_reg_calibration", + "mediation_ipw_forest", + "mediation_ipw_forest_calibration", + "mediation_g_computation_noreg", + "mediation_g_computation_reg", + "mediation_g_computation_reg_calibration", + "mediation_g_computation_forest", + "mediation_g_computation_forest_calibration", + "mediation_multiply_robust_noreg", + "mediation_multiply_robust_reg", + "mediation_multiply_robust_reg_calibration", + "mediation_multiply_robust_forest", + "mediation_multiply_robust_forest_calibration", + "simulation_based", + "mediation_DML", + "mediation_DML_reg_fixed_seed", + "mediation_g_estimator", + "mediation_ipw_noreg_cf", + "mediation_ipw_reg_cf", + "mediation_ipw_reg_calibration_cf", + "mediation_ipw_forest_cf", + "mediation_ipw_forest_calibration_cf", + "mediation_g_computation_noreg_cf", + "mediation_g_computation_reg_cf", + "mediation_g_computation_reg_calibration_cf", + "mediation_g_computation_forest_cf", + "mediation_g_computation_forest_calibration_cf", + "mediation_multiply_robust_noreg_cf", + "mediation_multiply_robust_reg_cf", + "mediation_multiply_robust_reg_calibration_cf", + "mediation_multiply_robust_forest_cf", + "mediation_multiply_robust_forest_calibration_cf", +] + +# PARAMETERS VALUES FOR DATA GENERATION + +PARAMETER_NAME = [ + "n", + "rg", + "mis_spec_m", + "mis_spec_y", + "dim_x", + "dim_m", + "seed", + "type_m", + "sigma_y", + "sigma_m", + "beta_t_factor", + "beta_m_factor", +] + +PARAMETER_LIST = list( + itertools.product( + [1000], + [default_rng(321)], + [False], + [False], + [1, 5], + [1], + [123], + ["binary"], + [0.5], + [0.5], + [0.5], + [0.5], + ) +) + +PARAMETER_LIST.extend( + list( + itertools.product( + [1000], + [default_rng(321)], + [False], + [False], + [1, 5], + [1, 5], + [123], + ["continuous"], + [0.5], + [0.5], + [0.5], + [0.5], + ) + ) +) From 43bc76d0f829cd073f4ddc3e7a4edaba317a9c04 Mon Sep 17 00:00:00 2001 From: Hadrien Mariaccia Date: Mon, 18 Mar 2024 19:01:43 +0100 Subject: [PATCH 07/33] get rid of unused imports --- src/med_bench/get_estimation.py | 7 +-- src/med_bench/mediation.py | 54 ++++++++----------- src/med_bench/utils/nuisances.py | 31 +++++------ src/med_bench/utils/utils.py | 7 ++- .../simulate_data/test_get_simulated_data.py | 36 +------------ 5 files changed, 42 insertions(+), 93 deletions(-) diff --git a/src/med_bench/get_estimation.py b/src/med_bench/get_estimation.py index c2cf396..64f01ec 100644 --- a/src/med_bench/get_estimation.py +++ b/src/med_bench/get_estimation.py @@ -1,12 +1,8 @@ #!/usr/bin/env python # -*- coding:utf-8 -*- - -import time -import sys -from rpy2.rinterface_lib.embedded import RRuntimeError -import pandas as pd import numpy as np + from .mediation import ( mediation_IPW, mediation_coefficient_product, @@ -18,6 +14,7 @@ r_mediate, ) + def get_estimation(x, t, m, y, estimator, config): """Wrapper estimator fonction ; calls an estimator given mediation data in order to estimate total, direct, and indirect effects. diff --git a/src/med_bench/mediation.py b/src/med_bench/mediation.py index 9175ea5..af9bb48 100644 --- a/src/med_bench/mediation.py +++ b/src/med_bench/mediation.py @@ -10,17 +10,10 @@ import pandas as pd import rpy2.robjects as robjects import rpy2.robjects.packages as rpackages -from numpy.random import default_rng from rpy2.robjects import numpy2ri, pandas2ri -from scipy import stats -from scipy.special import expit -from scipy.stats import bernoulli from sklearn.base import clone -from sklearn.calibration import CalibratedClassifierCV -from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor -from sklearn.linear_model import LassoCV, LogisticRegressionCV, RidgeCV -from sklearn.model_selection import KFold -from sklearn.preprocessing import PolynomialFeatures +from sklearn.linear_model import RidgeCV + from .utils.nuisances import (_estimate_conditional_mean_outcome, _estimate_cross_conditional_mean_outcome, @@ -136,12 +129,12 @@ def mediation_IPW(y, t, m, x, trim, regularization=True, forest=False, y0m1 = np.sum(y * (1 - t) * p_xm / ((1 - p_xm) * p_x)) /\ np.sum((1 - t) * p_xm / ((1 - p_xm) * p_x)) - return(y1m1 - y0m0, - y1m1 - y0m1, - y1m0 - y0m0, - y1m1 - y1m0, - y0m1 - y0m0, - np.sum(ind)) + return [y1m1 - y0m0, + y1m1 - y0m1, + y1m0 - y0m0, + y1m1 - y1m0, + y0m1 - y0m0, + np.sum(ind)] def mediation_coefficient_product(y, t, m, x, interaction=False, @@ -523,28 +516,28 @@ def mediation_multiply_robust(y, t, m, x, interaction=False, forest=False, y0m0 = (((1 - t) / (1 - p_x) * (y - E_mu_t0_t0)) / sum_score_m0 + E_mu_t0_t0) y1m0 = ( - ((t / p_x) * (f_m0x / f_m1x) * (y - mu_1mx)) / sum_score_t1m0 - + ((1 - t) / (1 - p_x) * (mu_1mx - E_mu_t1_t0)) / sum_score_m0 - + E_mu_t1_t0 + ((t / p_x) * (f_m0x / f_m1x) * (y - mu_1mx)) / sum_score_t1m0 + + ((1 - t) / (1 - p_x) * (mu_1mx - E_mu_t1_t0)) / sum_score_m0 + + E_mu_t1_t0 ) y0m1 = ( - ((1 - t) / (1 - p_x) * (f_m1x / f_m0x) * (y - mu_0mx)) - / sum_score_t0m1 + t / p_x * ( - mu_0mx - E_mu_t0_t1) / sum_score_m1 - + E_mu_t0_t1 + ((1 - t) / (1 - p_x) * (f_m1x / f_m0x) * (y - mu_0mx)) + / sum_score_t0m1 + t / p_x * ( + mu_0mx - E_mu_t0_t1) / sum_score_m1 + + E_mu_t0_t1 ) else: y1m1 = t / p_x * (y - E_mu_t1_t1) + E_mu_t1_t1 y0m0 = (1 - t) / (1 - p_x) * (y - E_mu_t0_t0) + E_mu_t0_t0 y1m0 = ( - (t / p_x) * (f_m0x / f_m1x) * (y - mu_1mx) - + (1 - t) / (1 - p_x) * (mu_1mx - E_mu_t1_t0) - + E_mu_t1_t0 + (t / p_x) * (f_m0x / f_m1x) * (y - mu_1mx) + + (1 - t) / (1 - p_x) * (mu_1mx - E_mu_t1_t0) + + E_mu_t1_t0 ) y0m1 = ( - (1 - t) / (1 - p_x) * (f_m1x / f_m0x) * (y - mu_0mx) - + t / p_x * (mu_0mx - E_mu_t0_t1) - + E_mu_t0_t1 + (1 - t) / (1 - p_x) * (f_m1x / f_m0x) * (y - mu_0mx) + + t / p_x * (mu_0mx - E_mu_t0_t1) + + E_mu_t0_t1 ) # effects computing @@ -554,7 +547,7 @@ def mediation_multiply_robust(y, t, m, x, interaction=False, forest=False, indirect1 = np.mean(y1m1 - y1m0) indirect0 = np.mean(y0m1 - y0m0) - return total, direct1, direct0, indirect1, indirect0, n_discarded + return [total, direct1, direct0, indirect1, indirect0, n_discarded] def r_mediate(y, t, m, x, interaction=False): @@ -807,7 +800,6 @@ def mediation_DML(y, t, m, x, forest=False, crossfit=0, trim=0.05, nobs = 0 - var_name = [ "p_x", "p_xm", @@ -892,4 +884,4 @@ def mediation_DML(y, t, m, x, forest=False, crossfit=0, trim=0.05, direct0 = my1m0 - my0m0 indirect1 = my1m1 - my1m0 indirect0 = my0m1 - my0m0 - return total, direct1, direct0, indirect1, indirect0, n - nobs \ No newline at end of file + return [total, direct1, direct0, indirect1, indirect0, n - nobs] diff --git a/src/med_bench/utils/nuisances.py b/src/med_bench/utils/nuisances.py index 98bee8a..d740296 100644 --- a/src/med_bench/utils/nuisances.py +++ b/src/med_bench/utils/nuisances.py @@ -3,19 +3,13 @@ used in mediation estimators in causal inference """ import numpy as np -import pandas as pd -from numpy.random import default_rng -from scipy import stats -from scipy.special import expit -from scipy.stats import bernoulli from sklearn.base import clone from sklearn.calibration import CalibratedClassifierCV from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor -from sklearn.linear_model import LassoCV, LogisticRegressionCV, RidgeCV +from sklearn.linear_model import LogisticRegressionCV, RidgeCV from sklearn.model_selection import KFold -from sklearn.preprocessing import PolynomialFeatures -from .utils import _convert_array_to_R, _get_interactions +from .utils import _get_interactions ALPHAS = np.logspace(-5, 5, 8) CV_FOLDS = 5 @@ -99,7 +93,8 @@ def _get_regressor(regularization, forest, random_state=42): if not forest: reg = RidgeCV(alphas=alphas, cv=CV_FOLDS) else: - reg = RandomForestRegressor(n_estimators=100, min_samples_leaf=10, random_state=random_state) + reg = RandomForestRegressor( + n_estimators=100, min_samples_leaf=10, random_state=random_state) return reg @@ -191,7 +186,7 @@ def _estimate_mediator_density(t, m, x, y, crossfit, clf_m, interaction): # f_mtx model fitting clf_m = clf_m.fit(t_x[train_index, :], m[train_index]) - #clf_m = clf_m.fit(t_x[train_index, :], m.ravel()[train_index]) + # clf_m = clf_m.fit(t_x[train_index, :], m.ravel()[train_index]) # predict f(M=m|T=t,X) fm_0 = clf_m.predict_proba(t0_x[test_index, :]) @@ -364,12 +359,12 @@ def _estimate_cross_conditional_mean_outcome(t, m, x, y, crossfit, reg_y, # predict E[E[Y|T=1,M=m,X]|T=t,X] E_mu_t1_t0[test_index] = ( - reg_y_t1m0_t0.predict(x[test_index, :]) * f_00x[test_index] - + reg_y_t1m1_t0.predict(x[test_index, :]) * f_01x[test_index] + reg_y_t1m0_t0.predict(x[test_index, :]) * f_00x[test_index] + + reg_y_t1m1_t0.predict(x[test_index, :]) * f_01x[test_index] ) E_mu_t1_t1[test_index] = ( - reg_y_t1m0_t1.predict(x[test_index, :]) * f_10x[test_index] - + reg_y_t1m1_t1.predict(x[test_index, :]) * f_11x[test_index] + reg_y_t1m0_t1.predict(x[test_index, :]) * f_10x[test_index] + + reg_y_t1m1_t1.predict(x[test_index, :]) * f_11x[test_index] ) # E[E[Y|T=0,M=m,X]|T=t,X] model fitting @@ -388,12 +383,12 @@ def _estimate_cross_conditional_mean_outcome(t, m, x, y, crossfit, reg_y, # predict E[E[Y|T=0,M=m,X]|T=t,X] E_mu_t0_t0[test_index] = ( - reg_y_t0m0_t0.predict(x[test_index, :]) * f_00x[test_index] - + reg_y_t0m1_t0.predict(x[test_index, :]) * f_01x[test_index] + reg_y_t0m0_t0.predict(x[test_index, :]) * f_00x[test_index] + + reg_y_t0m1_t0.predict(x[test_index, :]) * f_01x[test_index] ) E_mu_t0_t1[test_index] = ( - reg_y_t0m0_t1.predict(x[test_index, :]) * f_10x[test_index] - + reg_y_t0m1_t1.predict(x[test_index, :]) * f_11x[test_index] + reg_y_t0m0_t1.predict(x[test_index, :]) * f_10x[test_index] + + reg_y_t0m1_t1.predict(x[test_index, :]) * f_11x[test_index] ) return mu_0mx, mu_1mx, E_mu_t0_t0, E_mu_t0_t1, E_mu_t1_t0, E_mu_t1_t1 diff --git a/src/med_bench/utils/utils.py b/src/med_bench/utils/utils.py index 23ea3e7..4cd78b8 100644 --- a/src/med_bench/utils/utils.py +++ b/src/med_bench/utils/utils.py @@ -1,8 +1,6 @@ import numpy as np - import rpy2.robjects as robjects -import rpy2.robjects.packages as rpackages -from rpy2.robjects import pandas2ri, numpy2ri + def _get_interactions(interaction, *args): """ @@ -41,7 +39,7 @@ def _get_interactions(interaction, *args): variables = list(args) for index, var in enumerate(variables): if len(var.shape) == 1: - variables[index] = var.reshape(-1,1) + variables[index] = var.reshape(-1, 1) pre_inter_variables = np.hstack(variables) if not interaction: return pre_inter_variables @@ -55,6 +53,7 @@ def _get_interactions(interaction, *args): result = np.hstack((pre_inter_variables, new_vars)) return result + def _convert_array_to_R(x): """ converts a numpy array to a R matrix or vector diff --git a/src/tests/simulate_data/test_get_simulated_data.py b/src/tests/simulate_data/test_get_simulated_data.py index e13f4d8..b7e066f 100644 --- a/src/tests/simulate_data/test_get_simulated_data.py +++ b/src/tests/simulate_data/test_get_simulated_data.py @@ -14,45 +14,11 @@ """ from pprint import pprint -import itertools import pytest import numpy as np from numpy.random import default_rng from med_bench.get_simulated_data import simulate_data - - -PARAMETER_NAME = [ - "n", - "rg", - "mis_spec_m", - "mis_spec_y", - "dim_x", - "dim_m", - "seed", - "type_m", - "sigma_y", - "sigma_m", - "beta_t_factor", - "beta_m_factor", -] - - -PARAMETER_LIST = list( - itertools.product( - [1, 500, 1000], - [default_rng(321)], - [False, True], - [False, True], - [1, 5], - [1], - [123], - ["binary", "continuous"], - [0.5], - [0.5], - [0.5], - [0.5], - ) -) +from med_bench.utils.constants import PARAMETER_LIST, PARAMETER_NAME @pytest.fixture(params=PARAMETER_LIST) From 0badf9c984bc07e353cc3a615577c56f55c5ad6b Mon Sep 17 00:00:00 2001 From: Hadrien Mariaccia Date: Mon, 18 Mar 2024 19:02:04 +0100 Subject: [PATCH 08/33] minor reformatting --- src/med_bench/get_simulated_data.py | 83 +++++++++++++++-------------- 1 file changed, 43 insertions(+), 40 deletions(-) diff --git a/src/med_bench/get_simulated_data.py b/src/med_bench/get_simulated_data.py index 6b8eefa..b646390 100644 --- a/src/med_bench/get_simulated_data.py +++ b/src/med_bench/get_simulated_data.py @@ -1,13 +1,7 @@ import numpy as np from numpy.random import default_rng from scipy import stats -import pandas as pd -from pathlib import Path -from scipy.stats import bernoulli from scipy.special import expit -import matplotlib.pyplot as plt -import pathlib -import seaborn as sns def simulate_data(n, @@ -23,16 +17,16 @@ def simulate_data(n, beta_t_factor=1, beta_m_factor=1): """Simulate data for mediation analysis - + Parameters ---------- n: :obj:`int`, Number of samples to generate. - + rg: RandomState instance, Controls the pseudo random number generator used to generate the data at fit time. - + mis_spec_m: obj:`bool`, Whether the mediator generation is misspecified or not defaults to False @@ -40,7 +34,7 @@ def simulate_data(n, mis_spec_y: obj:`bool`, Whether the output model is misspecified or not defaults to False - + dim_x: :obj:`int`, optional, Number of covariates in the input. Defaults to 1 @@ -48,13 +42,13 @@ def simulate_data(n, dim_m: :obj:`int`, optional, Number of mediatiors to generate. Defaults to 1 - + seed: :obj:`int` or None, optional, Controls the pseudo random number generator used to generate the coefficients of the model. Pass an int for reproducible output across multiple function calls. Defaults to None - + type_m: :obj:`str`, Whether the mediator is binary or continuous Defaults to 'binary', @@ -66,7 +60,7 @@ def simulate_data(n, sigma_m :obj:`float`, noise variance on mediator Defaults to 0.5, - + beta_t_factor: :obj:`float`, scaling factor on treatment effect, Defaults to 1, @@ -74,18 +68,18 @@ def simulate_data(n, beta_m_factor: :obj:`float`, scaling factor on mediator, Defaults to 1, - + returns ------- x: ndarray of shape (n, dim_x) the simulated covariates - + t: ndarray of shape (n, 1) the simulated treatment - + m: ndarray of shape (n, dim_m) the simulated mediators - + y: ndarray of shape (n, 1) the simulated outcome @@ -137,9 +131,11 @@ def simulate_data(n, m = m_2d[np.arange(n), t[:, 0]].reshape(-1, 1) else: random_noise = sigma_m * rg.standard_normal((n, dim_m)) - m0 = x.dot(beta_x) + t0.dot(beta_t) + t0 * (x.dot(beta_xt)) + random_noise - m1 = x.dot(beta_x) + t1.dot(beta_t) + t1 * (x.dot(beta_xt)) + random_noise - m = x.dot(beta_x) + t.dot(beta_t) + t * (x.dot(beta_xt)) + random_noise + m0 = x.dot(beta_x) + t0.dot(beta_t) + t0 * \ + (x.dot(beta_xt)) + random_noise + m1 = x.dot(beta_x) + t1.dot(beta_t) + t1 * \ + (x.dot(beta_xt)) + random_noise + m = x.dot(beta_x) + t.dot(beta_t) + t * (x.dot(beta_xt)) + random_noise # generate the outcome Y gamma_m = np.ones((dim_m, 1)) * 0.5 / dim_m * beta_m_factor @@ -150,31 +146,38 @@ def simulate_data(n, else: gamma_t_m = np.zeros((dim_m, 1)) - y = x.dot(gamma_x) + gamma_t * t + m.dot(gamma_m) + m.dot(gamma_t_m) * t + sigma_y * rg.standard_normal((n, 1)) + y = x.dot(gamma_x) + gamma_t * t + m.dot(gamma_m) + \ + m.dot(gamma_t_m) * t + sigma_y * rg.standard_normal((n, 1)) # Compute differents types of effects if type_m == 'binary': theta_1 = gamma_t + gamma_t_m * np.mean(p_m1) theta_0 = gamma_t + gamma_t_m * np.mean(p_m0) - delta_1 = np.mean((p_m1 - p_m0) * (gamma_m.flatten() + gamma_t_m.dot(t1.T))) - delta_0 = np.mean((p_m1 - p_m0) * (gamma_m.flatten() + gamma_t_m.dot(t0.T))) + delta_1 = np.mean( + (p_m1 - p_m0) * (gamma_m.flatten() + gamma_t_m.dot(t1.T))) + delta_0 = np.mean( + (p_m1 - p_m0) * (gamma_m.flatten() + gamma_t_m.dot(t0.T))) else: - theta_1 = gamma_t + gamma_t_m.T.dot(np.mean(m1, axis=0)) # to do mean(m1) pour avoir un vecteur de taille dim_m + # to do mean(m1) pour avoir un vecteur de taille dim_m + theta_1 = gamma_t + gamma_t_m.T.dot(np.mean(m1, axis=0)) theta_0 = gamma_t + gamma_t_m.T.dot(np.mean(m0, axis=0)) - delta_1 = (gamma_t * t1 + m1.dot(gamma_m) + m1.dot(gamma_t_m) * t1 - (gamma_t * t1 + m0.dot(gamma_m) + m0.dot(gamma_t_m) * t1)).mean() - delta_0 = (gamma_t * t0 + m1.dot(gamma_m) + m1.dot(gamma_t_m) * t0 - (gamma_t * t0 + m0.dot(gamma_m) + m0.dot(gamma_t_m) * t0)).mean() + delta_1 = (gamma_t * t1 + m1.dot(gamma_m) + m1.dot(gamma_t_m) * t1 - + (gamma_t * t1 + m0.dot(gamma_m) + m0.dot(gamma_t_m) * t1)).mean() + delta_0 = (gamma_t * t0 + m1.dot(gamma_m) + m1.dot(gamma_t_m) * t0 - + (gamma_t * t0 + m0.dot(gamma_m) + m0.dot(gamma_t_m) * t0)).mean() if type_m == 'binary': pre_pm = np.hstack((p_m0.reshape(-1, 1), p_m1.reshape(-1, 1))) - pre_pm[m.ravel()==0, :] = 1 - pre_pm[m.ravel()==0, :] + pre_pm[m.ravel() == 0, :] = 1 - pre_pm[m.ravel() == 0, :] pm = pre_pm[:, 1].reshape(-1, 1) else: - p_m0 = np.prod(stats.norm.pdf((m - x.dot(beta_x)) - t0.dot(beta_t) - t0 * (x.dot(beta_xt)) / sigma_m), axis=1) - p_m1 = np.prod(stats.norm.pdf((m - x.dot(beta_x)) - t1.dot(beta_t) - t1 * (x.dot(beta_xt)) / sigma_m), axis=1) + p_m0 = np.prod(stats.norm.pdf((m - x.dot(beta_x)) - + t0.dot(beta_t) - t0 * (x.dot(beta_xt)) / sigma_m), axis=1) + p_m1 = np.prod(stats.norm.pdf((m - x.dot(beta_x)) - + t1.dot(beta_t) - t1 * (x.dot(beta_xt)) / sigma_m), axis=1) pre_pm = np.hstack((p_m0.reshape(-1, 1), p_m1.reshape(-1, 1))) pm = pre_pm[:, 1].reshape(-1, 1) - px = np.prod(stats.norm.pdf(x), axis=1) pre_pt = np.hstack(((1-p_t).reshape(-1, 1), p_t.reshape(-1, 1))) @@ -182,15 +185,15 @@ def simulate_data(n, denom = np.sum(pre_pm * pre_pt * double_px, axis=1) num = pm.ravel() * p_t.ravel() * px.ravel() th_p_t_mx = num.ravel() / denom - - return (x, - t, - m, - y, + + return (x, + t, + m, + y, theta_1.flatten()[0] + delta_0.flatten()[0], - theta_1.flatten()[0], - theta_0.flatten()[0], + theta_1.flatten()[0], + theta_0.flatten()[0], delta_1.flatten()[0], - delta_0.flatten()[0], - p_t, - th_p_t_mx) \ No newline at end of file + delta_0.flatten()[0], + p_t, + th_p_t_mx) From 795d35f75bc9ed3ed1339efaf3899fff490c1447 Mon Sep 17 00:00:00 2001 From: Hadrien Mariaccia Date: Mon, 18 Mar 2024 19:02:41 +0100 Subject: [PATCH 09/33] handle glmnet error in tolerance tests --- src/tests/estimation/test_get_estimation.py | 171 ++------------------ 1 file changed, 17 insertions(+), 154 deletions(-) diff --git a/src/tests/estimation/test_get_estimation.py b/src/tests/estimation/test_get_estimation.py index 395a04e..dc0a5c5 100644 --- a/src/tests/estimation/test_get_estimation.py +++ b/src/tests/estimation/test_get_estimation.py @@ -12,157 +12,12 @@ """ from pprint import pprint -import itertools import pytest import numpy as np -from numpy.random import default_rng + from med_bench.get_simulated_data import simulate_data from med_bench.get_estimation import get_estimation - - -SMALL_ATE_TOLERANCE = 0.05 -SMALL_DIRECT_TOLERANCE = 0.05 -SMALL_INDIRECT_TOLERANCE = 0.2 - -MEDIUM_ATE_TOLERANCE = 0.10 -MEDIUM_DIRECT_TOLERANCE = 0.10 -MEDIUM_INDIRECT_TOLERANCE = 0.4 - -LARGE_ATE_TOLERANCE = 0.15 -LARGE_DIRECT_TOLERANCE = 0.15 -LARGE_INDIRECT_TOLERANCE = 0.8 -# indirect effect is weak, leading to a large relative error - -SMALL_TOLERANCE = np.array( - [ - SMALL_ATE_TOLERANCE, - SMALL_DIRECT_TOLERANCE, - SMALL_DIRECT_TOLERANCE, - SMALL_INDIRECT_TOLERANCE, - SMALL_INDIRECT_TOLERANCE, - ] -) - -MEDIUM_TOLERANCE = np.array( - [ - MEDIUM_ATE_TOLERANCE, - MEDIUM_DIRECT_TOLERANCE, - MEDIUM_DIRECT_TOLERANCE, - MEDIUM_INDIRECT_TOLERANCE, - MEDIUM_INDIRECT_TOLERANCE, - ] -) - -LARGE_TOLERANCE = np.array( - [ - LARGE_ATE_TOLERANCE, - LARGE_DIRECT_TOLERANCE, - LARGE_DIRECT_TOLERANCE, - LARGE_INDIRECT_TOLERANCE, - LARGE_INDIRECT_TOLERANCE, - ] -) - -INFINITE_TOLERANCE = np.array( - [ - np.inf, - np.inf, - np.inf, - np.inf, - np.inf, - ] -) - - -TOLERANCE_DICT = { - "coefficient_product": LARGE_TOLERANCE, - "mediation_ipw_noreg": INFINITE_TOLERANCE, - "mediation_ipw_reg": INFINITE_TOLERANCE, - "mediation_ipw_reg_calibration": INFINITE_TOLERANCE, - "mediation_ipw_forest": INFINITE_TOLERANCE, - "mediation_ipw_forest_calibration": INFINITE_TOLERANCE, - "mediation_g_computation_noreg": LARGE_TOLERANCE, - "mediation_g_computation_reg": MEDIUM_TOLERANCE, - "mediation_g_computation_reg_calibration": LARGE_TOLERANCE, - "mediation_g_computation_forest": LARGE_TOLERANCE, - "mediation_g_computation_forest_calibration": INFINITE_TOLERANCE, - "mediation_multiply_robust_noreg": INFINITE_TOLERANCE, - "mediation_multiply_robust_reg": LARGE_TOLERANCE, - "mediation_multiply_robust_reg_calibration": LARGE_TOLERANCE, - "mediation_multiply_robust_forest": INFINITE_TOLERANCE, - "mediation_multiply_robust_forest_calibration": LARGE_TOLERANCE, - "simulation_based": LARGE_TOLERANCE, - "mediation_DML": INFINITE_TOLERANCE, - "mediation_DML_reg_fixed_seed": INFINITE_TOLERANCE, - "mediation_g_estimator": SMALL_TOLERANCE, - "mediation_ipw_noreg_cf": INFINITE_TOLERANCE, - "mediation_ipw_reg_cf": INFINITE_TOLERANCE, - "mediation_ipw_reg_calibration_cf": INFINITE_TOLERANCE, - "mediation_ipw_forest_cf": INFINITE_TOLERANCE, - "mediation_ipw_forest_calibration_cf": INFINITE_TOLERANCE, - "mediation_g_computation_noreg_cf": SMALL_TOLERANCE, - "mediation_g_computation_reg_cf": LARGE_TOLERANCE, - "mediation_g_computation_reg_calibration_cf": LARGE_TOLERANCE, - "mediation_g_computation_forest_cf": INFINITE_TOLERANCE, - "mediation_g_computation_forest_calibration_cf": LARGE_TOLERANCE, - "mediation_multiply_robust_noreg_cf": MEDIUM_TOLERANCE, - "mediation_multiply_robust_reg_cf": LARGE_TOLERANCE, - "mediation_multiply_robust_reg_calibration_cf": MEDIUM_TOLERANCE, - "mediation_multiply_robust_forest_cf": INFINITE_TOLERANCE, - "mediation_multiply_robust_forest_calibration_cf": INFINITE_TOLERANCE, -} - - -PARAMETER_NAME = [ - "n", - "rg", - "mis_spec_m", - "mis_spec_y", - "dim_x", - "dim_m", - "seed", - "type_m", - "sigma_y", - "sigma_m", - "beta_t_factor", - "beta_m_factor", -] - -PARAMETER_LIST = list( - itertools.product( - [1000], - [default_rng(321)], - [False], - [False], - [1, 5], - [1], - [123], - ["binary"], - [0.5], - [0.5], - [0.5], - [0.5], - ) -) - -PARAMETER_LIST.extend( - list( - itertools.product( - [1000], - [default_rng(321)], - [False], - [False], - [1, 5], - [1, 5], - [123], - ["continuous"], - [0.5], - [0.5], - [0.5], - [0.5], - ) - ) -) +from med_bench.utils.constants import PARAMETER_LIST, PARAMETER_NAME, TOLERANCE_DICT @pytest.fixture(params=PARAMETER_LIST) @@ -223,14 +78,19 @@ def effects_chap(x, t, m, y, estimator, config): # try whether estimator is implemented or not try: res = get_estimation(x, t, m, y, estimator, config)[0:5] - except ValueError as message_error: - if message_error.args[0] in ( + except Exception as e: + if str(e) in ( "Estimator only supports 1D binary mediator.", "Estimator does not support 1D binary mediator.", ): - pytest.skip(f"{message_error}") + pytest.skip(f"{e}") + + # We skip the test if an error with function from glmet rpy2 package occurs + elif "glmnet::glmnet" in str(e): + pytest.skip(f"{e}") + else: - pytest.fail(f"{message_error}") + pytest.fail(f"{e}") # NaN situations if np.all(np.isnan(res)): @@ -248,9 +108,11 @@ def test_tolerance(effects, effects_chap, tolerance): def test_total_is_direct_plus_indirect(effects_chap): if not np.isnan(effects_chap[1]): - assert effects_chap[0] == pytest.approx(effects_chap[1] + effects_chap[4]) + assert effects_chap[0] == pytest.approx( + effects_chap[1] + effects_chap[4]) if not np.isnan(effects_chap[2]): - assert effects_chap[0] == pytest.approx(effects_chap[2] + effects_chap[3]) + assert effects_chap[0] == pytest.approx( + effects_chap[2] + effects_chap[3]) @pytest.mark.xfail @@ -258,7 +120,8 @@ def test_robustness_to_ravel_format(data, estimator, config, effects_chap): if "forest" in estimator: pytest.skip("Forest estimator skipped") assert np.all( - get_estimation(data[0], data[1], data[2], data[3], estimator, config)[0:5] + get_estimation(data[0], data[1], data[2], + data[3], estimator, config)[0:5] == pytest.approx( effects_chap, nan_ok=True ) # effects_chap is obtained with data[1].ravel() and data[3].ravel() From 86afa28d997e4d630be4d26e6cbd1c77e1d5a7e8 Mon Sep 17 00:00:00 2001 From: Hadrien Mariaccia Date: Mon, 18 Mar 2024 19:03:04 +0100 Subject: [PATCH 10/33] add exact estimation tests --- src/tests/estimation/test_exact_estimation.py | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 src/tests/estimation/test_exact_estimation.py diff --git a/src/tests/estimation/test_exact_estimation.py b/src/tests/estimation/test_exact_estimation.py new file mode 100644 index 0000000..a68f0ab --- /dev/null +++ b/src/tests/estimation/test_exact_estimation.py @@ -0,0 +1,102 @@ +""" +Pytest file for get_estimation.py + +It tests all the benchmark_mediation estimators : +- for a certain tolerance +- whether their effects satisfy "total = direct + indirect" +- whether they support (n,1) and (n,) inputs + +To be robust to future updates, tests are adjusted with a smaller tolerance when possible. +The test is skipped if estimator has not been implemented yet, i.e. if ValueError is raised. +The test fails for any other unwanted behavior. +""" + +from pprint import pprint +import pytest +import os +import numpy as np + +from med_bench.get_estimation import get_estimation + +current_dir = os.path.dirname(__file__) +true_estimations_file_path = os.path.join(current_dir, 'tests_results.npy') +TRUE_ESTIMATIONS = np.load(true_estimations_file_path, allow_pickle=True) + + +@pytest.fixture(params=range(TRUE_ESTIMATIONS.shape[0])) +def tests_results_idx(request): + return request.param + + +@pytest.fixture +def data(tests_results_idx): + return TRUE_ESTIMATIONS[tests_results_idx] + + +@pytest.fixture +def estimator(data): + return data[0] + + +@pytest.fixture +def x(data): + return data[1] + + +# t is raveled because some estimators fail with (n,1) inputs +@pytest.fixture +def t(data): + return data[2].ravel() + + +@pytest.fixture +def m(data): + return data[3] + + +@pytest.fixture +def y(data): + return data[4].ravel() # same reason as t + + +@pytest.fixture +def config(data): + return data[5] + + +@pytest.fixture +def result(data): + return data[6] + + +@pytest.fixture +def effects_chap(x, t, m, y, estimator, config): + # try whether estimator is implemented or not + try: + res = get_estimation(x, t, m, y, estimator, config)[0:5] + except Exception as e: + if str(e) in ( + "Estimator only supports 1D binary mediator.", + "Estimator does not support 1D binary mediator.", + ): + pytest.skip(f"{e}") + + # We skip the test if an error with function from glmet rpy2 package occurs + elif "glmnet::glmnet" in str(e): + pytest.skip(f"{e}") + + else: + pytest.fail(f"{e}") + + # NaN situations + if np.all(np.isnan(res)): + pytest.xfail("all effects are NaN") + elif np.any(np.isnan(res)): + pprint("NaN found") + + return res + + +def test_estimation_exactness(result, effects_chap): + + assert np.all(effects_chap == pytest.approx(result)) From bab06f3ec786dd207b90ae7684eb6d026459224d Mon Sep 17 00:00:00 2001 From: Hadrien Mariaccia Date: Tue, 19 Mar 2024 10:25:32 +0100 Subject: [PATCH 11/33] use a dictionary for tolerance thresholds --- src/med_bench/utils/constants.py | 52 ++++++++++++++++---------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/med_bench/utils/constants.py b/src/med_bench/utils/constants.py index c625ea5..a4d238e 100644 --- a/src/med_bench/utils/constants.py +++ b/src/med_bench/utils/constants.py @@ -1,5 +1,4 @@ import itertools -import os import numpy as np from numpy.random import default_rng @@ -7,46 +6,47 @@ # TOLERANCE THRESHOLDS -SMALL_ATE_TOLERANCE = 0.05 -SMALL_DIRECT_TOLERANCE = 0.05 -SMALL_INDIRECT_TOLERANCE = 0.2 - -MEDIUM_ATE_TOLERANCE = 0.10 -MEDIUM_DIRECT_TOLERANCE = 0.10 -MEDIUM_INDIRECT_TOLERANCE = 0.4 +TOLERANCE_THRESHOLDS = { + "SMALL_ATE_TOLERANCE": 0.05, + "SMALL_DIRECT_TOLERANCE": 0.05, + "SMALL_INDIRECT_TOLERANCE": 0.2, + "MEDIUM_ATE_TOLERANCE": 0.10, + "MEDIUM_DIRECT_TOLERANCE": 0.10, + "MEDIUM_INDIRECT_TOLERANCE": 0.4, + "LARGE_ATE_TOLERANCE": 0.15, + "LARGE_DIRECT_TOLERANCE": 0.15, + "LARGE_INDIRECT_TOLERANCE": 0.8 +} -LARGE_ATE_TOLERANCE = 0.15 -LARGE_DIRECT_TOLERANCE = 0.15 -LARGE_INDIRECT_TOLERANCE = 0.8 # indirect effect is weak, leading to a large relative error SMALL_TOLERANCE = np.array( [ - SMALL_ATE_TOLERANCE, - SMALL_DIRECT_TOLERANCE, - SMALL_DIRECT_TOLERANCE, - SMALL_INDIRECT_TOLERANCE, - SMALL_INDIRECT_TOLERANCE, + TOLERANCE_THRESHOLDS["SMALL_ATE_TOLERANCE"], + TOLERANCE_THRESHOLDS["SMALL_DIRECT_TOLERANCE"], + TOLERANCE_THRESHOLDS["SMALL_DIRECT_TOLERANCE"], + TOLERANCE_THRESHOLDS["SMALL_INDIRECT_TOLERANCE"], + TOLERANCE_THRESHOLDS["SMALL_INDIRECT_TOLERANCE"], ] ) MEDIUM_TOLERANCE = np.array( [ - MEDIUM_ATE_TOLERANCE, - MEDIUM_DIRECT_TOLERANCE, - MEDIUM_DIRECT_TOLERANCE, - MEDIUM_INDIRECT_TOLERANCE, - MEDIUM_INDIRECT_TOLERANCE, + TOLERANCE_THRESHOLDS["MEDIUM_ATE_TOLERANCE"], + TOLERANCE_THRESHOLDS["MEDIUM_DIRECT_TOLERANCE"], + TOLERANCE_THRESHOLDS["MEDIUM_DIRECT_TOLERANCE"], + TOLERANCE_THRESHOLDS["MEDIUM_INDIRECT_TOLERANCE"], + TOLERANCE_THRESHOLDS["MEDIUM_INDIRECT_TOLERANCE"], ] ) LARGE_TOLERANCE = np.array( [ - LARGE_ATE_TOLERANCE, - LARGE_DIRECT_TOLERANCE, - LARGE_DIRECT_TOLERANCE, - LARGE_INDIRECT_TOLERANCE, - LARGE_INDIRECT_TOLERANCE, + TOLERANCE_THRESHOLDS["LARGE_ATE_TOLERANCE"], + TOLERANCE_THRESHOLDS["LARGE_DIRECT_TOLERANCE"], + TOLERANCE_THRESHOLDS["LARGE_DIRECT_TOLERANCE"], + TOLERANCE_THRESHOLDS["LARGE_INDIRECT_TOLERANCE"], + TOLERANCE_THRESHOLDS["LARGE_INDIRECT_TOLERANCE"], ] ) From 3ec2c60c2bee0b7dfa98159b300a719872702bf3 Mon Sep 17 00:00:00 2001 From: Hadrien Mariaccia Date: Tue, 19 Mar 2024 10:38:37 +0100 Subject: [PATCH 12/33] discard previous changes (tolerance threshold dict) --- src/med_bench/utils/constants.py | 52 ++++++++++++++++---------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/med_bench/utils/constants.py b/src/med_bench/utils/constants.py index a4d238e..c625ea5 100644 --- a/src/med_bench/utils/constants.py +++ b/src/med_bench/utils/constants.py @@ -1,4 +1,5 @@ import itertools +import os import numpy as np from numpy.random import default_rng @@ -6,47 +7,46 @@ # TOLERANCE THRESHOLDS -TOLERANCE_THRESHOLDS = { - "SMALL_ATE_TOLERANCE": 0.05, - "SMALL_DIRECT_TOLERANCE": 0.05, - "SMALL_INDIRECT_TOLERANCE": 0.2, - "MEDIUM_ATE_TOLERANCE": 0.10, - "MEDIUM_DIRECT_TOLERANCE": 0.10, - "MEDIUM_INDIRECT_TOLERANCE": 0.4, - "LARGE_ATE_TOLERANCE": 0.15, - "LARGE_DIRECT_TOLERANCE": 0.15, - "LARGE_INDIRECT_TOLERANCE": 0.8 -} +SMALL_ATE_TOLERANCE = 0.05 +SMALL_DIRECT_TOLERANCE = 0.05 +SMALL_INDIRECT_TOLERANCE = 0.2 + +MEDIUM_ATE_TOLERANCE = 0.10 +MEDIUM_DIRECT_TOLERANCE = 0.10 +MEDIUM_INDIRECT_TOLERANCE = 0.4 +LARGE_ATE_TOLERANCE = 0.15 +LARGE_DIRECT_TOLERANCE = 0.15 +LARGE_INDIRECT_TOLERANCE = 0.8 # indirect effect is weak, leading to a large relative error SMALL_TOLERANCE = np.array( [ - TOLERANCE_THRESHOLDS["SMALL_ATE_TOLERANCE"], - TOLERANCE_THRESHOLDS["SMALL_DIRECT_TOLERANCE"], - TOLERANCE_THRESHOLDS["SMALL_DIRECT_TOLERANCE"], - TOLERANCE_THRESHOLDS["SMALL_INDIRECT_TOLERANCE"], - TOLERANCE_THRESHOLDS["SMALL_INDIRECT_TOLERANCE"], + SMALL_ATE_TOLERANCE, + SMALL_DIRECT_TOLERANCE, + SMALL_DIRECT_TOLERANCE, + SMALL_INDIRECT_TOLERANCE, + SMALL_INDIRECT_TOLERANCE, ] ) MEDIUM_TOLERANCE = np.array( [ - TOLERANCE_THRESHOLDS["MEDIUM_ATE_TOLERANCE"], - TOLERANCE_THRESHOLDS["MEDIUM_DIRECT_TOLERANCE"], - TOLERANCE_THRESHOLDS["MEDIUM_DIRECT_TOLERANCE"], - TOLERANCE_THRESHOLDS["MEDIUM_INDIRECT_TOLERANCE"], - TOLERANCE_THRESHOLDS["MEDIUM_INDIRECT_TOLERANCE"], + MEDIUM_ATE_TOLERANCE, + MEDIUM_DIRECT_TOLERANCE, + MEDIUM_DIRECT_TOLERANCE, + MEDIUM_INDIRECT_TOLERANCE, + MEDIUM_INDIRECT_TOLERANCE, ] ) LARGE_TOLERANCE = np.array( [ - TOLERANCE_THRESHOLDS["LARGE_ATE_TOLERANCE"], - TOLERANCE_THRESHOLDS["LARGE_DIRECT_TOLERANCE"], - TOLERANCE_THRESHOLDS["LARGE_DIRECT_TOLERANCE"], - TOLERANCE_THRESHOLDS["LARGE_INDIRECT_TOLERANCE"], - TOLERANCE_THRESHOLDS["LARGE_INDIRECT_TOLERANCE"], + LARGE_ATE_TOLERANCE, + LARGE_DIRECT_TOLERANCE, + LARGE_DIRECT_TOLERANCE, + LARGE_INDIRECT_TOLERANCE, + LARGE_INDIRECT_TOLERANCE, ] ) From bab13ab441f6390ee096edf56b69ebe10ddf1138 Mon Sep 17 00:00:00 2001 From: Hadrien Mariaccia Date: Tue, 19 Mar 2024 11:09:13 +0100 Subject: [PATCH 13/33] estimators now return a tuple instead of a list --- src/med_bench/mediation.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/med_bench/mediation.py b/src/med_bench/mediation.py index af9bb48..a7a4ab0 100644 --- a/src/med_bench/mediation.py +++ b/src/med_bench/mediation.py @@ -129,12 +129,12 @@ def mediation_IPW(y, t, m, x, trim, regularization=True, forest=False, y0m1 = np.sum(y * (1 - t) * p_xm / ((1 - p_xm) * p_x)) /\ np.sum((1 - t) * p_xm / ((1 - p_xm) * p_x)) - return [y1m1 - y0m0, + return (y1m1 - y0m0, y1m1 - y0m1, y1m0 - y0m0, y1m1 - y1m0, y0m1 - y0m0, - np.sum(ind)] + np.sum(ind)) def mediation_coefficient_product(y, t, m, x, interaction=False, @@ -209,12 +209,12 @@ def mediation_coefficient_product(y, t, m, x, interaction=False, # return total, direct and indirect effect direct_effect = y_reg.coef_[x.shape[1]] indirect_effect = sum(y_reg.coef_[x.shape[1] + 1:] * coef_t_m) - return [direct_effect + indirect_effect, + return (direct_effect + indirect_effect, direct_effect, direct_effect, indirect_effect, indirect_effect, - None] + None) def mediation_g_formula(y, t, m, x, interaction=False, forest=False, @@ -290,12 +290,12 @@ def mediation_g_formula(y, t, m, x, interaction=False, forest=False, + indirect_effect_i0 * mu_00x).sum() / n total_effect = direct_effect_control + indirect_effect_treated - return [total_effect, + return (total_effect, direct_effect_treated, direct_effect_control, indirect_effect_treated, indirect_effect_control, - None] + None) def alternative_estimator(y, t, m, x, regularization=True): @@ -358,12 +358,12 @@ def alternative_estimator(y, t, m, x, regularization=True): # computation of indirect effect indirect_effect = total_effect - direct_effect - return [total_effect, + return (total_effect, direct_effect, direct_effect, indirect_effect, indirect_effect, - None] + None) def mediation_multiply_robust(y, t, m, x, interaction=False, forest=False, @@ -547,7 +547,7 @@ def mediation_multiply_robust(y, t, m, x, interaction=False, forest=False, indirect1 = np.mean(y1m1 - y1m0) indirect0 = np.mean(y0m1 - y0m0) - return [total, direct1, direct0, indirect1, indirect0, n_discarded] + return total, direct1, direct0, indirect1, indirect0, n_discarded def r_mediate(y, t, m, x, interaction=False): @@ -646,12 +646,12 @@ def r_mediation_g_estimator(y, t, m, x): data=base.as_symbol('df')) direct_effect = res.rx2('coef')[0] indirect_effect = res.rx2('coef')[1] - return [direct_effect + indirect_effect, + return (direct_effect + indirect_effect, direct_effect, direct_effect, indirect_effect, indirect_effect, - None] + None) def r_mediation_DML(y, t, m, x, trim=0.05, order=1): @@ -884,4 +884,4 @@ def mediation_DML(y, t, m, x, forest=False, crossfit=0, trim=0.05, direct0 = my1m0 - my0m0 indirect1 = my1m1 - my1m0 indirect0 = my0m1 - my0m0 - return [total, direct1, direct0, indirect1, indirect0, n - nobs] + return total, direct1, direct0, indirect1, indirect0, n - nobs From 684de635790a313b93a905226c35ad5e3761bffd Mon Sep 17 00:00:00 2001 From: Hadrien Mariaccia Date: Tue, 19 Mar 2024 11:42:47 +0100 Subject: [PATCH 14/33] optimise constants --- src/med_bench/utils/constants.py | 138 ++++++++++++------------------- 1 file changed, 51 insertions(+), 87 deletions(-) diff --git a/src/med_bench/utils/constants.py b/src/med_bench/utils/constants.py index c625ea5..c453744 100644 --- a/src/med_bench/utils/constants.py +++ b/src/med_bench/utils/constants.py @@ -1,5 +1,4 @@ import itertools -import os import numpy as np from numpy.random import default_rng @@ -7,58 +6,59 @@ # TOLERANCE THRESHOLDS -SMALL_ATE_TOLERANCE = 0.05 -SMALL_DIRECT_TOLERANCE = 0.05 -SMALL_INDIRECT_TOLERANCE = 0.2 - -MEDIUM_ATE_TOLERANCE = 0.10 -MEDIUM_DIRECT_TOLERANCE = 0.10 -MEDIUM_INDIRECT_TOLERANCE = 0.4 - -LARGE_ATE_TOLERANCE = 0.15 -LARGE_DIRECT_TOLERANCE = 0.15 -LARGE_INDIRECT_TOLERANCE = 0.8 -# indirect effect is weak, leading to a large relative error - -SMALL_TOLERANCE = np.array( - [ - SMALL_ATE_TOLERANCE, - SMALL_DIRECT_TOLERANCE, - SMALL_DIRECT_TOLERANCE, - SMALL_INDIRECT_TOLERANCE, - SMALL_INDIRECT_TOLERANCE, - ] -) +TOLERANCE_THRESHOLDS = { + "SMALL": { + "ATE": 0.05, + "DIRECT": 0.05, + "INDIRECT": 0.2, + }, + "MEDIUM": { + "ATE": 0.10, + "DIRECT": 0.10, + "INDIRECT": 0.4, + }, + "LARGE": { + "ATE": 0.15, + "DIRECT": 0.15, + "INDIRECT": 0.8, + }, + "INFINITE": { + "ATE": np.inf, + "DIRECT": np.inf, + "INDIRECT": np.inf, + }, +} -MEDIUM_TOLERANCE = np.array( - [ - MEDIUM_ATE_TOLERANCE, - MEDIUM_DIRECT_TOLERANCE, - MEDIUM_DIRECT_TOLERANCE, - MEDIUM_INDIRECT_TOLERANCE, - MEDIUM_INDIRECT_TOLERANCE, - ] -) -LARGE_TOLERANCE = np.array( - [ - LARGE_ATE_TOLERANCE, - LARGE_DIRECT_TOLERANCE, - LARGE_DIRECT_TOLERANCE, - LARGE_INDIRECT_TOLERANCE, - LARGE_INDIRECT_TOLERANCE, - ] -) +def get_tolerance_array(tolerance_size: str) -> np.array: + """Get tolerance array for tolerance tests -INFINITE_TOLERANCE = np.array( - [ - np.inf, - np.inf, - np.inf, - np.inf, - np.inf, - ] -) + Parameters + ---------- + tolerance_size : str + tolerance size, can be "SMALL", "MEDIUM", "LARGE" or "INFINITE" + + Returns + ------- + np.array + array of size 5 containing the ATE, DIRECT and INDIRECT effects tolerance + """ + + return np.array( + [ + TOLERANCE_THRESHOLDS[tolerance_size]["ATE"], + TOLERANCE_THRESHOLDS[tolerance_size]["DIRECT"], + TOLERANCE_THRESHOLDS[tolerance_size]["DIRECT"], + TOLERANCE_THRESHOLDS[tolerance_size]["INDIRECT"], + TOLERANCE_THRESHOLDS[tolerance_size]["INDIRECT"], + ] + ) + + +SMALL_TOLERANCE = get_tolerance_array("SMALL") +MEDIUM_TOLERANCE = get_tolerance_array("MEDIUM") +LARGE_TOLERANCE = get_tolerance_array("LARGE") +INFINITE_TOLERANCE = get_tolerance_array("INFINITE") TOLERANCE_DICT = { "coefficient_product": LARGE_TOLERANCE, @@ -98,43 +98,7 @@ "mediation_multiply_robust_forest_calibration_cf": INFINITE_TOLERANCE, } -ESTIMATORS = [ - "coefficient_product", - "mediation_ipw_noreg", - "mediation_ipw_reg", - "mediation_ipw_reg_calibration", - "mediation_ipw_forest", - "mediation_ipw_forest_calibration", - "mediation_g_computation_noreg", - "mediation_g_computation_reg", - "mediation_g_computation_reg_calibration", - "mediation_g_computation_forest", - "mediation_g_computation_forest_calibration", - "mediation_multiply_robust_noreg", - "mediation_multiply_robust_reg", - "mediation_multiply_robust_reg_calibration", - "mediation_multiply_robust_forest", - "mediation_multiply_robust_forest_calibration", - "simulation_based", - "mediation_DML", - "mediation_DML_reg_fixed_seed", - "mediation_g_estimator", - "mediation_ipw_noreg_cf", - "mediation_ipw_reg_cf", - "mediation_ipw_reg_calibration_cf", - "mediation_ipw_forest_cf", - "mediation_ipw_forest_calibration_cf", - "mediation_g_computation_noreg_cf", - "mediation_g_computation_reg_cf", - "mediation_g_computation_reg_calibration_cf", - "mediation_g_computation_forest_cf", - "mediation_g_computation_forest_calibration_cf", - "mediation_multiply_robust_noreg_cf", - "mediation_multiply_robust_reg_cf", - "mediation_multiply_robust_reg_calibration_cf", - "mediation_multiply_robust_forest_cf", - "mediation_multiply_robust_forest_calibration_cf", -] +ESTIMATORS = list(TOLERANCE_DICT.keys()) # PARAMETERS VALUES FOR DATA GENERATION From 9d249f225d38c0029a793e3cb11ee9f181fe87f8 Mon Sep 17 00:00:00 2001 From: Mouad Date: Wed, 20 Mar 2024 10:21:21 +0100 Subject: [PATCH 15/33] Solving issue #76: fail import of _get_interactions --- src/med_bench/utils/nuisances.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/med_bench/utils/nuisances.py b/src/med_bench/utils/nuisances.py index 2d13449..1a2d811 100644 --- a/src/med_bench/utils/nuisances.py +++ b/src/med_bench/utils/nuisances.py @@ -15,10 +15,10 @@ from sklearn.model_selection import KFold from sklearn.preprocessing import PolynomialFeatures -from .utils import check_r_dependencies +from .utils import check_r_dependencies, _get_interactions if check_r_dependencies(): - from .utils import _convert_array_to_R, _get_interactions + from .utils import _convert_array_to_R ALPHAS = np.logspace(-5, 5, 8) From d0286ad043e0292d0007ca0a69f7dad8d6197148 Mon Sep 17 00:00:00 2001 From: Hadrien M <38348700+brash6@users.noreply.github.com> Date: Wed, 20 Mar 2024 16:47:12 +0100 Subject: [PATCH 16/33] Update src/med_bench/utils/constants.py Co-authored-by: bthirion --- src/med_bench/utils/constants.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/med_bench/utils/constants.py b/src/med_bench/utils/constants.py index c453744..4f457c6 100644 --- a/src/med_bench/utils/constants.py +++ b/src/med_bench/utils/constants.py @@ -41,7 +41,7 @@ def get_tolerance_array(tolerance_size: str) -> np.array: Returns ------- np.array - array of size 5 containing the ATE, DIRECT and INDIRECT effects tolerance + array of size 5 containing the ATE, DIRECT (*2) and INDIRECT (*2) effects tolerance """ return np.array( From 7b93aa6011da77f52d2d84b29df9e7e4c8b9ed71 Mon Sep 17 00:00:00 2001 From: Hadrien Mariaccia Date: Wed, 20 Mar 2024 16:50:03 +0100 Subject: [PATCH 17/33] remove useless comment in nuisances.py --- src/med_bench/utils/nuisances.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/med_bench/utils/nuisances.py b/src/med_bench/utils/nuisances.py index f07470e..c6a82e7 100644 --- a/src/med_bench/utils/nuisances.py +++ b/src/med_bench/utils/nuisances.py @@ -190,7 +190,6 @@ def _estimate_mediator_density(t, m, x, y, crossfit, clf_m, interaction): # f_mtx model fitting clf_m = clf_m.fit(t_x[train_index, :], m[train_index]) - # clf_m = clf_m.fit(t_x[train_index, :], m.ravel()[train_index]) # predict f(M=m|T=t,X) fm_0 = clf_m.predict_proba(t0_x[test_index, :]) From f42a6d149d407077e56d28ebb26856fabd22106d Mon Sep 17 00:00:00 2001 From: Hadrien Mariaccia Date: Wed, 20 Mar 2024 16:55:16 +0100 Subject: [PATCH 18/33] Enhance readibility of generate_tests_results.py functions --- .../estimation/generate_tests_results.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/tests/estimation/generate_tests_results.py b/src/tests/estimation/generate_tests_results.py index 34c7b25..b698a05 100644 --- a/src/tests/estimation/generate_tests_results.py +++ b/src/tests/estimation/generate_tests_results.py @@ -1,4 +1,3 @@ - import numpy as np from med_bench.get_simulated_data import simulate_data @@ -7,7 +6,9 @@ from med_bench.utils.constants import ESTIMATORS, PARAMETER_LIST, PARAMETER_NAME -def get_data_from_list(data): +def _get_data_from_list(data): + """Get x, t, m, y from simulated data + """ x = data[0] t = data[1].ravel() m = data[2] @@ -16,7 +17,9 @@ def get_data_from_list(data): return x, t, m, y -def get_config_from_dict(dict_params): +def _get_config_from_dict(dict_params): + """Get config parameter used for estimators parametrisation + """ if dict_params["dim_m"] == 1 and dict_params["type_m"] == "binary": config = 0 else: @@ -24,7 +27,9 @@ def get_config_from_dict(dict_params): return config -def get_estimators_results(x, t, m, y, config, estimator): +def _get_estimators_results(x, t, m, y, config, estimator): + """Get estimation result from specified input parameters and estimator name + """ try: res = get_estimation(x, t, m, y, estimator, config)[0:5] @@ -44,13 +49,13 @@ def get_estimators_results(x, t, m, y, config, estimator): # Get synthetic input data from parameters list defined above dict_params = dict(zip(PARAMETER_NAME, param_list)) data = simulate_data(**dict_params) - x, t, m, y = get_data_from_list(data) - config = get_config_from_dict(dict_params=dict_params) + x, t, m, y = _get_data_from_list(data) + config = _get_config_from_dict(dict_params=dict_params) for estimator in ESTIMATORS: # Get results from synthetic inputs - result = get_estimators_results(x, t, m, y, config, estimator) + result = _get_estimators_results(x, t, m, y, config, estimator) row = [estimator, x, t, m, y, config, result] results.append(row) From 1d71d23fd996ba41e8dcb58c195407ba3a82c10e Mon Sep 17 00:00:00 2001 From: Hadrien Mariaccia Date: Thu, 21 Mar 2024 13:53:03 +0100 Subject: [PATCH 19/33] add ci execution for develop branch --- .github/workflows/tests-with-R.yaml | 4 +++- .github/workflows/tests-without-R.yaml | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests-with-R.yaml b/.github/workflows/tests-with-R.yaml index 93cc116..086ddb5 100644 --- a/.github/workflows/tests-with-R.yaml +++ b/.github/workflows/tests-with-R.yaml @@ -4,7 +4,9 @@ on: push: branches: [ main ] pull_request: - branches: [ main ] + branches: + - main + - develop jobs: test: diff --git a/.github/workflows/tests-without-R.yaml b/.github/workflows/tests-without-R.yaml index afe51cb..e8fb624 100644 --- a/.github/workflows/tests-without-R.yaml +++ b/.github/workflows/tests-without-R.yaml @@ -4,7 +4,9 @@ on: push: branches: [ main ] pull_request: - branches: [ main ] + branches: + - main + - develop jobs: test: From 4f63b8059b8baf6fa79303b02b2e188692e6a403 Mon Sep 17 00:00:00 2001 From: Hadrien Mariaccia Date: Thu, 21 Mar 2024 13:53:22 +0100 Subject: [PATCH 20/33] increase tolerance threshold for exactness tests --- src/tests/estimation/test_exact_estimation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/estimation/test_exact_estimation.py b/src/tests/estimation/test_exact_estimation.py index a68f0ab..3fb2156 100644 --- a/src/tests/estimation/test_exact_estimation.py +++ b/src/tests/estimation/test_exact_estimation.py @@ -99,4 +99,4 @@ def effects_chap(x, t, m, y, estimator, config): def test_estimation_exactness(result, effects_chap): - assert np.all(effects_chap == pytest.approx(result)) + assert np.all(effects_chap == pytest.approx(result, abs=0.01)) From 3eaea9a485e91396e1db5154f406b29eba6d2da0 Mon Sep 17 00:00:00 2001 From: Hadrien Mariaccia Date: Mon, 25 Mar 2024 11:35:06 +0100 Subject: [PATCH 21/33] Adapt tolerance thresholds --- src/med_bench/utils/constants.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/med_bench/utils/constants.py b/src/med_bench/utils/constants.py index 4f457c6..e34e156 100644 --- a/src/med_bench/utils/constants.py +++ b/src/med_bench/utils/constants.py @@ -20,7 +20,7 @@ "LARGE": { "ATE": 0.15, "DIRECT": 0.15, - "INDIRECT": 0.8, + "INDIRECT": 0.9, }, "INFINITE": { "ATE": np.inf, @@ -80,7 +80,7 @@ def get_tolerance_array(tolerance_size: str) -> np.array: "simulation_based": LARGE_TOLERANCE, "mediation_DML": INFINITE_TOLERANCE, "mediation_DML_reg_fixed_seed": INFINITE_TOLERANCE, - "mediation_g_estimator": SMALL_TOLERANCE, + "mediation_g_estimator": LARGE_TOLERANCE, "mediation_ipw_noreg_cf": INFINITE_TOLERANCE, "mediation_ipw_reg_cf": INFINITE_TOLERANCE, "mediation_ipw_reg_calibration_cf": INFINITE_TOLERANCE, From 280d11e9d27e18d8407e963ff8ee33f8ff025e57 Mon Sep 17 00:00:00 2001 From: Hadrien Mariaccia Date: Mon, 25 Mar 2024 11:59:28 +0100 Subject: [PATCH 22/33] Address the 'DataFrame' object has no attribute 'iteritems' error --- setup.py | 2 +- src/med_bench/utils/utils.py | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index ed1af7d..618e661 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ ), package_dir={"": "src"}, install_requires=[ - 'pandas==1.2.1', + 'pandas>=1.2.1', 'scikit-learn>=0.22.1', 'numpy>=1.19.2', 'rpy2>=2.9.4', diff --git a/src/med_bench/utils/utils.py b/src/med_bench/utils/utils.py index 997a3a7..20083ad 100644 --- a/src/med_bench/utils/utils.py +++ b/src/med_bench/utils/utils.py @@ -1,4 +1,5 @@ import numpy as np +import pandas as pd import rpy2.robjects as robjects import subprocess @@ -55,6 +56,10 @@ def wrapper(*args, **kwargs): ) return None + # To get rid of the 'DataFrame' object has no attribute 'iteritems' error due to pandas version mismatch in rpy2 + # https://stackoverflow.com/a/76404841 + pd.DataFrame.iteritems = pd.DataFrame.items + for package in required_packages: if not check_r_package(package): if package != 'plmed': From 95eb3a2ae113c8adae280c4cc6be47b9acad9b6b Mon Sep 17 00:00:00 2001 From: judithabk6 Date: Tue, 26 Mar 2024 10:56:28 +0100 Subject: [PATCH 23/33] add default clipping for IPW and multiply robust estimators --- src/med_bench/get_estimation.py | 56 ++++++++++++++++----------------- src/med_bench/mediation.py | 4 +-- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/med_bench/get_estimation.py b/src/med_bench/get_estimation.py index 64f01ec..cd2edb9 100644 --- a/src/med_bench/get_estimation.py +++ b/src/med_bench/get_estimation.py @@ -72,7 +72,7 @@ def get_estimation(x, t, m, y, estimator, config): regularization=False, forest=False, crossfit=0, - clip=0.0, + clip=1e-6, calibration=None, ) elif estimator == "mediation_ipw_noreg_cf": @@ -85,7 +85,7 @@ def get_estimation(x, t, m, y, estimator, config): regularization=False, forest=False, crossfit=2, - clip=0.0, + clip=1e-6, calibration=None, ) elif estimator == "mediation_ipw_reg": @@ -98,7 +98,7 @@ def get_estimation(x, t, m, y, estimator, config): regularization=True, forest=False, crossfit=0, - clip=0.0, + clip=1e-6, calibration=None, ) elif estimator == "mediation_ipw_reg_cf": @@ -111,7 +111,7 @@ def get_estimation(x, t, m, y, estimator, config): regularization=True, forest=False, crossfit=2, - clip=0.0, + clip=1e-6, calibration=None, ) elif estimator == "mediation_ipw_reg_calibration": @@ -124,7 +124,7 @@ def get_estimation(x, t, m, y, estimator, config): regularization=True, forest=False, crossfit=0, - clip=0.0, + clip=1e-6, calibration=None, ) elif estimator == "mediation_ipw_reg_calibration_iso": @@ -137,7 +137,7 @@ def get_estimation(x, t, m, y, estimator, config): regularization=True, forest=False, crossfit=0, - clip=0.0, + clip=1e-6, calibration="isotonic", ) elif estimator == "mediation_ipw_reg_calibration_cf": @@ -150,7 +150,7 @@ def get_estimation(x, t, m, y, estimator, config): regularization=True, forest=False, crossfit=2, - clip=0.0, + clip=1e-6, calibration='sigmoid', ) elif estimator == "mediation_ipw_reg_calibration_iso_cf": @@ -163,7 +163,7 @@ def get_estimation(x, t, m, y, estimator, config): regularization=True, forest=False, crossfit=2, - clip=0.0, + clip=1e-6, calibration="isotonic", ) elif estimator == "mediation_ipw_forest": @@ -176,7 +176,7 @@ def get_estimation(x, t, m, y, estimator, config): regularization=True, forest=True, crossfit=0, - clip=0.0, + clip=1e-6, calibration=None, ) elif estimator == "mediation_ipw_forest_cf": @@ -189,7 +189,7 @@ def get_estimation(x, t, m, y, estimator, config): regularization=True, forest=True, crossfit=2, - clip=0.0, + clip=1e-6, calibration=None, ) elif estimator == "mediation_ipw_forest_calibration": @@ -202,7 +202,7 @@ def get_estimation(x, t, m, y, estimator, config): regularization=True, forest=True, crossfit=0, - clip=0.0, + clip=1e-6, calibration=None, ) elif estimator == "mediation_ipw_forest_calibration_iso": @@ -215,7 +215,7 @@ def get_estimation(x, t, m, y, estimator, config): regularization=True, forest=True, crossfit=0, - clip=0.0, + clip=1e-6, calibration="isotonic", ) elif estimator == "mediation_ipw_forest_calibration_cf": @@ -228,7 +228,7 @@ def get_estimation(x, t, m, y, estimator, config): regularization=True, forest=True, crossfit=2, - clip=0.0, + clip=1e-6, calibration='sigmoid', ) elif estimator == "mediation_ipw_forest_calibration_iso_cf": @@ -241,7 +241,7 @@ def get_estimation(x, t, m, y, estimator, config): regularization=True, forest=True, crossfit=2, - clip=0.0, + clip=1e-6, calibration="isotonic", ) elif estimator == "mediation_g_computation_noreg": @@ -436,7 +436,7 @@ def get_estimation(x, t, m, y, estimator, config): interaction=False, forest=False, crossfit=0, - clip=0.0, + clip=1e-6, regularization=False, calibration=None, ) @@ -450,7 +450,7 @@ def get_estimation(x, t, m, y, estimator, config): interaction=False, forest=False, crossfit=2, - clip=0.0, + clip=1e-6, regularization=False, calibration=None, ) @@ -464,7 +464,7 @@ def get_estimation(x, t, m, y, estimator, config): interaction=False, forest=False, crossfit=0, - clip=0.0, + clip=1e-6, regularization=True, calibration=None, ) @@ -478,7 +478,7 @@ def get_estimation(x, t, m, y, estimator, config): interaction=False, forest=False, crossfit=2, - clip=0.0, + clip=1e-6, regularization=True, calibration=None, ) @@ -492,7 +492,7 @@ def get_estimation(x, t, m, y, estimator, config): interaction=False, forest=False, crossfit=0, - clip=0.0, + clip=1e-6, regularization=True, calibration='sigmoid', ) @@ -506,7 +506,7 @@ def get_estimation(x, t, m, y, estimator, config): interaction=False, forest=False, crossfit=0, - clip=0.0, + clip=1e-6, regularization=True, calibration="isotonic", ) @@ -520,7 +520,7 @@ def get_estimation(x, t, m, y, estimator, config): interaction=False, forest=False, crossfit=2, - clip=0.0, + clip=1e-6, regularization=True, calibration='sigmoid', ) @@ -534,7 +534,7 @@ def get_estimation(x, t, m, y, estimator, config): interaction=False, forest=False, crossfit=2, - clip=0.0, + clip=1e-6, regularization=True, calibration="isotonic", ) @@ -548,7 +548,7 @@ def get_estimation(x, t, m, y, estimator, config): interaction=False, forest=True, crossfit=0, - clip=0.0, + clip=1e-6, regularization=True, calibration=None, ) @@ -562,7 +562,7 @@ def get_estimation(x, t, m, y, estimator, config): interaction=False, forest=True, crossfit=2, - clip=0.0, + clip=1e-6, regularization=True, calibration=None, ) @@ -576,7 +576,7 @@ def get_estimation(x, t, m, y, estimator, config): interaction=False, forest=True, crossfit=0, - clip=0.0, + clip=1e-6, regularization=True, calibration='sigmoid', ) @@ -590,7 +590,7 @@ def get_estimation(x, t, m, y, estimator, config): interaction=False, forest=True, crossfit=0, - clip=0.0, + clip=1e-6, regularization=True, calibration="isotonic", ) @@ -604,7 +604,7 @@ def get_estimation(x, t, m, y, estimator, config): interaction=False, forest=True, crossfit=2, - clip=0.0, + clip=1e-6, regularization=True, calibration='sigmoid', ) @@ -618,7 +618,7 @@ def get_estimation(x, t, m, y, estimator, config): interaction=False, forest=True, crossfit=2, - clip=0.0, + clip=1e-6, regularization=True, calibration="isotonic", ) diff --git a/src/med_bench/mediation.py b/src/med_bench/mediation.py index adfb727..fec04c3 100644 --- a/src/med_bench/mediation.py +++ b/src/med_bench/mediation.py @@ -26,7 +26,7 @@ def mediation_IPW(y, t, m, x, trim, regularization=True, forest=False, - crossfit=0, clip=0.01, calibration='sigmoid'): + crossfit=0, clip=1e-6, calibration='sigmoid'): """ IPW estimator presented in HUBER, Martin. Identifying causal mechanisms (primarily) based on inverse @@ -354,7 +354,7 @@ def alternative_estimator(y, t, m, x, regularization=True): def mediation_multiply_robust(y, t, m, x, interaction=False, forest=False, - crossfit=0, clip=0.01, normalized=True, + crossfit=0, clip=1e-6, normalized=True, regularization=True, calibration="sigmoid"): """ Presented in Eric J. Tchetgen Tchetgen. Ilya Shpitser. From 5baa1ee43954c3bf0d31855527831dbd74a43a95 Mon Sep 17 00:00:00 2001 From: judithabk6 Date: Thu, 28 Mar 2024 16:02:12 +0100 Subject: [PATCH 24/33] clipping for dml --- src/med_bench/get_estimation.py | 69 ++++++++++++++++++++++++++++----- src/med_bench/mediation.py | 13 +++++-- 2 files changed, 69 insertions(+), 13 deletions(-) diff --git a/src/med_bench/get_estimation.py b/src/med_bench/get_estimation.py index cd2edb9..dfa5921 100644 --- a/src/med_bench/get_estimation.py +++ b/src/med_bench/get_estimation.py @@ -630,12 +630,20 @@ def get_estimation(x, t, m, y, estimator, config): effects = r_mediation_DML(y, t, m, x, trim=0.0, order=1) elif estimator == "mediation_DML_noreg": effects = mediation_DML( - y, t, m, x, trim=0, regularization=False, calibration=None) + y, + t, + m, + x, + trim=0, + clip=1e-6, + regularization=False, + calibration=None) elif estimator == "mediation_DML_reg": - effects = mediation_DML(y, t, m, x, trim=0, calibration=None) + effects = mediation_DML( + y, t, m, x, trim=0, clip=1e-6, calibration=None) elif estimator == "mediation_DML_reg_fixed_seed": effects = mediation_DML( - y, t, m, x, trim=0, random_state=321, calibration=None) + y, t, m, x, trim=0, clip=1e-6, random_state=321, calibration=None) elif estimator == "mediation_DML_noreg_cf": effects = mediation_DML( y, @@ -643,30 +651,71 @@ def get_estimation(x, t, m, y, estimator, config): m, x, trim=0, + clip=1e-6, crossfit=2, regularization=False, calibration=None) elif estimator == "mediation_DML_reg_cf": effects = mediation_DML( - y, t, m, x, trim=0, crossfit=2, calibration=None) + y, t, m, x, trim=0, clip=1e-6, crossfit=2, calibration=None) elif estimator == "mediation_DML_reg_calibration": effects = mediation_DML( - y, t, m, x, trim=0, crossfit=0, calibration='sigmoid') + y, t, m, x, trim=0, clip=1e-6, crossfit=0, calibration='sigmoid') elif estimator == "mediation_DML_forest": effects = mediation_DML( - y, t, m, x, trim=0, crossfit=0, calibration=None, forest=True) + y, + t, + m, + x, + trim=0, + clip=1e-6, + crossfit=0, + calibration=None, + forest=True) elif estimator == "mediation_DML_forest_calibration": effects = mediation_DML( - y, t, m, x, trim=0, crossfit=0, calibration='sigmoid', forest=True) + y, + t, + m, + x, + trim=0, + clip=1e-6, + crossfit=0, + calibration='sigmoid', + forest=True) elif estimator == "mediation_DML_reg_calibration_cf": effects = mediation_DML( - y, t, m, x, trim=0, crossfit=2, calibration='sigmoid', forest=False) + y, + t, + m, + x, + trim=0, + clip=1e-6, + crossfit=2, + calibration='sigmoid', + forest=False) elif estimator == "mediation_DML_forest_cf": effects = mediation_DML( - y, t, m, x, trim=0, crossfit=2, calibration=None, forest=True) + y, + t, + m, + x, + trim=0, + clip=1e-6, + crossfit=2, + calibration=None, + forest=True) elif estimator == "mediation_DML_forest_calibration_cf": effects = mediation_DML( - y, t, m, x, trim=0, crossfit=2, calibration='sigmoid', forest=True) + y, + t, + m, + x, + trim=0, + clip=1e-6, + crossfit=2, + calibration='sigmoid', + forest=True) elif estimator == "mediation_g_estimator": if config in (0, 1, 2): effects = r_mediation_g_estimator(y, t, m, x) diff --git a/src/med_bench/mediation.py b/src/med_bench/mediation.py index fec04c3..9bc3ebe 100644 --- a/src/med_bench/mediation.py +++ b/src/med_bench/mediation.py @@ -69,7 +69,7 @@ def mediation_IPW(y, t, m, x, trim, regularization=True, forest=False, crossfit : integer, default=0 number of folds for cross-fitting - clip : float, default=0.01 + clip : float, default=1e-6 limit to clip for numerical stability (min=clip, max=1-clip) calibration : str, default=sigmoid @@ -390,7 +390,7 @@ def mediation_multiply_robust(y, t, m, x, interaction=False, forest=False, Number of folds for cross-fitting. If crossfit<2, no cross-fitting is applied - clip : float, default=0.01 + clip : float, default=1e-6 Limit to clip p_x and f_mtx for numerical stability (min=clip, max=1-clip) @@ -721,7 +721,7 @@ def r_mediation_DML(y, t, m, x, trim=0.05, order=1): return list(raw_res_R[0, :5]) + [ntrimmed] -def mediation_DML(y, t, m, x, forest=False, crossfit=0, trim=0.05, +def mediation_DML(y, t, m, x, forest=False, crossfit=0, trim=0.05, clip=1e-6, normalized=True, regularization=True, random_state=None, calibration=None): """ @@ -758,6 +758,9 @@ def mediation_DML(y, t, m, x, forest=False, crossfit=0, trim=0.05, trim : float, default=0.05 Trimming treshold for discarding observations with extreme probability. + clip : float, default=1e-6 + limit to clip for numerical stability (min=clip, max=1-clip) + normalized : boolean, default=True Normalizes the inverse probability-based weights so they add up to 1, as described in "Identifying causal mechanisms (primarily) based on @@ -862,6 +865,10 @@ def mediation_DML(y, t, m, x, forest=False, crossfit=0, trim=0.05, exec(f"{var} = {var}[not_trimmed]") nobs = np.sum(not_trimmed) + # clipping + p_x = np.clip(p_x, clip, 1 - clip) + p_xm = np.clip(p_xm, clip, 1 - clip) + # score computing if normalized: sum_score_m1 = np.mean(t / p_x) From 9e945d9aaa84f3011d96675fd0c71a421c54138f Mon Sep 17 00:00:00 2001 From: Mouad Date: Thu, 28 Mar 2024 16:38:44 +0100 Subject: [PATCH 25/33] Replacing warnings with errors in case R packages are not installed. --- src/med_bench/utils/utils.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/med_bench/utils/utils.py b/src/med_bench/utils/utils.py index 20083ad..ab7f44d 100644 --- a/src/med_bench/utils/utils.py +++ b/src/med_bench/utils/utils.py @@ -1,6 +1,5 @@ import numpy as np import pandas as pd -import rpy2.robjects as robjects import subprocess import warnings @@ -46,15 +45,18 @@ def check_r_package(package_name): return False +class DependencyNotInstalledError(Exception): + pass + + def r_dependency_required(required_packages): def decorator(func): def wrapper(*args, **kwargs): if not is_r_installed(): - warnings.warn( + raise DependencyNotInstalledError( "R is not installed or not found. " "Please install R and set it up correctly in your system." ) - return None # To get rid of the 'DataFrame' object has no attribute 'iteritems' error due to pandas version mismatch in rpy2 # https://stackoverflow.com/a/76404841 @@ -63,7 +65,7 @@ def wrapper(*args, **kwargs): for package in required_packages: if not check_r_package(package): if package != 'plmed': - warnings.warn( + raise DependencyNotInstalledError( f"The '{package}' R package is not installed. " "Please install it using R by running:\n" "import rpy2.robjects.packages as rpackages\n" @@ -72,7 +74,7 @@ def wrapper(*args, **kwargs): f"utils.install_packages('{package}')" ) else: - warnings.warn( + raise DependencyNotInstalledError( "The 'plmed' R package is not installed. " "Please install it using R by running:\n" "import rpy2.robjects.packages as rpackages\n" From 2415d1e6c62c48738c4479331dc84dba8881aa1b Mon Sep 17 00:00:00 2001 From: Hadrien Mariaccia Date: Wed, 3 Apr 2024 15:15:08 +0200 Subject: [PATCH 26/33] Handle r not installed packages test exact estimations --- src/tests/estimation/test_exact_estimation.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/tests/estimation/test_exact_estimation.py b/src/tests/estimation/test_exact_estimation.py index 3fb2156..391aecf 100644 --- a/src/tests/estimation/test_exact_estimation.py +++ b/src/tests/estimation/test_exact_estimation.py @@ -17,6 +17,7 @@ import numpy as np from med_bench.get_estimation import get_estimation +from med_bench.utils.utils import check_r_dependencies current_dir = os.path.dirname(__file__) true_estimations_file_path = os.path.join(current_dir, 'tests_results.npy') @@ -72,6 +73,21 @@ def result(data): @pytest.fixture def effects_chap(x, t, m, y, estimator, config): # try whether estimator is implemented or not + + r_dependent_estimators = [ + "mediation_IPW_R", "simulation_based", "mediation_DML", "mediation_g_estimator" + ] + + if estimator in r_dependent_estimators and not check_r_dependencies(): + warning_message = ( + "R or some required R packages ('causalweight', 'mediation', 'stats', 'base', " + "'grf', 'plmed') not available" + ) + print(warning_message) + pytest.skip( + f"Skipping {estimator} as the required R environment/packages are not available." + ) + try: res = get_estimation(x, t, m, y, estimator, config)[0:5] except Exception as e: From e77b71b38a873af42c3e3bb6a101f46d3293e2d6 Mon Sep 17 00:00:00 2001 From: Hadrien Mariaccia Date: Fri, 5 Apr 2024 14:40:04 +0200 Subject: [PATCH 27/33] mediation_DML to mediation_dml --- src/med_bench/get_estimation.py | 52 ++++++++++++++++---------------- src/med_bench/mediation.py | 4 +-- src/med_bench/utils/constants.py | 8 +++-- 3 files changed, 34 insertions(+), 30 deletions(-) diff --git a/src/med_bench/get_estimation.py b/src/med_bench/get_estimation.py index dfa5921..4ee3ae6 100644 --- a/src/med_bench/get_estimation.py +++ b/src/med_bench/get_estimation.py @@ -8,9 +8,9 @@ mediation_coefficient_product, mediation_g_formula, mediation_multiply_robust, - mediation_DML, + mediation_dml, r_mediation_g_estimator, - r_mediation_DML, + r_mediation_dml, r_mediate, ) @@ -625,11 +625,11 @@ def get_estimation(x, t, m, y, estimator, config): elif estimator == "simulation_based": if config in (0, 1, 2): effects = r_mediate(y, t, m, x, interaction=False) - elif estimator == "mediation_DML": + elif estimator == "mediation_dml": if config > 0: - effects = r_mediation_DML(y, t, m, x, trim=0.0, order=1) - elif estimator == "mediation_DML_noreg": - effects = mediation_DML( + effects = r_mediation_dml(y, t, m, x, trim=0.0, order=1) + elif estimator == "mediation_dml_noreg": + effects = mediation_dml( y, t, m, @@ -638,14 +638,14 @@ def get_estimation(x, t, m, y, estimator, config): clip=1e-6, regularization=False, calibration=None) - elif estimator == "mediation_DML_reg": - effects = mediation_DML( + elif estimator == "mediation_dml_reg": + effects = mediation_dml( y, t, m, x, trim=0, clip=1e-6, calibration=None) - elif estimator == "mediation_DML_reg_fixed_seed": - effects = mediation_DML( + elif estimator == "mediation_dml_reg_fixed_seed": + effects = mediation_dml( y, t, m, x, trim=0, clip=1e-6, random_state=321, calibration=None) - elif estimator == "mediation_DML_noreg_cf": - effects = mediation_DML( + elif estimator == "mediation_dml_noreg_cf": + effects = mediation_dml( y, t, m, @@ -655,14 +655,14 @@ def get_estimation(x, t, m, y, estimator, config): crossfit=2, regularization=False, calibration=None) - elif estimator == "mediation_DML_reg_cf": - effects = mediation_DML( + elif estimator == "mediation_dml_reg_cf": + effects = mediation_dml( y, t, m, x, trim=0, clip=1e-6, crossfit=2, calibration=None) - elif estimator == "mediation_DML_reg_calibration": - effects = mediation_DML( + elif estimator == "mediation_dml_reg_calibration": + effects = mediation_dml( y, t, m, x, trim=0, clip=1e-6, crossfit=0, calibration='sigmoid') - elif estimator == "mediation_DML_forest": - effects = mediation_DML( + elif estimator == "mediation_dml_forest": + effects = mediation_dml( y, t, m, @@ -672,8 +672,8 @@ def get_estimation(x, t, m, y, estimator, config): crossfit=0, calibration=None, forest=True) - elif estimator == "mediation_DML_forest_calibration": - effects = mediation_DML( + elif estimator == "mediation_dml_forest_calibration": + effects = mediation_dml( y, t, m, @@ -683,8 +683,8 @@ def get_estimation(x, t, m, y, estimator, config): crossfit=0, calibration='sigmoid', forest=True) - elif estimator == "mediation_DML_reg_calibration_cf": - effects = mediation_DML( + elif estimator == "mediation_dml_reg_calibration_cf": + effects = mediation_dml( y, t, m, @@ -694,8 +694,8 @@ def get_estimation(x, t, m, y, estimator, config): crossfit=2, calibration='sigmoid', forest=False) - elif estimator == "mediation_DML_forest_cf": - effects = mediation_DML( + elif estimator == "mediation_dml_forest_cf": + effects = mediation_dml( y, t, m, @@ -705,8 +705,8 @@ def get_estimation(x, t, m, y, estimator, config): crossfit=2, calibration=None, forest=True) - elif estimator == "mediation_DML_forest_calibration_cf": - effects = mediation_DML( + elif estimator == "mediation_dml_forest_calibration_cf": + effects = mediation_dml( y, t, m, diff --git a/src/med_bench/mediation.py b/src/med_bench/mediation.py index 9bc3ebe..5d2071b 100644 --- a/src/med_bench/mediation.py +++ b/src/med_bench/mediation.py @@ -667,7 +667,7 @@ def r_mediation_g_estimator(y, t, m, x): @r_dependency_required(['causalweight', 'base']) -def r_mediation_DML(y, t, m, x, trim=0.05, order=1): +def r_mediation_dml(y, t, m, x, trim=0.05, order=1): """ This function calls the R Double Machine Learning estimator from the package causalweight (https://cran.r-project.org/web/packages/causalweight) @@ -721,7 +721,7 @@ def r_mediation_DML(y, t, m, x, trim=0.05, order=1): return list(raw_res_R[0, :5]) + [ntrimmed] -def mediation_DML(y, t, m, x, forest=False, crossfit=0, trim=0.05, clip=1e-6, +def mediation_dml(y, t, m, x, forest=False, crossfit=0, trim=0.05, clip=1e-6, normalized=True, regularization=True, random_state=None, calibration=None): """ diff --git a/src/med_bench/utils/constants.py b/src/med_bench/utils/constants.py index e34e156..417f993 100644 --- a/src/med_bench/utils/constants.py +++ b/src/med_bench/utils/constants.py @@ -78,8 +78,8 @@ def get_tolerance_array(tolerance_size: str) -> np.array: "mediation_multiply_robust_forest": INFINITE_TOLERANCE, "mediation_multiply_robust_forest_calibration": LARGE_TOLERANCE, "simulation_based": LARGE_TOLERANCE, - "mediation_DML": INFINITE_TOLERANCE, - "mediation_DML_reg_fixed_seed": INFINITE_TOLERANCE, + "mediation_dml": INFINITE_TOLERANCE, + "mediation_dml_reg_fixed_seed": INFINITE_TOLERANCE, "mediation_g_estimator": LARGE_TOLERANCE, "mediation_ipw_noreg_cf": INFINITE_TOLERANCE, "mediation_ipw_reg_cf": INFINITE_TOLERANCE, @@ -100,6 +100,10 @@ def get_tolerance_array(tolerance_size: str) -> np.array: ESTIMATORS = list(TOLERANCE_DICT.keys()) +R_DEPENDENT_ESTIMATORS = [ + "mediation_IPW_R", "simulation_based", "mediation_dml", "mediation_g_estimator" +] + # PARAMETERS VALUES FOR DATA GENERATION PARAMETER_NAME = [ From 5f1921d5f49c446c97ba360e8872f41ebcd06b56 Mon Sep 17 00:00:00 2001 From: Hadrien Mariaccia Date: Fri, 5 Apr 2024 14:40:57 +0200 Subject: [PATCH 28/33] catch DependencyNotInstalledError in tests --- src/tests/estimation/test_exact_estimation.py | 20 +++++------------- src/tests/estimation/test_get_estimation.py | 21 +++++-------------- 2 files changed, 10 insertions(+), 31 deletions(-) diff --git a/src/tests/estimation/test_exact_estimation.py b/src/tests/estimation/test_exact_estimation.py index 391aecf..abb228b 100644 --- a/src/tests/estimation/test_exact_estimation.py +++ b/src/tests/estimation/test_exact_estimation.py @@ -17,7 +17,8 @@ import numpy as np from med_bench.get_estimation import get_estimation -from med_bench.utils.utils import check_r_dependencies +from med_bench.utils.constants import R_DEPENDENT_ESTIMATORS +from med_bench.utils.utils import DependencyNotInstalledError, check_r_dependencies current_dir = os.path.dirname(__file__) true_estimations_file_path = os.path.join(current_dir, 'tests_results.npy') @@ -74,20 +75,6 @@ def result(data): def effects_chap(x, t, m, y, estimator, config): # try whether estimator is implemented or not - r_dependent_estimators = [ - "mediation_IPW_R", "simulation_based", "mediation_DML", "mediation_g_estimator" - ] - - if estimator in r_dependent_estimators and not check_r_dependencies(): - warning_message = ( - "R or some required R packages ('causalweight', 'mediation', 'stats', 'base', " - "'grf', 'plmed') not available" - ) - print(warning_message) - pytest.skip( - f"Skipping {estimator} as the required R environment/packages are not available." - ) - try: res = get_estimation(x, t, m, y, estimator, config)[0:5] except Exception as e: @@ -101,6 +88,9 @@ def effects_chap(x, t, m, y, estimator, config): elif "glmnet::glmnet" in str(e): pytest.skip(f"{e}") + elif estimator in R_DEPENDENT_ESTIMATORS and not check_r_dependencies(): + assert isinstance(e, DependencyNotInstalledError) == True + else: pytest.fail(f"{e}") diff --git a/src/tests/estimation/test_get_estimation.py b/src/tests/estimation/test_get_estimation.py index 75f6b00..f4fbe90 100644 --- a/src/tests/estimation/test_get_estimation.py +++ b/src/tests/estimation/test_get_estimation.py @@ -18,8 +18,8 @@ from med_bench.get_simulated_data import simulate_data from med_bench.get_estimation import get_estimation -from med_bench.utils.utils import check_r_dependencies -from med_bench.utils.constants import PARAMETER_LIST, PARAMETER_NAME, TOLERANCE_DICT +from med_bench.utils.utils import DependencyNotInstalledError, check_r_dependencies +from med_bench.utils.constants import PARAMETER_LIST, PARAMETER_NAME, R_DEPENDENT_ESTIMATORS, TOLERANCE_DICT @pytest.fixture(params=PARAMETER_LIST) @@ -79,20 +79,6 @@ def config(dict_param): def effects_chap(x, t, m, y, estimator, config): # try whether estimator is implemented or not - r_dependent_estimators = [ - "mediation_IPW_R", "simulation_based", "mediation_DML", "mediation_g_estimator" - ] - - if estimator in r_dependent_estimators and not check_r_dependencies(): - warning_message = ( - "R or some required R packages ('causalweight', 'mediation', 'stats', 'base', " - "'grf', 'plmed') not available" - ) - print(warning_message) - pytest.skip( - f"Skipping {estimator} as the required R environment/packages are not available." - ) - try: res = get_estimation(x, t, m, y, estimator, config)[0:5] except Exception as e: @@ -106,6 +92,9 @@ def effects_chap(x, t, m, y, estimator, config): elif "glmnet::glmnet" in str(e): pytest.skip(f"{e}") + elif estimator in R_DEPENDENT_ESTIMATORS and not check_r_dependencies(): + assert isinstance(e, DependencyNotInstalledError) == True + else: pytest.fail(f"{e}") From 23a12d12749639cf4933874fc6c9cf35307198dc Mon Sep 17 00:00:00 2001 From: Hadrien Mariaccia Date: Fri, 5 Apr 2024 14:58:33 +0200 Subject: [PATCH 29/33] adresse failing tests --- src/tests/estimation/test_exact_estimation.py | 18 ++++++++++-------- src/tests/estimation/test_get_estimation.py | 16 +++++++++------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/tests/estimation/test_exact_estimation.py b/src/tests/estimation/test_exact_estimation.py index abb228b..9970397 100644 --- a/src/tests/estimation/test_exact_estimation.py +++ b/src/tests/estimation/test_exact_estimation.py @@ -77,6 +77,13 @@ def effects_chap(x, t, m, y, estimator, config): try: res = get_estimation(x, t, m, y, estimator, config)[0:5] + + # NaN situations + if np.all(np.isnan(res)): + pytest.xfail("all effects are NaN") + elif np.any(np.isnan(res)): + pprint("NaN found") + except Exception as e: if str(e) in ( "Estimator only supports 1D binary mediator.", @@ -90,19 +97,14 @@ def effects_chap(x, t, m, y, estimator, config): elif estimator in R_DEPENDENT_ESTIMATORS and not check_r_dependencies(): assert isinstance(e, DependencyNotInstalledError) == True + return e else: pytest.fail(f"{e}") - # NaN situations - if np.all(np.isnan(res)): - pytest.xfail("all effects are NaN") - elif np.any(np.isnan(res)): - pprint("NaN found") - return res def test_estimation_exactness(result, effects_chap): - - assert np.all(effects_chap == pytest.approx(result, abs=0.01)) + if not isinstance(effects_chap, DependencyNotInstalledError): + assert np.all(effects_chap == pytest.approx(result, abs=0.01)) diff --git a/src/tests/estimation/test_get_estimation.py b/src/tests/estimation/test_get_estimation.py index f4fbe90..a47f2ab 100644 --- a/src/tests/estimation/test_get_estimation.py +++ b/src/tests/estimation/test_get_estimation.py @@ -94,6 +94,7 @@ def effects_chap(x, t, m, y, estimator, config): elif estimator in R_DEPENDENT_ESTIMATORS and not check_r_dependencies(): assert isinstance(e, DependencyNotInstalledError) == True + return e else: pytest.fail(f"{e}") @@ -125,10 +126,11 @@ def test_total_is_direct_plus_indirect(effects_chap): def test_robustness_to_ravel_format(data, estimator, config, effects_chap): if "forest" in estimator: pytest.skip("Forest estimator skipped") - assert np.all( - get_estimation(data[0], data[1], data[2], - data[3], estimator, config)[0:5] - == pytest.approx( - effects_chap, nan_ok=True - ) # effects_chap is obtained with data[1].ravel() and data[3].ravel() - ) + if not isinstance(effects_chap, DependencyNotInstalledError): + assert np.all( + get_estimation(data[0], data[1], data[2], + data[3], estimator, config)[0:5] + == pytest.approx( + effects_chap, nan_ok=True + ) # effects_chap is obtained with data[1].ravel() and data[3].ravel() + ) From d146b15cff72f456f9c1c89c87a5438dae2db4b9 Mon Sep 17 00:00:00 2001 From: Hadrien Mariaccia Date: Fri, 5 Apr 2024 15:59:36 +0200 Subject: [PATCH 30/33] new generated results to match new estrimator names --- src/tests/estimation/tests_results.npy | Bin 378964 -> 378850 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/tests/estimation/tests_results.npy b/src/tests/estimation/tests_results.npy index 274ec8863bc332ab0c377f043db81de059213e58..b468ed39e6b32f01cec4b70482a6c8510faf8b8c 100644 GIT binary patch delta 18985 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 CQQLt4 From 4e713cd642c9a9c58b0403fb702563da980ab863 Mon Sep 17 00:00:00 2001 From: Hadrien Mariaccia Date: Fri, 5 Apr 2024 16:19:47 +0200 Subject: [PATCH 31/33] adressing failing tests --- src/tests/estimation/test_exact_estimation.py | 5 ++--- src/tests/estimation/test_get_estimation.py | 17 ++++++++--------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/tests/estimation/test_exact_estimation.py b/src/tests/estimation/test_exact_estimation.py index 9970397..98d2d96 100644 --- a/src/tests/estimation/test_exact_estimation.py +++ b/src/tests/estimation/test_exact_estimation.py @@ -97,7 +97,7 @@ def effects_chap(x, t, m, y, estimator, config): elif estimator in R_DEPENDENT_ESTIMATORS and not check_r_dependencies(): assert isinstance(e, DependencyNotInstalledError) == True - return e + pytest.skip(f"{e}") else: pytest.fail(f"{e}") @@ -106,5 +106,4 @@ def effects_chap(x, t, m, y, estimator, config): def test_estimation_exactness(result, effects_chap): - if not isinstance(effects_chap, DependencyNotInstalledError): - assert np.all(effects_chap == pytest.approx(result, abs=0.01)) + assert np.all(effects_chap == pytest.approx(result, abs=0.01)) diff --git a/src/tests/estimation/test_get_estimation.py b/src/tests/estimation/test_get_estimation.py index a47f2ab..2e1adae 100644 --- a/src/tests/estimation/test_get_estimation.py +++ b/src/tests/estimation/test_get_estimation.py @@ -94,7 +94,7 @@ def effects_chap(x, t, m, y, estimator, config): elif estimator in R_DEPENDENT_ESTIMATORS and not check_r_dependencies(): assert isinstance(e, DependencyNotInstalledError) == True - return e + pytest.skip(f"{e}") else: pytest.fail(f"{e}") @@ -126,11 +126,10 @@ def test_total_is_direct_plus_indirect(effects_chap): def test_robustness_to_ravel_format(data, estimator, config, effects_chap): if "forest" in estimator: pytest.skip("Forest estimator skipped") - if not isinstance(effects_chap, DependencyNotInstalledError): - assert np.all( - get_estimation(data[0], data[1], data[2], - data[3], estimator, config)[0:5] - == pytest.approx( - effects_chap, nan_ok=True - ) # effects_chap is obtained with data[1].ravel() and data[3].ravel() - ) + assert np.all( + get_estimation(data[0], data[1], data[2], + data[3], estimator, config)[0:5] + == pytest.approx( + effects_chap, nan_ok=True + ) # effects_chap is obtained with data[1].ravel() and data[3].ravel() + ) From 33d88ea556fad45ba94ec734fef08b60620cc915 Mon Sep 17 00:00:00 2001 From: Mouad Date: Wed, 17 Apr 2024 15:18:34 +0200 Subject: [PATCH 32/33] testing code coverage --- .github/workflows/code-cov.yaml | 65 +++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 .github/workflows/code-cov.yaml diff --git a/.github/workflows/code-cov.yaml b/.github/workflows/code-cov.yaml new file mode 100644 index 0000000..e0077d4 --- /dev/null +++ b/.github/workflows/code-cov.yaml @@ -0,0 +1,65 @@ +name: CI-code-cov + +on: + push: + branches: [ main ] + pull_request: + branches: + - main + - develop + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.11' # Specify the Python version you want to use + + - name: Install Package in Editable Mode with Python Dependencies + run: | + python -m pip install --upgrade pip + pip install -e ".[dev]" + + - name: Setup R + uses: r-lib/actions/setup-r@v2 + with: + r-version: '4.3.2' # Use the R version you prefer + + - name: Install R packages + uses: r-lib/actions/setup-r-dependencies@v2 + with: + cache: true + cache-version: 1 + dependencies: 'NA' + install-pandoc: false + packages: | + grf + causalweight + mediation + + - name: Install plmed package + run: | + R -e "pak::pkg_install('ohines/plmed')" + + - name: Install Pytest and Coverage + run: | + pip install pytest pytest-cov + + - name: Run tests with coverage + run: | + pytest --cov=med_bench --cov-report=xml + + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v3 + with: + token: ${{ secrets.CODECOV_TOKEN }} + file: ./coverage.xml + fail_ci_if_error: true + verbose: true + From 9c8b3ddd403bb752bc5e6e71e078c79d5415be5e Mon Sep 17 00:00:00 2001 From: Mouad Date: Fri, 19 Apr 2024 11:30:25 +0200 Subject: [PATCH 33/33] test codecov & badge --- .github/workflows/code-cov.yaml | 9 ++++----- README.md | 2 ++ 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/code-cov.yaml b/.github/workflows/code-cov.yaml index e0077d4..8182928 100644 --- a/.github/workflows/code-cov.yaml +++ b/.github/workflows/code-cov.yaml @@ -56,10 +56,9 @@ jobs: pytest --cov=med_bench --cov-report=xml - name: Upload coverage to Codecov - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4.3.0 with: - token: ${{ secrets.CODECOV_TOKEN }} - file: ./coverage.xml - fail_ci_if_error: true - verbose: true + # token: ${{ secrets.CODECOV_TOKEN }} + token: 'e4829e41-01da-4d08-9e04-04443da957e3' + slug: judithabk6/med_bench diff --git a/README.md b/README.md index 8d7191c..b95d123 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +[![codecov](https://codecov.io/gh/judithabk6/med_bench/graph/badge.svg?token=PASB71N41D)](https://codecov.io/gh/judithabk6/med_bench) + # med_bench **med_bench** is a Python package designed to wrap the most common estimators for causal mediation analysis in a single framework. We additionally allow for some flexibility in the choice of nuisance parameters models.