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")
Ejemplo n.º 2
0
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)