|
6 | 6 |
|
7 | 7 | import numpy as np |
8 | 8 | import scipy |
| 9 | +import scipy.spatial |
| 10 | +import scipy.stats |
9 | 11 | from scipy.sparse import csr_matrix |
10 | 12 |
|
11 | 13 | from Orange.data import (Table, Domain, ContinuousVariable, |
12 | 14 | DiscreteVariable, StringVariable, Instance) |
13 | 15 | from Orange.distance import (Euclidean, SpearmanR, SpearmanRAbsolute, |
14 | 16 | PearsonR, PearsonRAbsolute, Manhattan, Cosine, |
15 | 17 | Jaccard, _preprocess, MahalanobisDistance) |
| 18 | +from Orange.distance.distance import _spearmanr2, _corrcoef2 |
16 | 19 | from Orange.misc import DistMatrix |
17 | 20 | from Orange.tests import named_file, test_filename |
18 | 21 | from Orange.util import OrangeDeprecationWarning |
@@ -598,6 +601,30 @@ def test_spearmanr_distance_numpy(self): |
598 | 601 | [0.3833333], |
599 | 602 | [0.]])) |
600 | 603 |
|
| 604 | + def test_spearmanr2(self): |
| 605 | + # Test that _spearnmanr2 returns the same result that stats.spearmanr |
| 606 | + # would |
| 607 | + n, m = tuple(np.random.randint(2, 5, size=2)) |
| 608 | + mean = np.random.uniform(-1, 1, size=m) |
| 609 | + cov = np.random.uniform(0, 1./m, size=(m, m)) |
| 610 | + cov = (cov + cov.T) / 2 |
| 611 | + cov.flat[::m + 1] = 1.0 |
| 612 | + X1 = np.random.multivariate_normal(mean, cov, size=n) |
| 613 | + X2 = np.random.multivariate_normal(mean, cov, size=n) |
| 614 | + expected = scipy.stats.spearmanr(X1, X2, axis=1)[0][:n, n:] |
| 615 | + np.testing.assert_almost_equal( |
| 616 | + _spearmanr2(X1, X2, axis=1), |
| 617 | + expected, |
| 618 | + decimal=9 |
| 619 | + ) |
| 620 | + |
| 621 | + expected = scipy.stats.spearmanr(X1, X2, axis=0)[0][:m, m:] |
| 622 | + np.testing.assert_almost_equal( |
| 623 | + _spearmanr2(X1, X2, axis=0), |
| 624 | + expected, |
| 625 | + decimal=9, |
| 626 | + ) |
| 627 | + |
601 | 628 |
|
602 | 629 | # noinspection PyTypeChecker |
603 | 630 | class TestSpearmanRAbsolute(TestCase): |
@@ -752,6 +779,32 @@ def test_pearsonr_distance_numpy(self): |
752 | 779 | [0.32783865], |
753 | 780 | [0.]])) |
754 | 781 |
|
| 782 | + def test_corrcoef2(self): |
| 783 | + # Test that _corrcoef2 returns the same result that np.corrcoef would |
| 784 | + n, m = tuple(np.random.randint(2, 5, size=2)) |
| 785 | + mean = np.random.uniform(-1, 1, size=m) |
| 786 | + cov = np.random.uniform(0, 1./m, size=(m, m)) |
| 787 | + cov = (cov + cov.T) / 2 |
| 788 | + cov.flat[::m + 1] = 1.0 |
| 789 | + X1 = np.random.multivariate_normal(mean, cov, size=n) |
| 790 | + X2 = np.random.multivariate_normal(mean, cov, size=n) |
| 791 | + expected = np.corrcoef(X1, X2, rowvar=True)[:n, n:] |
| 792 | + np.testing.assert_almost_equal( |
| 793 | + _corrcoef2(X1, X2, axis=1), |
| 794 | + expected, |
| 795 | + decimal=9 |
| 796 | + ) |
| 797 | + |
| 798 | + expected = np.corrcoef(X1, X2, rowvar=False)[:m, m:] |
| 799 | + np.testing.assert_almost_equal( |
| 800 | + _corrcoef2(X1, X2, axis=0), |
| 801 | + expected, |
| 802 | + decimal=9, |
| 803 | + ) |
| 804 | + |
| 805 | + with self.assertRaises(ValueError): |
| 806 | + _corrcoef2(X1, X2, axis=10) |
| 807 | + |
755 | 808 |
|
756 | 809 | # noinspection PyTypeChecker |
757 | 810 | class TestPearsonRAbsolute(TestCase): |
|
0 commit comments