def test_correct(): """Testing function correct""" # Random input 1-D array p of random size and with 2 nan enteries size = random.randint(1, 5) p = np.random.rand(size, ) idx = random.randint(0, int(size / 3)) p[idx] = np.nan p[2 * idx] = np.nan p_isnan = np.zeros(p.shape, dtype=bool) p_isnan[idx] = True p_isnan[2 * idx] = True p_isnotnan = np.logical_not(p_isnan) # Test output for different correction values q_uncorrected = my_crt.correct(p) q_bonferroni = my_crt.correct(p, correction="bonferroni") q_fdr = my_crt.correct(p, correction="fdr") assert_array_almost_equal(q_uncorrected, p) for q in [q_uncorrected, q_bonferroni, q_fdr]: assert_array_equal(p_isnan, np.isnan(q)) assert_true(np.all(p[p_isnotnan] <= q[p_isnotnan])) # Check error is raised for unkown value of correction with assert_raises_regexp(ValueError, "Unknown correction."): my_crt.correct(p, correction="blabla")
def statistical_test(df, conditions, estimators={'kind': 'tangent', 'cov_estimator': None}, p_correction="fdr", n_jobs=1): grouped = df.groupby(["condition", "subj_id"]) dict_list = list() entries = ("baseline", "mean signif baseline", "follow up", "mean signif follow up", "comparison", "tstat", "pval", "mean signif comparison") for (ix1_, condition1) in enumerate(conditions): for (ix2_, condition2) in enumerate(conditions): if ix1_ <= ix2_: continue cond = list() grouped = df.groupby("subj_id") for _, group in grouped: cond.append(group[group["condition"] == condition1] ["region_signals"].iloc[0]) cond.append(group[group["condition"] == condition2] ["region_signals"].iloc[0]) X = CovEmbedding(**estimators).fit_transform(cond) X = [vec_to_sym(x) for x in X] X = np.asarray(X) X = sym_to_vec(X, isometry=False) Y = var_stabilize(X, estimators['kind']) t_stat_baseline, p_baseline = scipy.stats.ttest_1samp(Y[::2, ...], 0.0, axis=0) q_baseline = pval_correction.correct(p_baseline, correction=p_correction) q_baseline[np.isnan(q_baseline)] = 0. baseline_signif = np.tanh(Y[::2, ...]).mean(axis=0) * (q_baseline < 0.05) t_stat_followup, p_followup = scipy.stats.ttest_1samp(Y[1::2, ...], 0.0, axis=0) q_followup = pval_correction.correct(p_followup, correction=p_correction) q_followup[np.isnan(q_followup)] = 0. followup_signif = np.tanh(Y[1::2, ...]).mean(axis=0) * (q_followup < 0.05) t_stat, p = scipy.stats.ttest_rel(Y[::2, ...], Y[1::2, ...], axis=0) q = pval_correction.correct(p, correction=p_correction) q[np.isnan(q)] = 0. comp_signif = (np.tanh(Y[1::2, ...])- np.tanh(Y[::2, ...])).mean(axis=0) * \ (q < 0.05) * (np.minimum(q_baseline, q_followup) < 0.05 ) print "{} vs. {}: t_stat = {}, q-val = {}".format( condition1, condition2, t_stat, q) dict_list.append( dict(zip(*[entries, ("{}".format(condition1), baseline_signif, "{}".format(condition2), followup_signif, "{} vs. {}".format(condition1, condition2), t_stat, q, comp_signif)]))) return DataFrame(dict_list, columns=entries)