Beispiel #1
0
def plot_stat_distributions(stats, group_names):
    # Show the distribution of stats, to see if there are
    # reliable group differences.
    fh4 = plt.figure(figsize=(18, 8))
    lbls = ['%s vs. %s' % (gn1, gn2)
            for gi, gn1 in enumerate(group_names)
            for gn2 in group_names[gi + 1:]]
    pi = 1
    for si, stat_name in enumerate(['mean', 'var']):
        stat_vals = np.asarray([ss[:, si * 2] for ss in stats])
        pvals = np.asarray([ss[:, si * 2 + 1] for ss in stats])
        for li, lbl in enumerate(lbls):
            ax1 = fh4.add_subplot(2, len(lbls), pi)
            plot_normalized_hist(pvals[:, li], ax=ax1, bins=[0.0001, 0.001, 0.01, 0.05, 0.10, 0.20, 0.30, 0.40, 0.50, 0.60])
            ax1.set_title(lbl)
            if li == 0:
                ax1.set_ylabel(stat_name)
            pi += 1
    equalize_xlims(fh4)
    equalize_ylims(fh4)

    means = np.asarray([ss[:, 0] for ss in stats])
    stds = np.asarray([ss[:, 2] for ss in stats])
    good_idx = ~np.logical_or(np.isnan(means.sum(1)), np.isnan(stds.sum(1)))

    fh = plt.figure(figsize=(18, 8))
    ax1 = fh.add_subplot(1, 2, 1)
    plot_normalized_hist(means[good_idx], ax=ax1, bins=25)
    ax1.set_xlabel('mean')

    ax2 = fh.add_subplot(1, 2, 2)
    plot_normalized_hist(stds[good_idx], ax=ax2, bins=25)
    ax2.set_xlabel('standard deviation')
    ax2.legend(group_names)
Beispiel #2
0
def compare_group_asymmetry(data, xaxis_key, yaxis_key, grouping_keys, plots, measure_key):
    """ Groups data according to grouping_keys, computes
    asymmetry index for key, and graphs."""

    group_names, grouping_index = get_groupings(data, grouping_keys)

    x_data = np.asarray(data[xaxis_key].tolist())
    prop_ai = get_asymmetry_index(data, yaxis_key)

    n_subplots = len(group_names)
    n_rows = 1  # int(np.round(np.sqrt(n_subplots)))
    n_cols = n_subplots  # int(np.ceil(n_subplots / float(n_rows)))

    if 'regressions' in plots:
        fh1 = plt.figure(figsize=(18, 7))
        # fh1.suptitle('%s regression' % yaxis_key)
    if 'distributions' in plots:
        fh2 = plt.figure(figsize=(18, 7))
        fh2.suptitle('%s distributions' % yaxis_key)
        n_bins = 15
        bins = np.linspace(prop_ai[~np.isnan(prop_ai)].min(),
                           prop_ai[~np.isnan(prop_ai)].max(),
                           n_bins + 2)[1:-1]

    group_samples = []
    regressions = []
    for gi, group_name in enumerate(group_names):

        # Index the current group
        if group_name == 'all':
            idx = np.ones((len(data.values()[0]),), dtype=bool)
        else:
            idx = grouping_index[gi]

        # Select data within the group
        cur_x = x_data[idx]
        group_ai = prop_ai[idx]

        # Remove bad data
        bad_idx = np.logical_or(np.isnan(cur_x), np.isnan(group_ai))
        good_idx = np.logical_not(bad_idx)
        cur_x = cur_x[good_idx]
        group_ai = group_ai[good_idx]

        group_samples.append(group_ai)
        regressions.append(scipy.stats.linregress(cur_x, group_ai))

        # Plot the regression result
        params = dict(xlabel=xaxis_key, ylabel='Asymmetry Index (LH - RH)',
                      title='Group: %s (n=%d)' % (group_name, len(group_ai)))

        if 'regressions' in plots:
            if gi > 0:
                del params['ylabel']
            # ax1 = fh1.add_subplot(n_rows, n_cols, gi + 1)
            ax1 = fh1.gca()
            do_and_plot_regression(cur_x, group_ai, ax=ax1, colori=gi,
                                   show_std=(len(cur_x) > 200), **params)
            ax1.set_title(measure_key)  # ax1.get_title().split('\n')[0])

        # Plot the distribution result
        if 'distributions' in plots:
            ax2 = fh2.add_subplot(n_rows, n_cols, gi + 1)
            plot_normalized_hist(group_ai, ax2, bins=bins)
            ax2.set_title(params['title'])
            ax2.set_xlabel(params['ylabel'])
            ax2.set_ylims([0, 0.25])
    regressions = np.asarray(regressions)

    # stats[:, n]: 0:mean_stat: 1:mean_pval; 2:std_stat, 3:std_pval
    # shape: n_compares x 4
    stats = np.asarray([(scipy.stats.ttest_ind(gsamps1, gsamps2) +
                         scipy.stats.levene(gsamps1, gsamps2))
                        for gi, gsamps1 in enumerate(group_samples)
                        for gsamps2 in group_samples[gi + 1:]])


    # Test whether variances differ
    if 'stats' in plots:
        dist_mat = scipy.spatial.distance.squareform(stats[:, 2])
        sig_mat = stats[:, 3] <= (0.05 / stats.shape[0])

        fh3 = plt.figure()
        fh3.suptitle(str(['%.2e' % s for s in stats[:, 3]]))

        ax1 = fh3.add_subplot(1, 2, 1)
        plot_symmetric_matrix_as_triangle(dist_mat, ax=ax1, labels=group_names)

        ax2 = fh3.add_subplot(1, 2, 2, axisbg=fh3.get_facecolor())
        plot_symmetric_matrix_as_triangle(sig_mat, ax=ax2, labels=group_names)

    if 'distributions' in plots:
        equalize_xlims(fh2)
        equalize_ylims(fh2)
    

    return group_names, stats, regressions, group_samples