def test_cochransq(): #example from dataplot docs, Conovover p. 253 #http://www.itl.nist.gov/div898/software/dataplot/refman1/auxillar/cochran.htm x = np.array([[1, 1, 1], [1, 1, 1], [0, 1, 0], [1, 1, 0], [0, 0, 0], [1, 1, 1], [1, 1, 1], [1, 1, 0], [0, 0, 1], [0, 1, 0], [1, 1, 1], [1, 1, 1]]) res_qstat = 2.8 res_pvalue = 0.246597 res = cochrans_q(x) assert_almost_equal([res.statistic, res.pvalue], [res_qstat, res_pvalue]) #equivalence of mcnemar and cochranq for 2 samples a,b = x[:,:2].T res = cochrans_q(x[:, :2]) with pytest.deprecated_call(): assert_almost_equal(sbmcnemar(a, b, exact=False, correction=False), [res.statistic, res.pvalue])
def test_cochranq(): """ library(CVST) table1 = matrix(c(1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0), ncol=4, byrow=TRUE) rslt1 = cochranq.test(table1) table2 = matrix(c(0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0), ncol=5, byrow=TRUE) rslt2 = cochranq.test(table2) """ table = [[1, 0, 1, 1], [0, 1, 1, 1], [1, 1, 1, 0], [0, 1, 0, 0], [0, 1, 0, 0], [1, 0, 1, 0], [0, 1, 0, 0], [1, 1, 1, 1], [0, 1, 0, 0]] table = np.asarray(table) stat, pvalue, df = ctab.cochrans_q(table, return_object=False) assert_allclose(stat, 4.2) assert_allclose(df, 3) table = [[0, 0, 1, 1, 0], [0, 1, 0, 1, 0], [0, 1, 1, 0, 1], [1, 0, 0, 0, 1], [1, 1, 0, 0, 0], [1, 0, 1, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 1, 0], [0, 0, 0, 0, 0]] table = np.asarray(table) stat, pvalue, df = ctab.cochrans_q(table, return_object=False) assert_allclose(stat, 1.2174, rtol=1e-4) assert_allclose(df, 4) # Cochran's q and Mcnemar are equivalent for 2x2 tables data = table[:, 0:2] xtab = np.asarray(pd.crosstab(data[:, 0], data[:, 1])) b1 = ctab.cochrans_q(data, return_object=True) b2 = ctab.mcnemar(xtab, exact=False, correction=False) assert_allclose(b1.statistic, b2.statistic) assert_allclose(b1.pvalue, b2.pvalue) # Test for printing bunch assert_equal(str(b1).startswith("df 1\npvalue 0.65"), True)
def test_cochransq3(): # another example compared to SAS # in frequency weight format dt = [('A', 'S1'), ('B', 'S1'), ('C', 'S1'), ('count', int)] dta = np.array([('F', 'F', 'F', 6), ('U', 'F', 'F', 2), ('F', 'F', 'U', 16), ('U', 'F', 'U', 4), ('F', 'U', 'F', 2), ('U', 'U', 'F', 6), ('F', 'U', 'U', 4), ('U', 'U', 'U', 6)], dt) cases = np.array([[0, 0, 0], [1, 0, 0], [0, 0, 1], [1, 0, 1], [0, 1, 0], [1, 1, 0], [0, 1, 1], [1, 1, 1]]) count = np.array([ 6, 2, 16, 4, 2, 6, 4, 6]) data = np.repeat(cases, count, 0) res = cochrans_q(data) assert_allclose([res.statistic, res.pvalue], [8.4706, 0.0145], atol=5e-5)
def test_cochransq(): #example from dataplot docs, Conovover p. 253 #http://www.itl.nist.gov/div898/software/dataplot/refman1/auxillar/cochran.htm x = np.array([[1, 1, 1], [1, 1, 1], [0, 1, 0], [1, 1, 0], [0, 0, 0], [1, 1, 1], [1, 1, 1], [1, 1, 0], [0, 0, 1], [0, 1, 0], [1, 1, 1], [1, 1, 1]]) res_qstat = 2.8 res_pvalue = 0.246597 res = cochrans_q(x) assert_almost_equal([res.statistic, res.pvalue], [res_qstat, res_pvalue]) #equivalence of mcnemar and cochranq for 2 samples a, b = x[:, :2].T res = cochrans_q(x[:, :2]) with pytest.deprecated_call(): assert_almost_equal(sbmcnemar(a, b, exact=False, correction=False), [res.statistic, res.pvalue])
def test_cochranTest_tResult(self): x1, x2, x3, x4 = [1, 0, 1, 0, 1], [1, 1, 1, 1, 1], [0, 0, 0, 0, 0], [0, 1, 0, 1, 0] t1, p1 = cochran_q_test(x1, x2, x3, x4) t2, p2, df = cochrans_q(np.vstack([x1, x2, x3, x4]).T, return_object=False) assert pytest.approx(t1) == t2
def binomial_paired_group_cochranqtest(**kwargs): data = kwargs["data_numpy"] # procedure from: https://stats.stackexchange.com/questions/108047/cochrans-q-mcnemar-tests-together alpha = 0.05 result = cochrans_q(data) if result.pvalue <= alpha: return True, result.pvalue else: return False, result.pvalue
def cochrans_q(self, Features=None, Clstrs=None): """ Cochran’s Q test for identical binomial proportions Parameters ---------- Features: 2D_array_like The arrays must have the same shape, except in the dimension Clstrs: array_like Returns ---------- statistic: float test statistic pvalue: float or array pvalue from the chisquare distribution. Notes ---------- Cochran’s Q is a k-sample extension of the McNemar test. If there are only two groups, then Cochran’s Q test and the McNemar test are equivalent. The procedure tests that the probability of success is the same for every group. The alternative hypothesis is that at least two groups have a different probability of success. In Wikipedia terminology, rows are blocks and columns are treatments. The number of rows N, should be large for the chisquare distribution to be a good approximation. The Null hypothesis of the test is that all treatments have the same effect. References ---------- https://en.wikipedia.org/wiki/Cochran_test SAS Manual for NPAR TESTS """ if Features is None: Features = self.__data.columns[:-1].copy() if Clstrs is None: Clstrs = self.__data["Clusters"].copy() Clstrs = Clstrs.dropna().unique().tolist() Clstrs.sort() for feature in Features: print("\n\n", feature,"\n") sub = self.__data[[feature, "Clusters"]].copy() sub = sub.dropna() sub_df = [] for cluster in Clstrs: sub_df.append(sub[sub["Clusters"] == cluster][feature].values.tolist()) table = [*(x for x in sub_df)] res = contingency_tables.cochrans_q(table) if res.pvalue < 0.05: print("The feature", feature, "is significant for clusters", Clstrs) else: print("The feature", feature, "is not significant for clusters", Clstrs)
def test_cochransq3(): # another example compared to SAS # in frequency weight format dt = [('A', 'S1'), ('B', 'S1'), ('C', 'S1'), ('count', int)] dta = np.array([('F', 'F', 'F', 6), ('U', 'F', 'F', 2), ('F', 'F', 'U', 16), ('U', 'F', 'U', 4), ('F', 'U', 'F', 2), ('U', 'U', 'F', 6), ('F', 'U', 'U', 4), ('U', 'U', 'U', 6)], dt) cases = np.array([[0, 0, 0], [1, 0, 0], [0, 0, 1], [1, 0, 1], [0, 1, 0], [1, 1, 0], [0, 1, 1], [1, 1, 1]]) count = np.array([6, 2, 16, 4, 2, 6, 4, 6]) data = np.repeat(cases, count, 0) res = cochrans_q(data) assert_allclose([res.statistic, res.pvalue], [8.4706, 0.0145], atol=5e-5)
def test_cochransq2(): # from an example found on web, verifies 13.286 data = np.array(''' 0 0 0 1 0 0 0 1 0 0 0 1 1 1 1 1 1 0 0 1 0 1 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 1 1'''.split(), int).reshape(-1, 4) res = cochrans_q(data) assert_allclose([res.statistic, res.pvalue], [13.2857143, 0.00405776], rtol=1e-6)
def test_cochransq2(): # from an example found on web, verifies 13.286 data = np.array( ''' 0 0 0 1 0 0 0 1 0 0 0 1 1 1 1 1 1 0 0 1 0 1 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 1 1'''.split(), int).reshape(-1, 4) res = cochrans_q(data) assert_allclose([res.statistic, res.pvalue], [13.2857143, 0.00405776], rtol=1e-6)
def test_cochranq(): # library(CVST) # table1 = matrix(c(1, 0, 1, 1, # 0, 1, 1, 1, # 1, 1, 1, 0, # 0, 1, 0, 0, # 0, 1, 0, 0, # 1, 0, 1, 0, # 0, 1, 0, 0, # 1, 1, 1, 1, # 0, 1, 0, 0), ncol=4, byrow=TRUE) # rslt1 = cochranq.test(table1) # table2 = matrix(c(0, 0, 1, 1, 0, # 0, 1, 0, 1, 0, # 0, 1, 1, 0, 1, # 1, 0, 0, 0, 1, # 1, 1, 0, 0, 0, # 1, 0, 1, 0, 0, # 0, 1, 0, 0, 0, # 0, 0, 1, 1, 0, # 0, 0, 0, 0, 0), ncol=5, byrow=TRUE) # rslt2 = cochranq.test(table2) table = [[1, 0, 1, 1], [0, 1, 1, 1], [1, 1, 1, 0], [0, 1, 0, 0], [0, 1, 0, 0], [1, 0, 1, 0], [0, 1, 0, 0], [1, 1, 1, 1], [0, 1, 0, 0]] table = np.asarray(table) stat, pvalue, df = ctab.cochrans_q(table, return_object=False) assert_allclose(stat, 4.2) assert_allclose(df, 3) table = [[0, 0, 1, 1, 0], [0, 1, 0, 1, 0], [0, 1, 1, 0, 1], [1, 0, 0, 0, 1], [1, 1, 0, 0, 0], [1, 0, 1, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 1, 0], [0, 0, 0, 0, 0]] table = np.asarray(table) stat, pvalue, df = ctab.cochrans_q(table, return_object=False) assert_allclose(stat, 1.2174, rtol=1e-4) assert_allclose(df, 4) # Cochran's q and Mcnemar are equivalent for 2x2 tables data = table[:, 0:2] xtab = np.asarray(pd.crosstab(data[:, 0], data[:, 1])) b1 = ctab.cochrans_q(data, return_object=True) b2 = ctab.mcnemar(xtab, exact=False, correction=False) assert_allclose(b1.statistic, b2.statistic) assert_allclose(b1.pvalue, b2.pvalue) # Test for printing bunch assert_equal(str(b1).startswith("df 1\npvalue 0.65"), True)
def test_cochranq(): """ library(CVST) table1 = matrix(c(1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0), ncol=4, byrow=TRUE) rslt1 = cochranq.test(table1) table2 = matrix(c(0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0), ncol=5, byrow=TRUE) rslt2 = cochranq.test(table2) """ table = [ [1, 0, 1, 1], [0, 1, 1, 1], [1, 1, 1, 0], [0, 1, 0, 0], [0, 1, 0, 0], [1, 0, 1, 0], [0, 1, 0, 0], [1, 1, 1, 1], [0, 1, 0, 0], ] table = np.asarray(table) stat, pvalue, df = ctab.cochrans_q(table, return_object=False) assert_allclose(stat, 4.2) assert_allclose(df, 3) table = [ [0, 0, 1, 1, 0], [0, 1, 0, 1, 0], [0, 1, 1, 0, 1], [1, 0, 0, 0, 1], [1, 1, 0, 0, 0], [1, 0, 1, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 1, 0], [0, 0, 0, 0, 0], ] table = np.asarray(table) stat, pvalue, df = ctab.cochrans_q(table, return_object=False) assert_allclose(stat, 1.2174, rtol=1e-4) assert_allclose(df, 4) # Cochran's q and Mcnemar are equivalent for 2x2 tables data = table[:, 0:2] xtab = np.asarray(pd.crosstab(data[:, 0], data[:, 1])) b1 = ctab.cochrans_q(data, return_object=True) b2 = ctab.mcnemar(xtab, exact=False, correction=False) assert_allclose(b1.statistic, b2.statistic) assert_allclose(b1.pvalue, b2.pvalue)