Ejemplo n.º 1
0
def test_watson_williams_nd():
    dat1 = np.tile(np.radians([135., 145, 125, 140, 165, 170]), (3, 4, 1))
    dat2 = np.tile(np.radians([150, 130, 175, 190, 180, 220]), (3, 4, 1))
    dat3 = np.tile(np.radians([140, 165, 185, 180, 125, 175, 140]), (3, 4, 1))
    p, T = pycircstat.watson_williams(dat1, dat2, dat3, axis=2)
    assert_true(p.shape == (3, 4),
                "return pvalue array does not have right shape")
    assert_allclose(p, 0.1870637, atol=0.0001, rtol=0.0001)
Ejemplo n.º 2
0
def test_watson_williams_nd():
    dat1 = np.tile(np.radians([135., 145, 125, 140, 165, 170]), (3, 4, 1))
    dat2 = np.tile(np.radians([150, 130, 175, 190, 180, 220]), (3, 4, 1))
    dat3 = np.tile(np.radians([140, 165, 185, 180, 125, 175, 140]), (3, 4, 1))
    p, T = pycircstat.watson_williams(dat1, dat2, dat3, axis=2)
    assert_true(
        p.shape == (
            3,
            4),
        "return pvalue array does not have right shape")
    assert_allclose(p, 0.1870637, atol=0.0001, rtol=0.0001)
Ejemplo n.º 3
0
def my_ww_2samp(x1, x2, tag1, tag2):
    n1, n2 = len(x1), len(x2)
    sample_sizes = (n1, n2)

    cmean1, cmean2 = circmean(x1), circmean(x2)
    sem1, sem2 = circstd(x1) / np.sqrt(n1), circstd(x2) / np.sqrt(n2)
    descrips = ((cmean1, sem1), (cmean2, sem2))

    ww_results = watson_williams(x1, x2)
    ww_pval, wwtable = ww_results
    df_col = wwtable.loc['Columns', 'df']
    df_Residual = wwtable.loc['Residual', 'df']
    Fstat = wwtable.loc['Columns', 'F']
    pval = wwtable.loc['Columns', 'p-value']
    txt = r'Watson-Williams, %s $(n=%d)$ vs %s $(n=%d)$, $F_{(%d, %d)}=%0.2f, p=%s$' % (
        tag1, n1, tag2, n2, df_col, df_Residual, Fstat, p2str(pval))
    return ww_pval, sample_sizes, descrips, txt
Ejemplo n.º 4
0
def _compute_novel_rep_spike_stats(novel_phases, rep_phases):

    # compute rayleigh test for each condition
    p_novel, z_novel = pycircstat.rayleigh(novel_phases, axis=0)
    p_rep, z_rep = pycircstat.rayleigh(rep_phases, axis=0)

    # test whether the means are different
    ww_pvals, ww_tables = pycircstat.watson_williams(novel_phases, rep_phases, axis=0)
    ww_fstat = np.array([x.loc['Columns'].F for x in ww_tables])

    # test whether the medians are different
    med_pvals, med_stat = pycircstat.cmtest(novel_phases, rep_phases, axis=0)

    # finall run kuiper test for difference in mean and/or dispersion
    p_kuiper, stat_kuiper = pycircstat.kuiper(novel_phases, rep_phases, axis=0)

    return p_novel, z_novel, p_rep, z_rep, ww_pvals, ww_fstat, med_pvals, med_stat, p_kuiper, stat_kuiper
def compute_phase_stats_with_shuffle(events, spike_rel_times, phase_data_hilbert, phase_bin_start,
                                     phase_bin_stop, do_permute=False, shuffle_type=1):

    spike_rel_times_tmp = spike_rel_times.copy()
    e_tmp = events.copy()

    if do_permute:

        if shuffle_type == 1:

            # permute the novel
            novel_events = np.where(events.isFirst.values)[0]
            perm_novel_events = np.random.permutation(novel_events)
            spike_rel_times_tmp[novel_events] = spike_rel_times_tmp[perm_novel_events]

            # and repeated separately
            rep_events = np.where(~events.isFirst.values)[0]
            perm_rep_events = np.random.permutation(rep_events)
            spike_rel_times_tmp[rep_events] = spike_rel_times_tmp[perm_rep_events]

        else:

            e_tmp['isFirst'] = np.random.permutation(e_tmp.isFirst)

    # get the phases at which the spikes occurred and bin into novel and repeated items for each hilbert band
    spike_phases_hilbert = _compute_spike_phase_by_freq(spike_rel_times_tmp,
                                                        phase_bin_start,
                                                        phase_bin_stop,
                                                        phase_data_hilbert,
                                                        events)

    # bin into repeated and novel phases
    novel_phases, rep_phases = _bin_phases_into_cond(spike_phases_hilbert, e_tmp)

    if (len(novel_phases) > 0) & (len(rep_phases) > 0):

        # test phase locking for all spikes comboined
        all_spikes_phases = np.vstack([novel_phases, rep_phases])
        rayleigh_pval_all, rayleigh_z_all = pycircstat.rayleigh(all_spikes_phases, axis=0)
        rvl_all = pycircstat.resultant_vector_length(all_spikes_phases, axis=0)

        # rayleigh test for uniformity
        rvl_novel = pycircstat.resultant_vector_length(novel_phases, axis=0)
        rvl_rep = pycircstat.resultant_vector_length(rep_phases, axis=0)
        rvl_diff = rvl_novel - rvl_rep

        # compute rayleigh test for each condition
        rayleigh_pval_novel, rayleigh_z_novel = pycircstat.rayleigh(novel_phases, axis=0)
        rayleigh_pval_rep, rayleigh_z_rep = pycircstat.rayleigh(rep_phases, axis=0)
        rayleigh_diff = rayleigh_z_novel - rayleigh_z_rep

        # watson williams test for equal means
        ww_pval, ww_tables = pycircstat.watson_williams(novel_phases, rep_phases, axis=0)
        ww_fstat = np.array([x.loc['Columns'].F for x in ww_tables])

        # kuiper test, to test for difference in dispersion (not mean, because I'm making them equal)
        kuiper_pval, stat_kuiper = pycircstat.kuiper(novel_phases - pycircstat.mean(novel_phases),
                                                     rep_phases - pycircstat.mean(rep_phases), axis=0)

        return (rvl_novel, rvl_rep, rvl_diff, ww_fstat, stat_kuiper, rayleigh_z_novel, rayleigh_z_rep, rayleigh_diff,
                rayleigh_z_all, rvl_all), \
               (rayleigh_pval_novel, rayleigh_pval_rep, ww_pval, kuiper_pval, rayleigh_pval_all), novel_phases, rep_phases

    else:
        return (np.array([np.nan] * phase_data_hilbert.shape[2]),
                np.array([np.nan] * phase_data_hilbert.shape[2]),
                np.array([np.nan] * phase_data_hilbert.shape[2]),
                np.array([np.nan] * phase_data_hilbert.shape[2]),
                np.array([np.nan] * phase_data_hilbert.shape[2]),
                np.array([np.nan] * phase_data_hilbert.shape[2]),
                np.array([np.nan] * phase_data_hilbert.shape[2]),
                np.array([np.nan] * phase_data_hilbert.shape[2]),
                np.array([np.nan] * phase_data_hilbert.shape[2]),
                np.array([np.nan] * phase_data_hilbert.shape[2])), \
               (np.array([np.nan] * phase_data_hilbert.shape[2]),
                np.array([np.nan] * phase_data_hilbert.shape[2]),
                np.array([np.nan] * phase_data_hilbert.shape[2]),
                np.array([np.nan] * phase_data_hilbert.shape[2]),
                np.array([np.nan] * phase_data_hilbert.shape[2])), novel_phases, rep_phases
Ejemplo n.º 6
0
def test_watson_williams():
    dat1 = np.radians([135., 145, 125, 140, 165, 170])
    dat2 = np.radians([150, 130, 175, 190, 180, 220])
    dat3 = np.radians([140, 165, 185, 180, 125, 175, 140])
    p, T = pycircstat.watson_williams(dat1, dat2, dat3)
    assert_allclose(p, 0.1870637, atol=0.001, rtol=0.001)
def compute_phase_stats_with_shuffle(events, spike_rel_times, phase_data_hilbert, phase_bin_start,
                                     phase_bin_stop, do_permute=False):

    spike_rel_times_tmp = spike_rel_times.copy()
    if do_permute:

        # permute the novel
        novel_events = np.where(events.isFirst.values)[0]
        perm_novel_events = np.random.permutation(novel_events)
        spike_rel_times_tmp[novel_events] = spike_rel_times_tmp[perm_novel_events]

        # and repeated separately
        rep_events = np.where(~events.isFirst.values)[0]
        perm_rep_events = np.random.permutation(rep_events)
        spike_rel_times_tmp[rep_events] = spike_rel_times_tmp[perm_rep_events]

    # get the phases at which the spikes occurred and bin into novel and repeated items for each hilbert band
    spike_phases_hilbert = _compute_spike_phase_by_freq(spike_rel_times_tmp,
                                                        phase_bin_start,
                                                        phase_bin_stop,
                                                        phase_data_hilbert,
                                                        events)

    # bin into repeated and novel phases
    novel_phases, rep_phases = _bin_phases_into_cond(spike_phases_hilbert, events)

    if (len(novel_phases) > 0) & (len(rep_phases) > 0):

        # rayleigh test for uniformity
        rvl_novel = pycircstat.resultant_vector_length(novel_phases, axis=0)
        rvl_rep = pycircstat.resultant_vector_length(rep_phases, axis=0)
        rvl_diff = rvl_novel - rvl_rep

        # compute rayleigh test for each condition
        rayleigh_pval_novel, rayleigh_z_novel = pycircstat.rayleigh(novel_phases, axis=0)
        rayleigh_pval_rep, rayleigh_z_rep = pycircstat.rayleigh(rep_phases, axis=0)
        rayleigh_diff = rayleigh_z_novel - rayleigh_z_rep

        # watson williams test for equal means
        ww_pval, ww_tables = pycircstat.watson_williams(novel_phases, rep_phases, axis=0)
        ww_fstat = np.array([x.loc['Columns'].F for x in ww_tables])

        # kuiper test, to test for difference in dispersion (not mean, because I'm making them equal)
        kuiper_pval, stat_kuiper = pycircstat.kuiper(novel_phases - pycircstat.mean(novel_phases),
                                                     rep_phases - pycircstat.mean(rep_phases), axis=0)

        return (rvl_novel, rvl_rep, rvl_diff, ww_fstat, stat_kuiper, rayleigh_z_novel, rayleigh_z_rep, rayleigh_diff), \
               (rayleigh_pval_novel, rayleigh_pval_rep, ww_pval, kuiper_pval), novel_phases, rep_phases

    else:
        return (np.array([np.nan] * phase_data_hilbert.shape[2]),
                np.array([np.nan] * phase_data_hilbert.shape[2]),
                np.array([np.nan] * phase_data_hilbert.shape[2]),
                np.array([np.nan] * phase_data_hilbert.shape[2]),
                np.array([np.nan] * phase_data_hilbert.shape[2]),
                np.array([np.nan] * phase_data_hilbert.shape[2]),
                np.array([np.nan] * phase_data_hilbert.shape[2]),
                np.array([np.nan] * phase_data_hilbert.shape[2])), \
               (np.array([np.nan] * phase_data_hilbert.shape[2]),
                np.array([np.nan] * phase_data_hilbert.shape[2]),
                np.array([np.nan] * phase_data_hilbert.shape[2]),
                np.array([np.nan] * phase_data_hilbert.shape[2])), novel_phases, rep_phases
pars5['angle'] = phi
pars5 = pars5.dropna()

# stats on vector norm between laboratories:
sm_lm = ols('norm ~ C(institution_code)', data=pars5).fit()
table = sm.stats.anova_lm(sm_lm)  # Type 2 ANOVA DataFrame
print(table)

# use pycircstat Watson-Williams test
pars6 = pars5.groupby('institution_code')['angle'].aggregate(
    lambda x: list(x)).reset_index()
angles_grouped = pars6['angle'].values

pval, table = pycircstat.watson_williams(angles_grouped[0],
                                         angles_grouped[1],
                                         angles_grouped[2],
                                         angles_grouped[3],
                                         angles_grouped[4],
                                         angles_grouped[5],
                                         angles_grouped[6])
print('circular one-way anova')
print(table)

# fig, ax = plt.subplots(2, 1)
# sns.swarmplot(x='institution_code', y='norm', data=pars5, ax=ax[0])
# sns.swarmplot(x='institution_code', y='angle', data=pars5, ax=ax[1])
# fig.tight_layout()
# fig.savefig(os.path.join(figpath, "history_shift_stats.pdf"))
# fig.savefig(os.path.join(figpath, "history_shift_stats.png"), dpi=600)
# plt.close("all")
Ejemplo n.º 9
0
    def plot_average_precession(self, NShuffles=1000):

        fig_avercurve, ax_avercurve = plt.subplots(figsize=(figl, figl), sharey=True)
        fig_phasesp, ax_phasesp = plt.subplots(figsize=(figl, figl), sharey=True)

        anglediff, pass_nspikes = self.stack_anglediff(self.singlefield_df, precess_ref=True)

        anglediff = np.abs(anglediff)
        slopes = self.stack_key(self.singlefield_df, 'rcc_m')
        offsets = self.stack_key(self.singlefield_df, 'rcc_c')

        phasesp = np.concatenate(self.stack_key(self.singlefield_df, 'phasesp'))

        low_mask = anglediff < (np.pi / 6)
        high_mask = anglediff > (np.pi - np.pi / 6)

        sample_size = 500
        np.random.seed(1)
        high_ranvec = np.random.choice(high_mask.sum(), size=sample_size)
        low_ranvec = np.random.choice(low_mask.sum(), size=sample_size)

        anglediff_spikes = repeat_arr(anglediff, pass_nspikes)
        low_mask_sp = anglediff_spikes < (np.pi / 6)
        high_mask_sp = anglediff_spikes > (np.pi - np.pi / 6)
        phasesph = phasesp[high_mask_sp]
        phasespl = phasesp[low_mask_sp]

        slopes_high, offsets_high = slopes[high_mask][high_ranvec], offsets[high_mask][high_ranvec]
        slopes_low, offsets_low = slopes[low_mask][low_ranvec], offsets[low_mask][low_ranvec]

        regress_high, regress_low, pval_slope, pval_offset = permutation_test_average_slopeoffset(
            slopes_high, offsets_high, slopes_low, offsets_low, NShuffles=NShuffles)


        xdum = np.linspace(0, 1, 10)
        high_agg_ydum = 2 * np.pi * regress_high['aopt'] * xdum + regress_high['phi0']
        low_agg_ydum = 2 * np.pi * regress_low['aopt'] * xdum + regress_low['phi0']

        # Compare high vs low
        ax_avercurve.plot(xdum, high_agg_ydum, c='lime', label='$|d|>5\pi/6$')
        ax_avercurve.plot(xdum, low_agg_ydum, c='darkblue', label='$|d|<\pi/6$')
        ax_avercurve.text(0.05, -np.pi + 0.5, 'Slope\n  p%s\nOffset\n  p%s'% \
                          (p2str(pval_slope), p2str(pval_offset)), fontsize=legendsize)

        customlegend(ax_avercurve, fontsize=legendsize, loc='center right')

        #
        aedges = np.linspace(-np.pi, np.pi, 36)

        fstat, k_pval = circ_ktest(phasesph, phasespl)

        p_ww, ww_table = watson_williams(phasesph, phasespl)
        ax_phasesp.hist(phasesph, bins=aedges, density=True, histtype='step', color='lime')
        ax_phasesp.hist(phasespl, bins=aedges, density=True, histtype='step', color='darkblue')
        ax_phasesp.text(0.2, 0.15, 'Bartlett\'s\np%s'%(p2str(k_pval)), transform=ax_phasesp.transAxes, fontsize=fontsize)
        # ax_phasesp.legend(fontsize=legendsize-2, loc='lower center')
        ax_phasesp.set_xticks([-np.pi, 0, np.pi])
        ax_phasesp.set_xticklabels(['$-\pi$', '0', '$\pi$'])
        # ax_phasesp.set_yticks([0, 0.2])
        ax_phasesp.tick_params(labelsize=ticksize, direction='inout')
        ax_phasesp.set_xlabel('Phase (rad)', fontsize=fontsize)
        ax_phasesp.set_ylabel('Normalized frequency', fontsize=fontsize)
        ax_phasesp.set_xlim(-np.pi, np.pi)

        ax_avercurve.set_xlim(0, 1)
        ax_avercurve.set_ylim(-np.pi, np.pi + np.pi/2)
        ax_avercurve.set_yticks([-np.pi, 0, np.pi])
        ax_avercurve.set_yticklabels(['$-\pi$', '0', '$\pi$'])
        ax_avercurve.set_xlabel('Position', fontsize=fontsize)
        ax_avercurve.tick_params(labelsize=ticksize, direction='inout')

        ax_avercurve.set_ylabel('Phase (rad)', fontsize=fontsize)

        fig_avercurve.tight_layout()
        fig_avercurve.savefig(join(self.plot_dir, 'Networks_aver_precess_curve.png'), dpi=300)

        fig_phasesp.tight_layout()
        fig_phasesp.savefig(join(self.plot_dir, 'Networks_spike_phase_highlow.png'), dpi=300)

        plt.close()