def load_and_plot_scores_regressions( sub_path="Intercept_surprise_100_Surprisenp1_RepeatAlter_RepeatAlternp1", filter_name='Stand', scores_name='scores--remapped_gtmbaselined_clean.npy'): from jr.plot import pretty_decod results_path = op.join(config.result_path, 'linear_models', filter_name, sub_path) scores_all = [] for subject in config.subjects_list: subject_path = op.join(results_path, subject) score = np.load(op.join(subject_path, scores_name)) scores_all.append(score) scores_all = np.asarray(scores_all) pretty_decod(np.mean(scores_all, 1), np.linspace(-0.048, 0.65, scores_all.shape[-1]), chance=0) plt.title("Score " + filter_name) plt.show()
gat.estimators_ = [gat.estimators_[t] for t in toi_] gat.train_times_['times'] = [gat.train_times_['times'][t] for t in toi_] gat.train_times_['slices'] = [gat.train_times_['slices'][t] for t in toi_] # predict all trials, including absent to keep cv scheme gat.predict(epochs[sel_gat]) # subscore on present only gat.scores_ = subscore(gat, sel, y[sel]) scores.append(gat.scores_) # Save classifier results save([gat, analysis, sel_gat, events], 'decod', subject=subject, analysis=analysis['name'] + '_probe_to_target') times = epochs.times[:-5] score_diag = np.array([np.diag(np.array(score)[4:, :]) for score in scores]) p_val = stats(score_diag) pretty_decod(score_diag, times=times, sig=p_val < .05, color=analysis['color'], fill=True) # toi_ = np.where((times >= toi[0]) & (times < toi[1]))[0] toi_ = np.where(p_val < .05)[0] score = np.mean(score_diag[:, toi_], axis=1) print(np.mean(score, axis=0), np.std(score, axis=0) / np.sqrt(len(score_diag)), np.min(p_val[toi_]), times[toi_])
scores = -np.array(results['bias'][:, ii, jj, ...]) p_val = results['bias_pval'][ii, jj, :, :] pretty_gat(scores.mean(0), times=times, ax=axes[ii, jj], colorbar=False, clim=[-.1, .1], sig=p_val < .05) axes[ii, jj].axvline(.800, color='k') axes[ii, jj].axhline(.800, color='k') pretty_axes(axes, ylabelpad=-15, xticks=np.linspace(-.100, 1.400, 13), xticklabels=['', 0] + [''] * 13 + [1400, '']) pretty_colorbar(cax=fig.add_axes([.88, .25, .02, .55]), ax=axes[0, 0]) report.add_figs_to_section(fig, 'gat', 'bias') # Plot bias of TG diagonal (i.e. decoding bias) fig, ax = plt.subplots(1, figsize=[7., 2.]) scores = np.array([np.diag(s) for s in results['bias'][:, 0, 1, ...]]) p_val = np.diag(results['bias_pval'][0, 1, :, :]) pretty_decod(-scores, ax=ax, times=times, color=cmap(1.), sig=p_val < .05, fill=True) ax.axvline(.800, color='k') ax.set_xlabel('Times', labelpad=-10) fig.tight_layout() report.add_figs_to_section(fig, 'diagonal', 'bias') def quick_stats(x, ax=None): """Report significant bias in each toi for unseen and seen""" pvals = [wilcoxon(ii)[1] for ii in x.T] sig = [['', '*'][p < .05] for p in pvals] m = np.nanmean(x, axis=0) s = np.nanstd(x, axis=0) print(m, s, pvals) if ax is not None: for x_, (y_, sig_) in enumerate(zip(m / 2., sig)):
fill_color=analysis['color']) for ax in axs: ax.axvline(.800, color='k') if analysis['typ'] == 'regress': ax.set_ylabel('R', labelpad=-15) elif analysis['typ'] == 'categorize': ax.set_ylabel('AUC', labelpad=-15) else: ax.set_ylabel('rad.', labelpad=-15) ax.set_yticklabels(['', '', '%.2f' % ax.get_yticks()[2]]) ax.set_xlabel('Times', labelpad=-10) report.add_figs_to_section(fig_offdiag, 'slices', analysis['name']) # Decod ax_diag = fig_alldiag.add_subplot(ax_diag) pretty_decod(scores_diag, times=times, sig=p_values_diag < alpha, chance=chance, color=analysis['color'], fill=True, ax=ax_diag) xlim, ylim = ax_diag.get_xlim(), np.array(ax_diag.get_ylim()) # ylim[1] = np.ceil(ylim[1] * 10) / 10. sem = scores_diag.std(0) / np.sqrt(len(scores_diag)) ylim = [np.min(scores_diag.mean(0) - sem), np.max(scores_diag.mean(0) + sem)] ax_diag.set_ylim(ylim) ax_diag.axvline(.800, color='k') ax_diag.set_xticklabels([int(x) if x in np.linspace(0., 1000., 11) else '' for x in np.round(1e3 * ax_diag.get_xticks())]) if ax_diag != axes_alldiag[-1]: # bottom suplot ax_diag.set_xlabel('') ax_diag.set_xticklabels([]) ax_diag.xaxis.set_visible(False) elif ax_diag == axes_alldiag[0]:
for roi in rois: idx = np.where([roi in this_roi for this_roi in labels])[0] scores.append(np.mean(data[:, idx, :], axis=1)) p_values = stats(np.transpose(scores, [1, 2, 0]) - chance, n_jobs=-1) fig, axes = plt.subplots(len(rois), 1, sharex=True, sharey=True, figsize=[10, 40]) cmap = plt.get_cmap('rainbow') colors = cmap(np.linspace(0., 1., len(rois))) ylim = [2, -2] # Plot details_toi, details_roi = list(), list() for ii, (score, p_val, ax, color, roi) in enumerate(zip( scores, p_values.T, axes, colors, rois)): pretty_decod(score, sig=p_val < .05, times=times-np.min(times), color=color, ax=ax, fill=True, chance=chance) xlim = ax.get_xlim() ylim[0] = min([ylim[0], ax.get_ylim()[0]]) ylim[1] = max([ylim[1], ax.get_ylim()[1]]) ax.set_ylim(ylim) ax.set_yticks(ylim) ax.set_yticklabels(['%.3f' % y for y in ylim]) ax.set_xticklabels([int(x) if x in np.linspace(0., 1200., 11) else '' for x in np.round(1e3 * ax.get_xticks())]) if ax != axes[-1]: ax.set_xlabel('') ax.set_xticklabels([]) elif ax == axes[0]: ax.text(0, ylim[1], 'Target', backgroundcolor='w', ha='center', va='top')
all_pval_tois[vis, t, :] = stats(score_toi - analysis['chance']) save([all_score_tois, all_pval_tois, times], 'score', analysis=ana_name) return [all_score_tois, all_pval_tois, times] # Main plotting colors = dict(visibility=plt.get_cmap('bwr')(np.linspace(0, 1, 4.)), contrast=plt.get_cmap('hot_r')([.5, .75, 1.])) # Loop across visibility and orientation analyses for analysis in analyses: # Plot correlation of decoding score with visibility and contrast scores, R, times = _analyze_continuous(analysis) fig, (ax1, ax2) = plt.subplots(2, 1, figsize=[20, 10]) sig = stats(R['visibility']) < .05 pretty_decod(-R['visibility'], times=times, sig=sig, ax=ax1, color='purple', fill=True) sig = stats(R['contrast']) < .05 pretty_decod(-R['contrast'], times=times, sig=sig, ax=ax2, color='orange', fill=True) report.add_figs_to_section([fig], ['continuous regress'], analysis['name']) # Plot decoding score for each visibility level all_scores, score_pvals, times = _subscore_pipeline(analysis) if 'circAngle' in analysis['name']: all_scores /= 2. # from circle to half circle figs, axes = list(), list() for vis in range(4): fig, ax = plt.subplots(1, figsize=[14, 11]) scores = all_scores[:, vis, ...] p_val = score_pvals[vis] pretty_gat(np.nanmean(scores, axis=0), times=times,
gat, _, sel_gat, _ = load('decod', subject=subject, analysis='probe_phase') # only keep estimators after probe onset times = gat.train_times_['times'] toi_ = np.where((times >= (.800 + toi[0])) & (times < (.800 + toi[1])))[0] gat.estimators_ = [gat.estimators_[t] for t in toi_] gat.train_times_['times'] = [gat.train_times_['times'][t] for t in toi_] gat.train_times_['slices'] = [gat.train_times_['slices'][t] for t in toi_] # predict all trials, including absent to keep cv scheme gat.predict(epochs[sel_gat]) # subscore on present only gat.scores_ = subscore(gat, sel, y[sel]) scores.append(gat.scores_) # Save classifier results save([gat, analysis, sel_gat, events], 'decod', subject=subject, analysis=analysis['name'] + '_probe_to_target') times = epochs.times[:-5] score_diag = np.array([np.diag(np.array(score)[4:, :]) for score in scores]) p_val = stats(score_diag) pretty_decod(score_diag, times=times, sig=p_val < .05, color=analysis['color'], fill=True) # toi_ = np.where((times >= toi[0]) & (times < toi[1]))[0] toi_ = np.where(p_val < .05)[0] score = np.mean(score_diag[:, toi_], axis=1) print(np.mean(score, axis=0), np.std(score, axis=0) / np.sqrt(len(score_diag)), np.min(p_val[toi_]), times[toi_])
axes[ii, jj].axvline(.800, color='k') axes[ii, jj].axhline(.800, color='k') pretty_axes(axes, ylabelpad=-15, xticks=np.linspace(-.100, 1.400, 13), xticklabels=['', 0] + [''] * 13 + [1400, '']) pretty_colorbar(cax=fig.add_axes([.88, .25, .02, .55]), ax=axes[0, 0]) report.add_figs_to_section(fig, 'gat', 'bias') # Plot bias of TG diagonal (i.e. decoding bias) fig, ax = plt.subplots(1, figsize=[7., 2.]) scores = np.array([np.diag(s) for s in results['bias'][:, 0, 1, ...]]) p_val = np.diag(results['bias_pval'][0, 1, :, :]) pretty_decod(-scores, ax=ax, times=times, color=cmap(1.), sig=p_val < .05, fill=True) ax.axvline(.800, color='k') ax.set_xlabel('Times', labelpad=-10) fig.tight_layout() report.add_figs_to_section(fig, 'diagonal', 'bias') def quick_stats(x, ax=None): """Report significant bias in each toi for unseen and seen""" pvals = [wilcoxon(ii)[1] for ii in x.T] sig = [['', '*'][p < .05] for p in pvals] m = np.nanmean(x, axis=0) s = np.nanstd(x, axis=0) print(m, s, pvals)
0.176, 0.18 , 0.184, 0.188, 0.192, 0.196, 0.2 , 0.204, 0.208, 0.212, 0.216, 0.22 , 0.224, 0.228, 0.232, 0.236, 0.24 , 0.244, 0.248, 0.252, 0.256, 0.26 , 0.264, 0.268, 0.272, 0.276, 0.28 , 0.284, 0.288, 0.292, 0.296, 0.3 , 0.304, 0.308, 0.312, 0.316, 0.32 , 0.324, 0.328, 0.332, 0.336, 0.34 , 0.344, 0.348, 0.352, 0.356, 0.36 , 0.364, 0.368, 0.372, 0.376, 0.38 , 0.384, 0.388, 0.392, 0.396, 0.4 , 0.404, 0.408, 0.412, 0.416, 0.42 , 0.424, 0.428, 0.432, 0.436, 0.44 , 0.444, 0.448, 0.452, 0.456, 0.46 , 0.464, 0.468, 0.472, 0.476, 0.48 , 0.484, 0.488, 0.492, 0.496, 0.5 , 0.504, 0.508, 0.512, 0.516, 0.52 , 0.524, 0.528, 0.532, 0.536, 0.54 , 0.544, 0.548, 0.552, 0.556, 0.56 , 0.564, 0.568, 0.572, 0.576, 0.58 , 0.584, 0.588, 0.592, 0.596, 0.6 ] pretty_decod(scores_regression_surprise,times) plt.plot(times,scores_regression_surprise.T) plt.title('r2 score CV 4 surprise') plt.xlabel('time (s)') plt.xticks([0,0.25,0.5]) plt.axvline([0]) plt.axvline([0.25]) plt.axvline([0.5]) plt.show() betas_dict = {'intercept':[],'RepeatAlter':[],'RepeatAlternp1':[],'surpriseN':[],'surpriseNp1':[]} mean_evoked = {'intercept':[],'RepeatAlter':[],'RepeatAlternp1':[],'surpriseN':[],'surpriseNp1':[]} for key in betas_dict: for subj in config.subjects_list: base_path = config.result_path + '/linear_models/reg_repeataltern_surpriseOmegainfinity/' + subj +'/_cvbeta_'+key+'-ave.fif' evo = mne.read_evokeds(base_path)
if analysis['typ'] == 'regress': ax.set_ylabel('R', labelpad=-15) elif analysis['typ'] == 'categorize': ax.set_ylabel('AUC', labelpad=-15) else: ax.set_ylabel('rad.', labelpad=-15) ax.set_yticklabels(['', '', '%.2f' % ax.get_yticks()[2]]) ax.set_xlabel('Times', labelpad=-10) report.add_figs_to_section(fig_offdiag, 'slices', analysis['name']) # Decod ax_diag = fig_alldiag.add_subplot(ax_diag) pretty_decod(scores_diag, times=times, sig=p_values_diag < alpha, chance=chance, color=analysis['color'], fill=True, ax=ax_diag) xlim, ylim = ax_diag.get_xlim(), np.array(ax_diag.get_ylim()) # ylim[1] = np.ceil(ylim[1] * 10) / 10. sem = scores_diag.std(0) / np.sqrt(len(scores_diag)) ylim = [ np.min(scores_diag.mean(0) - sem), np.max(scores_diag.mean(0) + sem) ] ax_diag.set_ylim(ylim) ax_diag.axvline(.800, color='k') ax_diag.set_xticklabels([ int(x) if x in np.linspace(0., 1000., 11) else '' for x in np.round(1e3 * ax_diag.get_xticks())
print('There is something wrong with the filename') inds = np.where(filter_times) scores_to_avg_filter = scores_to_avg[:, inds[0], inds[0]] signif = np.zeros((scores_to_avg.shape[1], 1)) p_vals = stats.stats_cluster_based_permutation_test(scores_to_avg_filter - chance[k]) sig = (p_vals < 0.05) for l, ll in enumerate(inds[0]): signif[ll] = sig[l] pretty_decod(np.mean(scores_to_avg, axis=0), times=time_list, chance=chance[k], sfreq=100, sig=signif, fill=True) fig = plt.gcf() fig.savefig(fig_path + 'diagonal_' + names[k]) plt.close('all') # ============= fancy plot ============ # COMP # hemifield, location-within-hemifield, retinotopic, decade symbolic, unit symbolic, quantity conditions = [ ['/hemifield/scores_*_standard_-400_1000_comp.pkl'], [ '/location/scores_*_standard_-400_1000_comp_left_hemifield.pkl',
return [all_score_tois, all_pval_tois, times] # Main plotting colors = dict(visibility=plt.get_cmap('bwr')(np.linspace(0, 1, 4.)), contrast=plt.get_cmap('hot_r')([.5, .75, 1.])) # Loop across visibility and orientation analyses for analysis in analyses: # Plot correlation of decoding score with visibility and contrast scores, R, times = _analyze_continuous(analysis) fig, (ax1, ax2) = plt.subplots(2, 1, figsize=[20, 10]) sig = stats(R['visibility']) < .05 pretty_decod(-R['visibility'], times=times, sig=sig, ax=ax1, color='purple', fill=True) sig = stats(R['contrast']) < .05 pretty_decod(-R['contrast'], times=times, sig=sig, ax=ax2, color='orange', fill=True) report.add_figs_to_section([fig], ['continuous regress'], analysis['name']) # Plot decoding score for each visibility level all_scores, score_pvals, times = _subscore_pipeline(analysis) if 'circAngle' in analysis['name']: all_scores /= 2. # from circle to half circle
# get some time informations (TODO stats) fname = op.join(data_path, 's%i_%s_fit.pkl' % (subject, contrast)) with open(fname, 'rb') as f: gat = pickle.load(f) times = gat.train_times_['times'] # plot scores fig_diag, axes_diag = plt.subplots(len(contrasts), 1, figsize=[2, 5]) cmap = plt.get_cmap('rainbow') colors = cmap(np.linspace(0., 1., len(contrasts))) for contrast, color, ax in zip(contrasts, colors, axes_diag): scores = all_scores[contrast] # plot diagonal scores_diag = np.array([np.diag(x) for x in scores]) pretty_decod(scores_diag, times=times, color=color, ax=ax, chance=.5) ax.set_title(contrast) if ax != axes_diag[-1]: ax.set_xticklabels([]) ax.set_xlabel('') # plot gat fig, ax = plt.subplots(1, figsize=[5, 5]) pretty_gat(np.mean(scores, axis=0), times=times, chance=.5) report.add_figs_to_section(fig, 'GAT %s' % contrast, contrast) # plot slices tois = np.arange(0., .600, .100) fig, axes = plt.subplots(len(tois), 1, figsize=[5, 5]) pretty_slices(scores, tois=tois, times=times, chance=.5, axes=axes) report.add_figs_to_section(fig, 'Slices %s' % contrast, contrast) fig_diag.tight_layout() report.add_figs_to_section(fig_diag, 'Diagonal', 'All')