From d040403e2b8898121be2234b05bb11c16cf07428 Mon Sep 17 00:00:00 2001 From: AMT-GEOX Date: Mon, 7 Nov 2022 07:07:25 +0000 Subject: [PATCH] Ad safety check for outlier dates and fix a typo in documentation PiperOrigin-RevId: 486573696 --- matched_markets/BUILD | 3 + matched_markets/csv/outlier_dataset.csv | 409 ++++++++++++++++++ matched_markets/methodology/tbrdiagnostics.py | 29 +- .../methodology/tbrmmdiagnostics.py | 2 +- matched_markets/tests/test_tbrdiagnostics.py | 13 + 5 files changed, 441 insertions(+), 15 deletions(-) create mode 100644 matched_markets/csv/outlier_dataset.csv diff --git a/matched_markets/BUILD b/matched_markets/BUILD index 1b3ec1f..a6b8053 100644 --- a/matched_markets/BUILD +++ b/matched_markets/BUILD @@ -126,6 +126,9 @@ py_test( srcs = [ "tests/test_tbrdiagnostics.py", ], + data = [ + "csv/outlier_dataset.csv", + ], python_version = "PY3", srcs_version = "PY3", deps = [ diff --git a/matched_markets/csv/outlier_dataset.csv b/matched_markets/csv/outlier_dataset.csv new file mode 100644 index 0000000..426b4a4 --- /dev/null +++ b/matched_markets/csv/outlier_dataset.csv @@ -0,0 +1,409 @@ +date,geo,group,response,cost,period +2018-11-05,114,1,2,1,0 +2018-11-05,114,1,0,0,0 +2018-11-05,36,2,0,0,0 +2018-11-05,40,2,0,0,0 +2018-11-05,3,1,0,0,0 +2018-11-05,158,1,0,0,0 +2018-11-05,179,1,0,0,0 +2018-11-05,139,1,0,0,0 +2018-11-05,9,2,0,0,0 +2018-11-05,145,1,0,0,0 +2018-11-05,68,2,0,0,0 +2018-11-05,17,1,0,0,0 +2018-11-15,114,1,0,0,0 +2018-11-15,36,2,2,1,0 +2018-11-15,40,2,0,0,0 +2018-11-15,3,1,0,0,0 +2018-11-15,158,1,0,0,0 +2018-11-15,179,1,0,0,0 +2018-11-15,139,1,0,0,0 +2018-11-15,9,2,0,0,0 +2018-11-15,145,1,0,0,0 +2018-11-15,68,2,0,0,0 +2018-11-15,17,1,0,0,0 +2018-11-24,114,1,0,0,0 +2018-11-24,36,2,0,0,0 +2018-11-24,40,2,2,1,0 +2018-11-24,3,1,0,0,0 +2018-11-24,158,1,0,0,0 +2018-11-24,179,1,0,0,0 +2018-11-24,139,1,0,0,0 +2018-11-24,9,2,0,0,0 +2018-11-24,145,1,0,0,0 +2018-11-24,68,2,0,0,0 +2018-11-24,17,1,0,0,0 +2018-12-04,114,1,0,0,0 +2018-12-04,36,2,0,0,0 +2018-12-04,40,2,0,0,0 +2018-12-04,3,1,2,1,0 +2018-12-04,158,1,0,0,0 +2018-12-04,179,1,0,0,0 +2018-12-04,139,1,0,0,0 +2018-12-04,9,2,0,0,0 +2018-12-04,145,1,0,0,0 +2018-12-04,68,2,0,0,0 +2018-12-04,17,1,0,0,0 +2018-12-07,114,1,0,0,0 +2018-12-07,36,2,0,0,0 +2018-12-07,40,2,0,0,0 +2018-12-07,3,1,0,0,0 +2018-12-07,158,1,2,1.798613,0 +2018-12-07,179,1,1,3.369762,0 +2018-12-07,139,1,0,0,0 +2018-12-07,9,2,0,0,0 +2018-12-07,145,1,0,0,0 +2018-12-07,68,2,0,0,0 +2018-12-07,17,1,0,0,0 +2018-12-08,114,1,0,0,0 +2018-12-08,36,2,1,1,0 +2018-12-08,40,2,0,0,0 +2018-12-08,3,1,0,0,0 +2018-12-08,158,1,0,0,0 +2018-12-08,179,1,0,0,0 +2018-12-08,139,1,1,1.989863,0 +2018-12-08,9,2,0,0,0 +2018-12-08,145,1,0,0,0 +2018-12-08,68,2,0,0,0 +2018-12-08,17,1,0,0,0 +2018-12-09,114,1,0,0,1 +2018-12-09,36,2,0,0,1 +2018-12-09,40,2,0,0,1 +2018-12-09,3,1,0,0,1 +2018-12-09,158,1,0,0,1 +2018-12-09,179,1,0,0,1 +2018-12-09,139,1,0,0,1 +2018-12-09,9,2,1,1,1 +2018-12-09,145,1,2,2.63,1 +2018-12-09,68,2,0,0,1 +2018-12-09,17,1,0,0,1 +2018-12-10,114,1,0,0,1 +2018-12-10,36,2,0,0,1 +2018-12-10,40,2,0,0,1 +2018-12-10,3,1,0,0,1 +2018-12-10,158,1,0,0,1 +2018-12-10,179,1,0,0,1 +2018-12-10,139,1,0,0,1 +2018-12-10,9,2,0,0,1 +2018-12-10,145,1,0,0,1 +2018-12-10,68,2,2,1,1 +2018-12-10,17,1,0,0,1 +2018-12-11,114,1,0,0,1 +2018-12-11,36,2,0,0,1 +2018-12-11,40,2,0,0,1 +2018-12-11,3,1,0,0,1 +2018-12-11,158,1,0,0,1 +2018-12-11,179,1,0,0,1 +2018-12-11,139,1,0,0,1 +2018-12-11,9,2,0,0,1 +2018-12-11,145,1,0,0,1 +2018-12-11,68,2,0,0,1 +2018-12-11,17,1,2,2.070241,1 +2018-11-06,114,1,0,0,0 +2018-11-06,36,2,0,0,0 +2018-11-06,40,2,0,0,0 +2018-11-06,3,1,0,0,0 +2018-11-06,158,1,0,0,0 +2018-11-06,179,1,0,0,0 +2018-11-06,139,1,0,0,0 +2018-11-06,9,2,0,0,0 +2018-11-06,145,1,0,0,0 +2018-11-06,68,2,0,0,0 +2018-11-06,17,1,0,0,0 +2018-11-07,114,1,0,0,0 +2018-11-07,36,2,0,0,0 +2018-11-07,40,2,0,0,0 +2018-11-07,3,1,0,0,0 +2018-11-07,158,1,0,0,0 +2018-11-07,179,1,0,0,0 +2018-11-07,139,1,0,0,0 +2018-11-07,9,2,0,0,0 +2018-11-07,145,1,0,0,0 +2018-11-07,68,2,0,0,0 +2018-11-07,17,1,0,0,0 +2018-11-08,114,1,0,0,0 +2018-11-08,36,2,0,0,0 +2018-11-08,40,2,0,0,0 +2018-11-08,3,1,0,0,0 +2018-11-08,158,1,0,0,0 +2018-11-08,179,1,0,0,0 +2018-11-08,139,1,0,0,0 +2018-11-08,9,2,0,0,0 +2018-11-08,145,1,0,0,0 +2018-11-08,68,2,0,0,0 +2018-11-08,17,1,0,0,0 +2018-11-09,114,1,0,0,0 +2018-11-09,36,2,0,0,0 +2018-11-09,40,2,0,0,0 +2018-11-09,3,1,0,0,0 +2018-11-09,158,1,0,0,0 +2018-11-09,179,1,0,0,0 +2018-11-09,139,1,0,0,0 +2018-11-09,9,2,0,0,0 +2018-11-09,145,1,0,0,0 +2018-11-09,68,2,0,0,0 +2018-11-09,17,1,0,0,0 +2018-11-10,114,1,0,0,0 +2018-11-10,36,2,0,0,0 +2018-11-10,40,2,0,0,0 +2018-11-10,3,1,0,0,0 +2018-11-10,158,1,0,0,0 +2018-11-10,179,1,0,0,0 +2018-11-10,139,1,0,0,0 +2018-11-10,9,2,0,0,0 +2018-11-10,145,1,0,0,0 +2018-11-10,68,2,0,0,0 +2018-11-10,17,1,0,0,0 +2018-11-11,114,1,0,0,0 +2018-11-11,36,2,0,0,0 +2018-11-11,40,2,0,0,0 +2018-11-11,3,1,0,0,0 +2018-11-11,158,1,0,0,0 +2018-11-11,179,1,0,0,0 +2018-11-11,139,1,0,0,0 +2018-11-11,9,2,0,0,0 +2018-11-11,145,1,0,0,0 +2018-11-11,68,2,0,0,0 +2018-11-11,17,1,0,0,0 +2018-11-12,114,1,0,0,0 +2018-11-12,36,2,0,0,0 +2018-11-12,40,2,0,0,0 +2018-11-12,3,1,0,0,0 +2018-11-12,158,1,0,0,0 +2018-11-12,179,1,0,0,0 +2018-11-12,139,1,0,0,0 +2018-11-12,9,2,0,0,0 +2018-11-12,145,1,0,0,0 +2018-11-12,68,2,0,0,0 +2018-11-12,17,1,0,0,0 +2018-11-13,114,1,0,0,0 +2018-11-13,36,2,0,0,0 +2018-11-13,40,2,0,0,0 +2018-11-13,3,1,0,0,0 +2018-11-13,158,1,0,0,0 +2018-11-13,179,1,0,0,0 +2018-11-13,139,1,0,0,0 +2018-11-13,9,2,0,0,0 +2018-11-13,145,1,0,0,0 +2018-11-13,68,2,0,0,0 +2018-11-13,17,1,0,0,0 +2018-11-14,114,1,0,0,0 +2018-11-14,36,2,0,0,0 +2018-11-14,40,2,0,0,0 +2018-11-14,3,1,0,0,0 +2018-11-14,158,1,0,0,0 +2018-11-14,179,1,0,0,0 +2018-11-14,139,1,0,0,0 +2018-11-14,9,2,0,0,0 +2018-11-14,145,1,0,0,0 +2018-11-14,68,2,0,0,0 +2018-11-14,17,1,0,0,0 +2018-11-16,114,1,0,0,0 +2018-11-16,36,2,0,0,0 +2018-11-16,40,2,0,0,0 +2018-11-16,3,1,0,0,0 +2018-11-16,158,1,0,0,0 +2018-11-16,179,1,0,0,0 +2018-11-16,139,1,0,0,0 +2018-11-16,9,2,0,0,0 +2018-11-16,145,1,0,0,0 +2018-11-16,68,2,0,0,0 +2018-11-16,17,1,0,0,0 +2018-11-17,114,1,0,0,0 +2018-11-17,36,2,0,0,0 +2018-11-17,40,2,0,0,0 +2018-11-17,3,1,0,0,0 +2018-11-17,158,1,0,0,0 +2018-11-17,179,1,0,0,0 +2018-11-17,139,1,0,0,0 +2018-11-17,9,2,0,0,0 +2018-11-17,145,1,0,0,0 +2018-11-17,68,2,0,0,0 +2018-11-17,17,1,0,0,0 +2018-11-18,114,1,0,0,0 +2018-11-18,36,2,0,0,0 +2018-11-18,40,2,0,0,0 +2018-11-18,3,1,0,0,0 +2018-11-18,158,1,0,0,0 +2018-11-18,179,1,0,0,0 +2018-11-18,139,1,0,0,0 +2018-11-18,9,2,0,0,0 +2018-11-18,145,1,0,0,0 +2018-11-18,68,2,0,0,0 +2018-11-18,17,1,0,0,0 +2018-11-19,114,1,0,0,0 +2018-11-19,36,2,0,0,0 +2018-11-19,40,2,0,0,0 +2018-11-19,3,1,0,0,0 +2018-11-19,158,1,0,0,0 +2018-11-19,179,1,0,0,0 +2018-11-19,139,1,0,0,0 +2018-11-19,9,2,0,0,0 +2018-11-19,145,1,0,0,0 +2018-11-19,68,2,0,0,0 +2018-11-19,17,1,0,0,0 +2018-11-20,114,1,0,0,0 +2018-11-20,36,2,0,0,0 +2018-11-20,40,2,0,0,0 +2018-11-20,3,1,0,0,0 +2018-11-20,158,1,0,0,0 +2018-11-20,179,1,0,0,0 +2018-11-20,139,1,0,0,0 +2018-11-20,9,2,0,0,0 +2018-11-20,145,1,0,0,0 +2018-11-20,68,2,0,0,0 +2018-11-20,17,1,0,0,0 +2018-11-21,114,1,0,0,0 +2018-11-21,36,2,0,0,0 +2018-11-21,40,2,0,0,0 +2018-11-21,3,1,0,0,0 +2018-11-21,158,1,0,0,0 +2018-11-21,179,1,0,0,0 +2018-11-21,139,1,0,0,0 +2018-11-21,9,2,0,0,0 +2018-11-21,145,1,0,0,0 +2018-11-21,68,2,0,0,0 +2018-11-21,17,1,0,0,0 +2018-11-22,114,1,0,0,0 +2018-11-22,36,2,0,0,0 +2018-11-22,40,2,0,0,0 +2018-11-22,3,1,0,0,0 +2018-11-22,158,1,0,0,0 +2018-11-22,179,1,0,0,0 +2018-11-22,139,1,0,0,0 +2018-11-22,9,2,0,0,0 +2018-11-22,145,1,0,0,0 +2018-11-22,68,2,0,0,0 +2018-11-22,17,1,0,0,0 +2018-11-23,114,1,0,0,0 +2018-11-23,36,2,0,0,0 +2018-11-23,40,2,0,0,0 +2018-11-23,3,1,0,0,0 +2018-11-23,158,1,0,0,0 +2018-11-23,179,1,0,0,0 +2018-11-23,139,1,0,0,0 +2018-11-23,9,2,0,0,0 +2018-11-23,145,1,0,0,0 +2018-11-23,68,2,0,0,0 +2018-11-23,17,1,0,0,0 +2018-11-25,114,1,0,0,0 +2018-11-25,36,2,0,0,0 +2018-11-25,40,2,0,0,0 +2018-11-25,3,1,0,0,0 +2018-11-25,158,1,0,0,0 +2018-11-25,179,1,0,0,0 +2018-11-25,139,1,0,0,0 +2018-11-25,9,2,0,0,0 +2018-11-25,145,1,0,0,0 +2018-11-25,68,2,0,0,0 +2018-11-25,17,1,0,0,0 +2018-11-26,114,1,0,0,0 +2018-11-26,36,2,0,0,0 +2018-11-26,40,2,0,0,0 +2018-11-26,3,1,0,0,0 +2018-11-26,158,1,0,0,0 +2018-11-26,179,1,0,0,0 +2018-11-26,139,1,0,0,0 +2018-11-26,9,2,0,0,0 +2018-11-26,145,1,0,0,0 +2018-11-26,68,2,0,0,0 +2018-11-26,17,1,0,0,0 +2018-11-27,114,1,0,0,0 +2018-11-27,36,2,0,0,0 +2018-11-27,40,2,0,0,0 +2018-11-27,3,1,0,0,0 +2018-11-27,158,1,0,0,0 +2018-11-27,179,1,0,0,0 +2018-11-27,139,1,0,0,0 +2018-11-27,9,2,0,0,0 +2018-11-27,145,1,0,0,0 +2018-11-27,68,2,0,0,0 +2018-11-27,17,1,0,0,0 +2018-11-28,114,1,0,0,0 +2018-11-28,36,2,0,0,0 +2018-11-28,40,2,0,0,0 +2018-11-28,3,1,0,0,0 +2018-11-28,158,1,0,0,0 +2018-11-28,179,1,0,0,0 +2018-11-28,139,1,0,0,0 +2018-11-28,9,2,0,0,0 +2018-11-28,145,1,0,0,0 +2018-11-28,68,2,0,0,0 +2018-11-28,17,1,0,0,0 +2018-11-29,114,1,0,0,0 +2018-11-29,36,2,0,0,0 +2018-11-29,40,2,0,0,0 +2018-11-29,3,1,0,0,0 +2018-11-29,158,1,0,0,0 +2018-11-29,179,1,0,0,0 +2018-11-29,139,1,0,0,0 +2018-11-29,9,2,0,0,0 +2018-11-29,145,1,0,0,0 +2018-11-29,68,2,0,0,0 +2018-11-29,17,1,0,0,0 +2018-11-30,114,1,0,0,0 +2018-11-30,36,2,0,0,0 +2018-11-30,40,2,0,0,0 +2018-11-30,3,1,0,0,0 +2018-11-30,158,1,0,0,0 +2018-11-30,179,1,0,0,0 +2018-11-30,139,1,0,0,0 +2018-11-30,9,2,0,0,0 +2018-11-30,145,1,0,0,0 +2018-11-30,68,2,0,0,0 +2018-11-30,17,1,0,0,0 +2018-12-01,114,1,0,0,0 +2018-12-01,36,2,0,0,0 +2018-12-01,40,2,0,0,0 +2018-12-01,3,1,0,0,0 +2018-12-01,158,1,0,0,0 +2018-12-01,179,1,0,0,0 +2018-12-01,139,1,0,0,0 +2018-12-01,9,2,0,0,0 +2018-12-01,145,1,0,0,0 +2018-12-01,68,2,0,0,0 +2018-12-01,17,1,0,0,0 +2018-12-02,114,1,0,0,0 +2018-12-02,36,2,0,0,0 +2018-12-02,40,2,0,0,0 +2018-12-02,3,1,0,0,0 +2018-12-02,158,1,0,0,0 +2018-12-02,179,1,0,0,0 +2018-12-02,139,1,0,0,0 +2018-12-02,9,2,0,0,0 +2018-12-02,145,1,0,0,0 +2018-12-02,68,2,0,0,0 +2018-12-02,17,1,0,0,0 +2018-12-03,114,1,0,0,0 +2018-12-03,36,2,0,0,0 +2018-12-03,40,2,0,0,0 +2018-12-03,3,1,0,0,0 +2018-12-03,158,1,0,0,0 +2018-12-03,179,1,0,0,0 +2018-12-03,139,1,0,0,0 +2018-12-03,9,2,0,0,0 +2018-12-03,145,1,0,0,0 +2018-12-03,68,2,0,0,0 +2018-12-03,17,1,0,0,0 +2018-12-05,114,1,0,0,0 +2018-12-05,36,2,0,0,0 +2018-12-05,40,2,0,0,0 +2018-12-05,3,1,0,0,0 +2018-12-05,158,1,0,0,0 +2018-12-05,179,1,0,0,0 +2018-12-05,139,1,0,0,0 +2018-12-05,9,2,0,0,0 +2018-12-05,145,1,0,0,0 +2018-12-05,68,2,0,0,0 +2018-12-05,17,1,0,0,0 +2018-12-06,114,1,0,0,0 +2018-12-06,36,2,0,0,0 +2018-12-06,40,2,0,0,0 +2018-12-06,3,1,0,0,0 +2018-12-06,158,1,0,0,0 +2018-12-06,179,1,0,0,0 +2018-12-06,139,1,0,0,0 +2018-12-06,9,2,0,0,0 +2018-12-06,145,1,0,0,0 +2018-12-06,68,2,0,0,0 +2018-12-06,17,1,0,0,0 \ No newline at end of file diff --git a/matched_markets/methodology/tbrdiagnostics.py b/matched_markets/methodology/tbrdiagnostics.py index 33f97ff..77137ba 100644 --- a/matched_markets/methodology/tbrdiagnostics.py +++ b/matched_markets/methodology/tbrdiagnostics.py @@ -222,20 +222,21 @@ def _detect_outliers(self, max_prob): A list of dates (in the data set) that were detected to be outliers. """ excluded_dates = [] - while True: - data_subset = self._analysis_data.drop(excluded_dates) - if data_subset.shape[0] == 0: - break - reg_fit = smf.ols('y ~ x', data=data_subset).fit() - absresid = abs(OLSInfluence(reg_fit).get_resid_studentized_external()) - pretest_len = data_subset.shape[0] - len(excluded_dates) - beta_quantile = stats.beta.ppf(1 - max_prob, pretest_len, 1) - threshold = stats.t.ppf((1 + beta_quantile) / 2, df=pretest_len - 3) - max_resid = max(absresid) - if max_resid < threshold: - break - exclude_date = list(data_subset.index[absresid == max_resid]) - excluded_dates.extend(exclude_date) + if self._correlation_test(min_cor=0.5, prefer_cor=0.8, credible_level=0.95): + while True: + data_subset = self._analysis_data.drop(excluded_dates) + if data_subset.shape[0] == 0: + break + reg_fit = smf.ols('y ~ x', data=data_subset).fit() + absresid = abs(OLSInfluence(reg_fit).get_resid_studentized_external()) + pretest_len = data_subset.shape[0] - len(excluded_dates) + beta_quantile = stats.beta.ppf(1 - max_prob, pretest_len, 1) + threshold = stats.t.ppf((1 + beta_quantile) / 2, df=pretest_len - 3) + max_resid = max(absresid) + if max_resid < threshold: + break + exclude_date = list(data_subset.index[absresid == max_resid]) + excluded_dates.extend(exclude_date) return excluded_dates diff --git a/matched_markets/methodology/tbrmmdiagnostics.py b/matched_markets/methodology/tbrmmdiagnostics.py index 2948b2c..59a86b2 100644 --- a/matched_markets/methodology/tbrmmdiagnostics.py +++ b/matched_markets/methodology/tbrmmdiagnostics.py @@ -352,7 +352,7 @@ def tbrfit(self, xt: float, yt: float) -> Optional[TBRFit]: sqrt((1 + dx^2/var(x, ddof=0))/n + 1/n_test) Here, x = 'control', y = 'treatment', where - dx = test period mean of x - pretest period mean of y + dx = test period mean of x - pretest period mean of x dy = test period mean of y - pretest period mean of y b = coefficient of 'x' in the TBR regression equation y = a + bx + e. n_test = number of test period time points. diff --git a/matched_markets/tests/test_tbrdiagnostics.py b/matched_markets/tests/test_tbrdiagnostics.py index 130423f..58e3faf 100644 --- a/matched_markets/tests/test_tbrdiagnostics.py +++ b/matched_markets/tests/test_tbrdiagnostics.py @@ -23,6 +23,7 @@ import pandas as pd from scipy import stats + import unittest CSV_PATH = 'matched_markets/csv/' @@ -211,6 +212,18 @@ def testThereAreOutliers(self): tbrdiag.fit(perturbed_data) self.assertEqual(tbrdiag._diagnostics['outlier_dates'], [bad_date]) + def testOutlierDatesWithNoCorrelation(self): + """Tests that we avoid an infinite loop if there is no correlation.""" + + tbrdiag = tbrdiagnostics.TBRDiagnostics() + # Read in the csv file. + with open( + os.path.join("", CSV_PATH, + 'outlier_dataset.csv')) as csvfile: + data = pd.read_csv(csvfile, parse_dates=['date']) + tbrdiag.fit(data) + self.assertEmpty(tbrdiag._diagnostics['outlier_dates']) + def testNoisyGeos(self): """Tests that noisy geos are detected."""