Skip to content

Commit eb67d0b

Browse files
authored
[FIX] p-values going to zero, replace with epsilon (#124)
* fix and test small p_values * fix flake8
1 parent e94ddf3 commit eb67d0b

File tree

3 files changed

+41
-2
lines changed

3 files changed

+41
-2
lines changed

pymare/results.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -84,16 +84,18 @@ def get_fe_stats(self, alpha=0.05):
8484
=========== ==========================================================================
8585
"""
8686
beta, se = self.fe_params, self.fe_se
87+
epsilon = np.finfo(beta.dtype).eps
8788
z_se = ss.norm.ppf(1 - alpha / 2)
8889
z = beta / se
89-
90+
p = 1 - np.abs(0.5 - ss.norm.cdf(z)) * 2
91+
p[p == 0] += epsilon
9092
stats = {
9193
"est": beta,
9294
"se": se,
9395
"ci_l": beta - z_se * se,
9496
"ci_u": beta + z_se * se,
9597
"z": z,
96-
"p": 1 - np.abs(0.5 - ss.norm.cdf(z)) * 2,
98+
"p": p,
9799
}
98100

99101
return stats

pymare/tests/conftest.py

+15
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,27 @@ def variables():
1515
return (y, v, X)
1616

1717

18+
@pytest.fixture(scope="package")
19+
def small_variance_variables(variables):
20+
"""Make highly correlated variables."""
21+
y, v, X = variables
22+
y = X.copy()
23+
v /= 10
24+
return (y, v, X)
25+
26+
1827
@pytest.fixture(scope="package")
1928
def dataset(variables):
2029
"""Build a Dataset compiled from the variables fixture."""
2130
return Dataset(*variables, X_names=["my_covariate"])
2231

2332

33+
@pytest.fixture(scope="package")
34+
def small_variance_dataset(small_variance_variables):
35+
"""Build a Dataset compiled from the small variance variables fixture."""
36+
return Dataset(*small_variance_variables, X_names=["my_covariate"])
37+
38+
2439
@pytest.fixture(scope="package")
2540
def small_dataset_2d(variables):
2641
"""Build a small Dataset with 2D data."""

pymare/tests/test_results.py

+22
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,25 @@ def fitted_estimator(dataset):
2121
return est.fit_dataset(dataset)
2222

2323

24+
@pytest.fixture
25+
def small_variance_estimator(small_variance_dataset):
26+
"""Create a fitted Estimator with small variances as a fixture."""
27+
est = DerSimonianLaird()
28+
return est.fit_dataset(small_variance_dataset)
29+
30+
2431
@pytest.fixture
2532
def results(fitted_estimator):
2633
"""Create a results object as a fixture."""
2734
return fitted_estimator.summary()
2835

2936

37+
@pytest.fixture
38+
def small_variance_results(small_variance_estimator):
39+
"""Create a results object with small variances as a fixture."""
40+
return small_variance_estimator.summary()
41+
42+
3043
@pytest.fixture
3144
def results_2d(fitted_estimator, dataset_2d):
3245
"""Create a 2D results object as a fixture."""
@@ -169,6 +182,15 @@ def test_mrr_to_df(results):
169182
assert np.allclose(df["p-value"].values, [0.9678, 0.4369], atol=1e-4)
170183

171184

185+
def test_small_variance_mrr_to_df(small_variance_results):
186+
"""Test conversion of MetaRegressionResults to DataFrame."""
187+
df = small_variance_results.to_df()
188+
assert df.shape == (2, 7)
189+
col_names = {"estimate", "p-value", "z-score", "ci_0.025", "ci_0.975", "se", "name"}
190+
assert set(df.columns) == col_names
191+
assert np.allclose(df["p-value"].values, [1, np.finfo(np.float64).eps], atol=1e-4)
192+
193+
172194
def test_estimator_summary(dataset):
173195
"""Test Estimator's summary method."""
174196
est = WeightedLeastSquares()

0 commit comments

Comments
 (0)