def test_ftest_power(): #equivalence ftest, ttest for alpha in [0.01, 0.05, 0.1, 0.20, 0.50]: res0 = smp.ttest_power(0.01, 200, alpha) res1 = smp.ftest_power(0.01, 199, 1, alpha=alpha, ncc=0) assert_almost_equal(res1, res0, decimal=6) #example from Gplus documentation F-test ANOVA #Total sample size:200 #Effect size "f":0.25 #Beta/alpha ratio:1 #Result: #Alpha:0.1592 #Power (1-beta):0.8408 #Critical F:1.4762 #Lambda: 12.50000 res1 = smp.ftest_anova_power(0.25, 200, 0.1592, k_groups=10) res0 = 0.8408 assert_almost_equal(res1, res0, decimal=4) # TODO: no class yet # examples agains R::pwr res2 = Holder() #> rf = pwr.f2.test(u=5, v=199, f2=0.1**2, sig.level=0.01) #> cat_items(rf, "res2.") res2.u = 5 res2.v = 199 res2.f2 = 0.01 res2.sig_level = 0.01 res2.power = 0.0494137732920332 res2.method = 'Multiple regression power calculation' res1 = smp.ftest_power(np.sqrt(res2.f2), res2.v, res2.u, alpha=res2.sig_level, ncc=1) assert_almost_equal(res1, res2.power, decimal=5) res2 = Holder() #> rf = pwr.f2.test(u=5, v=199, f2=0.3**2, sig.level=0.01) #> cat_items(rf, "res2.") res2.u = 5 res2.v = 199 res2.f2 = 0.09 res2.sig_level = 0.01 res2.power = 0.7967191006290872 res2.method = 'Multiple regression power calculation' res1 = smp.ftest_power(np.sqrt(res2.f2), res2.v, res2.u, alpha=res2.sig_level, ncc=1) assert_almost_equal(res1, res2.power, decimal=5) res2 = Holder() #> rf = pwr.f2.test(u=5, v=19, f2=0.3**2, sig.level=0.1) #> cat_items(rf, "res2.") res2.u = 5 res2.v = 19 res2.f2 = 0.09 res2.sig_level = 0.1 res2.power = 0.235454222377575 res2.method = 'Multiple regression power calculation' res1 = smp.ftest_power(np.sqrt(res2.f2), res2.v, res2.u, alpha=res2.sig_level, ncc=1) assert_almost_equal(res1, res2.power, decimal=5)
def test_ols_noncentrality(self): k = self.k_groups res_ols = OLS(self.y, self.ex).fit() nobs_t = res_ols.model.nobs # constraint c_equal = -np.eye(k)[1:] c_equal[:, 0] = 1 v = np.zeros(c_equal.shape[0]) # noncentrality at estimated parameters wt = res_ols.wald_test(c_equal, scalar=True) df_num, df_denom = wt.df_num, wt.df_denom cov_p = res_ols.cov_params() nc_wt = wald_test_noncent_generic(res_ols.params, c_equal, v, cov_p, diff=None, joint=True) assert_allclose(nc_wt, wt.statistic * wt.df_num, rtol=1e-13) nc_wt2 = wald_test_noncent(res_ols.params, c_equal, v, res_ols, diff=None, joint=True) assert_allclose(nc_wt2, nc_wt, rtol=1e-13) es_ols = nc_wt / nobs_t es_oneway = smo.effectsize_oneway(res_ols.params, res_ols.scale, self.nobs, use_var="equal") assert_allclose(es_ols, es_oneway, rtol=1e-13) alpha = 0.05 pow_ols = smpwr.ftest_power(np.sqrt(es_ols), df_denom, df_num, alpha, ncc=1) pow_oneway = smpwr.ftest_anova_power(np.sqrt(es_oneway), nobs_t, alpha, k_groups=k, df=None) assert_allclose(pow_ols, pow_oneway, rtol=1e-13) # noncentrality at other params params_alt = res_ols.params * 0.75 # compute constraint value so we can get noncentrality from wald_test v_off = _offset_constraint(c_equal, res_ols.params, params_alt) wt_off = res_ols.wald_test((c_equal, v + v_off), scalar=True) nc_wt_off = wald_test_noncent_generic(params_alt, c_equal, v, cov_p, diff=None, joint=True) assert_allclose(nc_wt_off, wt_off.statistic * wt_off.df_num, rtol=1e-13) # check vectorized version, joint=False nc_wt_vec = wald_test_noncent_generic(params_alt, c_equal, v, cov_p, diff=None, joint=False) for i in range(c_equal.shape[0]): nc_wt_i = wald_test_noncent_generic( params_alt, c_equal[i:i + 1], # noqa v[i:i + 1], cov_p, diff=None, # noqa joint=False) assert_allclose(nc_wt_vec[i], nc_wt_i, rtol=1e-13)