def roi_pair_ttest(): """ compare rsfc difference between ROIs scheme: hemi-separately network-wise """ import numpy as np import pickle as pkl import pandas as pd from scipy.stats.stats import ttest_rel from cxy_hcp_ffa.lib.predefine import net2label_cole from commontool.stats import EffectSize # inputs hemis = ('lh', 'rh') roi_pair = ('pFus-face', 'mFus-face') data_file = pjoin(work_dir, 'rsfc_individual2Cole_{}.pkl') compare_name = f"{roi_pair[0].split('-')[0]}_vs_" \ f"{roi_pair[1].split('-')[0]}" # outputs out_file = pjoin(work_dir, f"rsfc_individual2Cole_{compare_name}_ttest_paired.csv") # start trg_names = list(net2label_cole.keys()) trg_labels = list(net2label_cole.values()) out_data = {'network': trg_names} es = EffectSize() for hemi in hemis: data = pkl.load(open(data_file.format(hemi), 'rb')) assert data['trg_label'] == trg_labels out_data[f'CohenD_{hemi}'] = [] out_data[f't_{hemi}'] = [] out_data[f'P_{hemi}'] = [] for trg_idx, trg_name in enumerate(trg_names): sample1 = data[roi_pair[0]][:, trg_idx] sample2 = data[roi_pair[1]][:, trg_idx] nan_vec1 = np.isnan(sample1) nan_vec2 = np.isnan(sample2) nan_vec = np.logical_or(nan_vec1, nan_vec2) print(f'#NAN in sample1 or sample2:', np.sum(nan_vec)) sample1 = sample1[~nan_vec] sample2 = sample2[~nan_vec] d = es.cohen_d(sample1, sample2) t, p = ttest_rel(sample1, sample2) out_data[f'CohenD_{hemi}'].append(d) out_data[f't_{hemi}'].append(t) out_data[f'P_{hemi}'].append(p) # save out out_data = pd.DataFrame(out_data) out_data.to_csv(out_file, index=False)
def prepare_plot(gid=1, hemi='lh'): import numpy as np import pickle as pkl from scipy.stats import sem from cxy_hcp_ffa.lib.predefine import net2label_cole # inputs data_file = pjoin(work_dir, f'rsfc_individual2Cole_G{gid}_{hemi}.pkl') # outputs out_file = pjoin(work_dir, f'plot_rsfc_individual2Cole_G{gid}_{hemi}.pkl') # load data data = pkl.load(open(data_file, 'rb')) trg_names = list(net2label_cole.keys()) trg_labels = list(net2label_cole.values()) assert data['trg_label'] == trg_labels # prepare seed_names and trg_names seed_names = ['IOG-face', 'pFus-face', 'mFus-face'] n_seed = len(seed_names) n_trg = len(trg_names) # calculate mean and sem means = np.ones((n_seed, n_trg)) * np.nan sems = np.ones((n_seed, n_trg)) * np.nan stds = np.ones((n_seed, n_trg)) * np.nan for seed_idx, seed_name in enumerate(seed_names): for trg_idx in range(n_trg): samples = data[seed_name][:, trg_idx] samples = samples[~np.isnan(samples)] means[seed_idx, trg_idx] = np.mean(samples) sems[seed_idx, trg_idx] = sem(samples) stds[seed_idx, trg_idx] = np.std(samples, ddof=1) out_dict = { 'shape': 'n_seed x n_target', 'seed': seed_names, 'target': trg_names, 'trg_label': trg_labels, 'mean': means, 'sem': sems, 'std': stds } pkl.dump(out_dict, open(out_file, 'wb'))