示例#1
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)
def test_sym_to_vec():
    """Testing sym_to_vec function"""
    sym = np.ones((3, 3))
    vec = my_con.sym_to_vec(sym)
    vec_expected = np.array([1., np.sqrt(2), 1., np.sqrt(2),  np.sqrt(2), 1.])
    vec_bool = my_con.sym_to_vec(sym > 0, isometry=False)
    bool_expected = np.ones(6, dtype=bool)
    assert_array_almost_equal(vec, vec_expected)
    assert_array_equal(vec_bool, bool_expected)

    shape = random.randint(1, 40)
    m = np.random.rand(shape, shape)
    sym = m + m.T
    syms = np.asarray([sym, 2. * sym, 0.5 * sym])
    vec = my_con.sym_to_vec(sym)
    vecs = my_con.sym_to_vec(syms)
    assert_array_almost_equal(my_con.vec_to_sym(vec), sym)
    for k, vec in enumerate(vecs):
        assert_array_almost_equal(my_con.vec_to_sym(vec), syms[k])
    vec = my_con.sym_to_vec(sym, isometry=False)
    vecs = my_con.sym_to_vec(syms, isometry=False)
    assert_array_almost_equal(my_con.vec_to_sym(vec, isometry=False), sym)
    assert_array_almost_equal(vec[..., -shape:], sym[..., -1, :])
    for k, vec in enumerate(vecs):
        assert_array_almost_equal(
        my_con.vec_to_sym(vec, isometry=False), syms[k])
    assert_array_almost_equal(vecs[..., -shape:], syms[..., -1, :])
def test_vec_to_sym():
    """Testing vec_to_sym function"""
    # Check error if unsuitable size
    vec = np.random.rand(31)
    with assert_raises(ValueError) as ve:
        my_con.vec_to_sym(vec)
        assert_equal(len(ve), 1)

    # Test for random suitable size
    n = random.randint(1, 50)
    p = n * (n + 1) / 2
    vec = np.random.rand(p)
    sym = my_con.vec_to_sym(vec)
    assert_array_almost_equal(my_con.sym_to_vec(sym), vec)

    vec = np.ones(6, )
    sym = my_con.vec_to_sym(vec)
    sym_expected = np.array([[np.sqrt(2), 1., 1.], [1., np.sqrt(2), 1.],
                              [1., 1., np.sqrt(2)]]) / np.sqrt(2)
    sym_bool = my_con.vec_to_sym(vec > 0, isometry=False)
    bool_expected = np.ones((3, 3), dtype=bool)
    assert_array_almost_equal(sym, sym_expected)
    assert_array_equal(sym_bool, bool_expected)