diff --git a/ComStats/comstats.py b/ComStats/comstats.py index 5312354..1b36b04 100644 --- a/ComStats/comstats.py +++ b/ComStats/comstats.py @@ -16,7 +16,7 @@ def weighted_t_test_(v, weights): weighted_count = np.nansum(weights, axis=1) mean = np.nansum(v * weights, axis=1) / np.nansum(weights, axis=1) t_nom = mean[:, np.newaxis] - mean - var = np.sqrt(np.nansum(((v.T - mean)**2) * weights.T, axis=0) / np.nansum(weights, axis=1))**2 + var = np.sqrt(np.nansum(((v.T - mean)**2) * weights.T, axis=0) / (np.nansum(weights, axis=1) - 1)) t_denom = weighted_count * var + weighted_count[:, np.newaxis] * var[:, np.newaxis] inv_base = 1/weighted_count + 1/weighted_count[:, np.newaxis] dof = base + base[:, np.newaxis] - 2 diff --git a/test/test_stats.py b/test/test_stats.py index cadcd70..09e698c 100644 --- a/test/test_stats.py +++ b/test/test_stats.py @@ -12,10 +12,18 @@ def setUp(self): [3, 0, 1, 3, 0, 0, 2, 1, 2, 3, 3, 1, 0, 0, 2] ]) self.weights = np.array([ - [1, 0.1, 0.2, 0.3, 2, 0.1, 0.1, 2, 0.1, 0.1, 0.2, 0.1, 0.3, 0.4, 1], - [1, 0.1, 0.2, 0.3, 2, 0.1, 0.1, 2, 0.1, 0.1, 0.2, 0.1, 0.3, 0.4, 1], - [1, 0.1, 0.2, 0.3, 2, 0.1, 0.1, 2, 0.1, 0.1, 0.2, 0.1, 0.3, 0.4, 1], - [1, 0.1, 0.2, 0.3, 2, 0.1, 0.1, 2, 0.1, 0.1, 0.2, 0.1, 0.3, 0.4, 1] + [1.875000, 0.187500, 0.375000, 0.562500, 3.750000, 0.187500, + 0.187500, 3.750000, 0.187500, 0.187500, 0.375000, 0.187500, + 0.562500, 0.750000, 1.875000], + [1.875000, 0.187500, 0.375000, 0.562500, 3.750000, 0.187500, + 0.187500, 3.750000, 0.187500, 0.187500, 0.375000, 0.187500, + 0.562500, 0.750000, 1.875000], + [1.875000, 0.187500, 0.375000, 0.562500, 3.750000, 0.187500, + 0.187500, 3.750000, 0.187500, 0.187500, 0.375000, 0.187500, + 0.562500, 0.750000, 1.875000], + [1.875000, 0.187500, 0.375000, 0.562500, 3.750000, 0.187500, + 0.187500, 3.750000, 0.187500, 0.187500, 0.375000, 0.187500, + 0.562500, 0.750000, 1.875000] ]) self.percentage_input_set = np.array([ [0.1, 0.05, 0.05, 0.1, 0.6, 0.0, 0.4, 0.1, 0.1, 0.05, 0.1, 0.0, 0.0, 0.0, 0.1], @@ -98,27 +106,27 @@ def test_unweighted_t_test_equal_variance_one_sided(self): self.assertTrue((scores.round(8) == expected_scores).all()) def test_weighted_t_test(self): - expected_p_values = [[ 1.00000000e+00, 1.42077000e-03, 5.10308380e-01, 7.37402900e-02], - [ 1.42077000e-03, 1.00000000e+00, 6.57160000e-04, 8.87667500e-02], - [ 5.10308380e-01, 6.57160000e-04, 1.00000000e+00, 3.35990600e-02], - [ 7.37402900e-02, 8.87667500e-02, 3.35990600e-02, 1.00000000e+00]] - expected_scores = [[ 0. , -3.53992642, 0.66687841, -1.85781692], - [ 3.53992642, 0. , 3.83253879, 1.76327075], - [-0.66687841, -3.83253879, 0. , -2.23466985], - [ 1.85781692, -1.76327075, 2.23466985, 0. ]] + expected_p_values = [[ 1.0000000e+00, 5.4909000e-04, 6.4793643e-01, 8.8074170e-02], + [ 5.4909000e-04, 1.0000000e+00, 2.3130000e-04, 5.4144420e-02], + [ 6.4793643e-01, 2.3130000e-04, 1.0000000e+00, 4.2462860e-02], + [ 8.8074170e-02, 5.4144420e-02, 4.2462860e-02, 1.0000000e+00]] + expected_scores = [[ 0. , -3.89999446, 0.46159717, -1.76731592], + [ 3.89999446, 0. , 4.22167128, 2.01009271], + [ -0.46159717, -4.22167128, 0. , -2.12593206], + [ 1.76731592, -2.01009271, 2.12593206, 0. ]] p_values, scores = comstats.t_test(self.input_set, self.weights, {'paired': False, 'equal_variance': False}) self.assertTrue((p_values.round(8) == expected_p_values).all()) self.assertTrue((scores.round(8) == expected_scores).all()) def test_weighted_t_test_one_sided(self): - expected_p_values = [[ 5.00000000e-01, 7.10380000e-04, 2.55154190e-01, 3.68701500e-02], - [ 7.10380000e-04, 5.00000000e-01, 3.28580000e-04, 4.43833800e-02], - [ 2.55154190e-01, 3.28580000e-04, 5.00000000e-01, 1.67995300e-02], - [ 3.68701500e-02, 4.43833800e-02, 1.67995300e-02, 5.00000000e-01]] - expected_scores = [[ 0. , -3.53992642, 0.66687841, -1.85781692], - [ 3.53992642, 0. , 3.83253879, 1.76327075], - [-0.66687841, -3.83253879, 0. , -2.23466985], - [ 1.85781692, -1.76327075, 2.23466985, 0. ]] + expected_p_values = [[ 5.0000000e-01, 2.7454000e-04, 3.2396821e-01, 4.4037080e-02], + [ 2.7454000e-04, 5.0000000e-01, 1.1565000e-04, 2.7072210e-02], + [ 3.2396821e-01, 1.1565000e-04, 5.0000000e-01, 2.1231430e-02], + [ 4.4037080e-02, 2.7072210e-02, 2.1231430e-02, 5.0000000e-01]] + expected_scores = [[ 0. , -3.89999446, 0.46159717, -1.76731592], + [ 3.89999446, 0. , 4.22167128, 2.01009271], + [ -0.46159717, -4.22167128, 0. , -2.12593206], + [ 1.76731592, -2.01009271, 2.12593206, 0. ]] p_values, scores = comstats.t_test(self.input_set, self.weights, {'paired': False, 'equal_variance': False}, True) self.assertTrue((p_values.round(8) == expected_p_values).all()) self.assertTrue((scores.round(8) == expected_scores).all())