diff --git a/tests/test_ttest.py b/tests/test_ttest.py index fd5e78d..cf2e60b 100644 --- a/tests/test_ttest.py +++ b/tests/test_ttest.py @@ -40,6 +40,7 @@ def test_ttest_ind_ol6_1(): assert result.delta.ci_upper == approx(0.808, abs=0.01) expected_summary = '''t(18) = 4.24; p < 0.001* +μ(Fresh) (SD) = 10.37 (0.32), μ(Stored) (SD) = 9.83 (0.24) Δμ (95% CI) = 0.54 (0.27–0.81), Fresh > Stored''' assert result.summary() == expected_summary diff --git a/yli/sig_tests.py b/yli/sig_tests.py index 2a63819..92bc5bc 100644 --- a/yli/sig_tests.py +++ b/yli/sig_tests.py @@ -35,13 +35,25 @@ class TTestResult: See :func:`yli.ttest_ind`. """ - def __init__(self, statistic, dof, pvalue, delta, delta_direction): + def __init__(self, statistic, dof, pvalue, group1, group2, mu1, mu2, sd1, sd2, delta, delta_direction): #: *t* statistic (*float*) self.statistic = statistic #: Degrees of freedom of the *t* distribution (*int*) self.dof = dof #: *p* value for the *t* statistic (*float*) self.pvalue = pvalue + #: Name of the first group (*str*) + self.group1 = group1 + #: Name of the second group (*str*) + self.group2 = group2 + #: Mean of the first group (*float*) + self.mu1 = mu1 + #: Mean of the second group (*float*) + self.mu2 = mu2 + #: Standard deviation of the first group (*float*) + self.sd1 = sd1 + #: Standard deviation of the second group (*float*) + self.sd2 = sd2 #: Absolute value of the mean difference (:class:`yli.utils.Estimate`) self.delta = delta #: Description of the direction of the effect (*str*) @@ -53,7 +65,7 @@ class TTestResult: return super().__repr__() def _repr_html_(self): - return 't({:.0f}) = {:.2f}; p {}
Δμ ({:g}% CI) = {}, {}'.format(self.dof, self.statistic, fmt_p(self.pvalue, html=True), (1-config.alpha)*100, self.delta.summary(), self.delta_direction) + return 't({:.0f}) = {:.2f}; p {}
μ{} (SD) = {:.2f} ({:.2f}), μ{} (SD) = {:.2f} ({:.2f})
Δμ ({:g}% CI) = {}, {}'.format(self.dof, self.statistic, fmt_p(self.pvalue, html=True), self.group1, self.mu1, self.sd1, self.group2, self.mu2, self.sd2, (1-config.alpha)*100, self.delta.summary(), self.delta_direction) def summary(self): """ @@ -62,7 +74,7 @@ class TTestResult: :rtype: str """ - return 't({:.0f}) = {:.2f}; p {}\nΔμ ({:g}% CI) = {}, {}'.format(self.dof, self.statistic, fmt_p(self.pvalue, html=False), (1-config.alpha)*100, self.delta.summary(), self.delta_direction) + return 't({:.0f}) = {:.2f}; p {}\nμ({}) (SD) = {:.2f} ({:.2f}), μ({}) (SD) = {:.2f} ({:.2f})\nΔμ ({:g}% CI) = {}, {}'.format(self.dof, self.statistic, fmt_p(self.pvalue, html=False), self.group1, self.mu1, self.sd1, self.group2, self.mu2, self.sd2, (1-config.alpha)*100, self.delta.summary(), self.delta_direction) def ttest_ind(df, dep, ind, *, nan_policy='warn'): """ @@ -106,8 +118,8 @@ def ttest_ind(df, dep, ind, *, nan_policy='warn'): # Do t test # Use statsmodels rather than SciPy because this provides the mean difference automatically - d1 = sm.stats.DescrStatsW(data1) - d2 = sm.stats.DescrStatsW(data2) + d1 = sm.stats.DescrStatsW(data1, ddof=1) + d2 = sm.stats.DescrStatsW(data2, ddof=1) cm = sm.stats.CompareMeans(d1, d2) statistic, pvalue, dof = cm.ttest_ind() @@ -115,11 +127,18 @@ def ttest_ind(df, dep, ind, *, nan_policy='warn'): delta = d1.mean - d2.mean ci0, ci1 = cm.tconfint_diff(config.alpha) - # t test is symmetric so take absolute values + # t test is symmetric so take absolute value + if d2.mean > d1.mean: + delta, ci0, ci1 = -delta, -ci1, -ci0 + d1, d2 = d2, d1 + group1, group2 = group2, group1 + # Now group1 > group2 + return TTestResult( statistic=abs(statistic), dof=dof, pvalue=pvalue, - delta=abs(Estimate(delta, ci0, ci1)), - delta_direction=('{0} > {1}' if d1.mean > d2.mean else '{1} > {0}').format(group1, group2)) + group1=group1, group2=group2, mu1=d1.mean, mu2=d2.mean, sd1=d1.std, sd2=d2.std, + delta=Estimate(delta, ci0, ci1), + delta_direction='{} > {}'.format(group1, group2)) # ------------- # One-way ANOVA