def test_anova_r_adler(): """Test ANOVA accuracy by comparing with R (Adler dataset of car package) An unbalanced 3 by 2 independent measures design. """ from rpy2.robjects import r # "Adler" dataset r_require('car') ds = Dataset.from_r('Adler') # with balanced data dsb = ds.equalize_counts('expectation % instruction') dsb.to_r('AdlerB') aov = test.ANOVA('rating', 'instruction * expectation', ds=dsb) fs = run_on_lm_fitter('rating', 'instruction * expectation', dsb) fnds = run_as_ndanova('rating', 'instruction * expectation', dsb) print(r('a.aov <- aov(rating ~ instruction * expectation, AdlerB)')) print(r('a.summary <- summary(a.aov)')) r_res = r['a.summary'][0] assert_f_tests_equal(aov.f_tests, r_res, fs, fnds) # with unbalanced data; for Type II SS use car package aov = test.ANOVA('rating', 'instruction * expectation', ds=ds) fs = run_on_lm_fitter('rating', 'instruction * expectation', ds) fnds = run_as_ndanova('rating', 'instruction * expectation', ds) r_res = r("Anova(lm(rating ~ instruction * expectation, Adler, type=2))") assert_f_tests_equal(aov.f_tests, r_res, fs, fnds, 'Anova') # single predictor aov = test.ANOVA('rating', 'instruction', ds=ds) fs = run_on_lm_fitter('rating', 'instruction', ds) fnds = run_as_ndanova('rating', 'instruction', ds) r_res = r("Anova(lm(rating ~ instruction, Adler, type=2))") assert_f_test_equal(aov.f_tests[0], r_res, 0, fs[0], fnds[0], 'Anova')
def test_anova_r_sleep(): "Test ANOVA accuracy by comparing with R (sleep dataset)" from rpy2.robjects import r # "sleep" dataset print r('data(sleep)') ds = Dataset.from_r('sleep') ds['ID'].random = True # independent measures aov = test.ANOVA('extra', 'group', ds=ds) fs = run_on_lm_fitter('extra', 'group', ds) print r('sleep.aov <- aov(extra ~ group, sleep)') print r('sleep.summary <- summary(sleep.aov)') r_res = r['sleep.summary'][0] assert_f_test_equal(aov.f_tests[0], r_res, 0, fs[0]) # repeated measures aov = test.ANOVA('extra', 'group * ID', ds=ds) fs = run_on_lm_fitter('extra', 'group * ID', ds) print r('sleep.aov <- aov(extra ~ group + Error(ID / group), sleep)') print r('sleep.summary <- summary(sleep.aov)') r_res = r['sleep.summary'][1][0] assert_f_test_equal(aov.f_tests[0], r_res, 0, fs[0]) # unbalanced (independent measures) ds2 = ds[1:] print r('sleep2 <- subset(sleep, (group == 2) | (ID != 1))') aov = test.ANOVA('extra', 'group', ds=ds2) fs = run_on_lm_fitter('extra', 'group', ds2) print r('sleep2.aov <- aov(extra ~ group, sleep2)') print r('sleep2.summary <- summary(sleep2.aov)') r_res = r['sleep2.summary'][0] assert_f_test_equal(aov.f_tests[0], r_res, 0, fs[0])
def test_anova(): "Test ANOVA" from rpy2.robjects import r r_require('car') r_require('ez') ds = datasets.get_uv(nrm=True) ds.to_r('ds') # fixed effects aov = test.ANOVA('fltvar', 'A*B', ds=ds) print(aov) fs = run_on_lm_fitter('fltvar', 'A*B', ds) fnds = run_as_ndanova('fltvar', 'A*B', ds) r_res = r("Anova(lm(fltvar ~ A * B, ds, type=2))") assert_f_tests_equal(aov.f_tests, r_res, fs, fnds, 'Anova') # random effect aov = test.ANOVA('fltvar', 'A*B*rm', ds=ds) print(aov) fs = run_on_lm_fitter('fltvar', 'A*B*rm', ds) fnds = run_as_ndanova('fltvar', 'A*B*rm', ds) r('test.aov <- aov(fltvar ~ A * B + Error(rm / (A * B)), ds)') print(r('test.summary <- summary(test.aov)')) r_res = r['test.summary'][1:] assert_f_tests_equal(aov.f_tests, r_res, fs, fnds, 'rmaov') # nested random effect aov = test.ANOVA('fltvar', 'B + A%B + A * nrm(B)', ds=ds) print(aov) fs = run_on_lm_fitter('fltvar', 'B + A%B + A * nrm(B)', ds) fnds = run_as_ndanova('fltvar', 'B + A%B + A * nrm(B)', ds) r_res = r('ezANOVA(ds, fltvar, nrm, A, between=B)') assert_f_tests_equal(aov.f_tests, r_res, fs, fnds, 'ez') # not fully specified model with random effects assert_raises(NotImplementedError, test.anova, 'fltvar', 'A*rm', ds=ds) # empty cells dss = ds.sub("A%B != ('a2', 'b2')") assert_raises(NotImplementedError, test.anova, 'fltvar', 'A*B', ds=dss) assert_raises(NotImplementedError, run_on_lm_fitter, 'fltvar', 'A*B', ds=dss) dss = ds.sub("A%B != ('a1', 'b1')") assert_raises(NotImplementedError, test.anova, 'fltvar', 'A*B', ds=dss) assert_raises(NotImplementedError, run_on_lm_fitter, 'fltvar', 'A*B', ds=dss)
def test_lmfitter(): "Test the _nd_anova class" ds = datasets.get_uts() # independent, residuals vs. Hopkins y = ds['uts'].x x = ds.eval("A * B") lm = glm._nd_anova(x) f_maps = lm.map(y) p_maps = lm.p_maps(f_maps) x_full = ds.eval("A * B + ind(A%B)") lm_full = glm._nd_anova(x_full) assert isinstance(lm_full, glm._BalancedMixedNDANOVA) f_maps_full = lm_full.map(y) p_maps_full = lm_full.p_maps(f_maps) for f, f_full in zip(f_maps, f_maps_full): assert_allclose(f, f_full) for p, p_full in zip(p_maps, p_maps_full): assert_allclose(p, p_full) # repeated measures x = ds.eval("A * B * rm") lm = glm._nd_anova(x) f_maps = lm.map(y) p_maps = lm.p_maps(f_maps) aov = test.ANOVA(y[:, 0], x) for f_test, f_map, p_map in zip(aov.f_tests, f_maps, p_maps): assert f_map[0] == pytest.approx(f_test.F) assert p_map[0] == pytest.approx(f_test.p)
def loc_ress(self): # McCarthy & Wood tests loc_ress = {} for t1, t2 in combinations(self.terms.values(), 2): for i, hemi in enumerate(['lh', 'rh']): y1 = self.trf_dss[t1][self.metric].sub(source=self.masks[i]) y2 = self.trf_dss[t2][self.metric].sub(source=self.masks[i]) dy = normalize_in_cells(y1, 'source') - normalize_in_cells(y2, 'source') ds_dy = table.melt_ndvar(dy, 'source', ds=self.trf_dss[t1]) loc_ress[t1, t2, hemi] = loc_ress[t2, t1, hemi] = test.ANOVA(self.metric, 'source * subject', ds=ds_dy) return loc_ress
def test_anova(): "Test ANOVA" r_require('car') ds = datasets.get_uv(nrm=True) ds.to_r('ds') # fixed effects aov = test.ANOVA('fltvar', 'A*B', ds=ds) assert f'\n{aov}\n' == """ SS df MS F p --------------------------------------------------- A 28.69 1 28.69 25.69*** < .001 B 0.04 1 0.04 0.03 .855 A x B 1.16 1 1.16 1.04 .310 Residuals 84.85 76 1.12 --------------------------------------------------- Total 114.74 79 """ fs = run_on_lm_fitter('fltvar', 'A*B', ds) fnds = run_as_ndanova('fltvar', 'A*B', ds) r_res = r("Anova(lm(fltvar ~ A * B, ds, type=2))") assert_f_tests_equal(aov.f_tests, r_res, fs, fnds, 'Anova') # random effect aov = test.ANOVA('fltvar', 'A*B*rm', ds=ds) assert f'\n{aov}\n' == """ SS df MS MS(denom) df(denom) F p ----------------------------------------------------------------------- A 28.69 1 28.69 1.21 19 23.67*** < .001 B 0.04 1 0.04 1.15 19 0.03 .859 A x B 1.16 1 1.16 1.01 19 1.15 .297 ----------------------------------------------------------------------- Total 114.74 79 """ fs = run_on_lm_fitter('fltvar', 'A*B*rm', ds) fnds = run_as_ndanova('fltvar', 'A*B*rm', ds) r('test.aov <- aov(fltvar ~ A * B + Error(rm / (A * B)), ds)') print(r('test.summary <- summary(test.aov)')) r_res = r['test.summary'][1:] assert_f_tests_equal(aov.f_tests, r_res, fs, fnds, 'rmaov')
def test_anova_eq(): "Test ANOVA against r-ez" r_require('ez') ds = datasets.get_uv(nrm=True) ds.to_r('ds') # nested random effect aov_explicit = test.ANOVA('fltvar', 'A + B + A%B + nrm(B) + A%nrm(B)', ds=ds) aov = test.ANOVA('fltvar', 'A * B * nrm(B)', ds=ds) assert str(aov_explicit) == str(aov) print(aov) fs = run_on_lm_fitter('fltvar', 'A * B * nrm(B)', ds) fnds = run_as_ndanova('fltvar', 'A * B * nrm(B)', ds) r_res = r('ezANOVA(ds, fltvar, nrm, A, between=B)') assert_f_tests_equal(aov.f_tests, r_res, fs, fnds, 'ez') # sub parameter r1 = test.ANOVA('fltvar', 'B * rm', ds=ds.sub('A == "a1"')) r2 = test.ANOVA('fltvar', 'B * rm', sub='A == "a1"', ds=ds) assert str(r2) == str(r1) # not fully specified model with random effects with pytest.raises(IncompleteModel): test.anova('fltvar', 'A*rm', ds=ds) # unequal group size, 1-way sds = ds.sub("A == 'a1'").sub("nrm.isnotin(('s037', 's038', 's039'))") sds.to_r('sds') aov = test.ANOVA('fltvar', 'B * nrm(B)', ds=sds) print(aov) fs = run_on_lm_fitter('fltvar', 'B * nrm(B)', sds) fnds = run_as_ndanova('fltvar', 'B * nrm(B)', sds) with r_warning_filter: # type argument to ezANOVA r_res = r('ezANOVA(sds, fltvar, nrm, between=B)') assert_f_tests_equal(aov.f_tests, r_res, fs, fnds, 'ez') # unequal group size, 2-way sds = ds.sub("nrm.isnotin(('s037', 's038', 's039'))") sds.to_r('sds') aov = test.ANOVA('fltvar', 'A * B * nrm(B)', ds=sds) print(aov) fs = run_on_lm_fitter('fltvar', 'A * B * nrm(B)', sds) fnds = run_as_ndanova('fltvar', 'A * B * nrm(B)', sds) with r_warning_filter: # type argument to ezANOVA r_res = r('ezANOVA(sds, fltvar, nrm, A, between=B)') assert_f_tests_equal(aov.f_tests, r_res, fs, fnds, 'ez') # empty cells dss = ds.sub("A%B != ('a2', 'b2')") with pytest.raises(NotImplementedError): test.anova('fltvar', 'A*B', ds=dss) with pytest.raises(NotImplementedError): run_on_lm_fitter('fltvar', 'A*B', ds=dss) dss = ds.sub("A%B != ('a1', 'b1')") with pytest.raises(NotImplementedError): test.anova('fltvar', 'A*B', ds=dss) with pytest.raises(NotImplementedError): run_on_lm_fitter('fltvar', 'A*B', ds=dss)
def test_anova(): "Test ANOVA" r_require('car') ds = datasets.get_uv(nrm=True) ds.to_r('ds') # fixed effects aov = test.ANOVA('fltvar', 'A*B', ds=ds) print(aov) fs = run_on_lm_fitter('fltvar', 'A*B', ds) fnds = run_as_ndanova('fltvar', 'A*B', ds) r_res = r("Anova(lm(fltvar ~ A * B, ds, type=2))") assert_f_tests_equal(aov.f_tests, r_res, fs, fnds, 'Anova') # random effect aov = test.ANOVA('fltvar', 'A*B*rm', ds=ds) print(aov) fs = run_on_lm_fitter('fltvar', 'A*B*rm', ds) fnds = run_as_ndanova('fltvar', 'A*B*rm', ds) r('test.aov <- aov(fltvar ~ A * B + Error(rm / (A * B)), ds)') print(r('test.summary <- summary(test.aov)')) r_res = r['test.summary'][1:] assert_f_tests_equal(aov.f_tests, r_res, fs, fnds, 'rmaov')