diff --git a/setup.py b/setup.py index 5eccdcd..be7e221 100644 --- a/setup.py +++ b/setup.py @@ -25,11 +25,11 @@ 'duecredit', 'numpy>=1.14.2', 'pandas>=0.22.0', - 'hypertools', - 'scipy>=0.13.3', + 'hypertools==0.5.1', + 'scipy==1.2.1', 'matplotlib>=2.1.0', 'seaborn>=0.8.1', - 'scikit-learn>=0.19.1', + 'scikit-learn==0.19.1', ], packages=find_packages(exclude=('tests', 'docs')), ) diff --git a/timecorr/helpers.py b/timecorr/helpers.py index 16021b1..5413cf1 100644 --- a/timecorr/helpers.py +++ b/timecorr/helpers.py @@ -472,7 +472,9 @@ def timepoint_decoder(data, mu=None, nfolds=2, level=0, cfun=isfc, weights_fun=l return results_pd -def weighted_timepoint_decoder_ec(data, nfolds=2, level=0, optimize_levels=None, cfun=isfc, weights_fun=laplace_weights, + + +def weighted_timepoint_decoder(data, nfolds=2, level=0, optimize_levels=None, cfun=isfc, weights_fun=laplace_weights, weights_params=laplace_params, combine=mean_combine, rfun=None, opt_init=None): """ :param data: a list of number-of-observations by number-of-features matrices @@ -493,6 +495,11 @@ def weighted_timepoint_decoder_ec(data, nfolds=2, level=0, optimize_levels=None, of the total number of windows """ + assert len(np.unique( + list(map(lambda x: x.shape[0], data)))) == 1, 'all data matrices must have the same number of timepoints' + assert len(np.unique( + list(map(lambda x: x.shape[1], data)))) == 1, 'all data matrices must have the same number of features' + if nfolds == 1: sub_nfolds = 1 nfolds = 2 @@ -500,7 +507,7 @@ def weighted_timepoint_decoder_ec(data, nfolds=2, level=0, optimize_levels=None, else: sub_nfolds = 1 - group_assignments = get_xval_assignments(data.shape[1], nfolds) + group_assignments = get_xval_assignments(len(data), nfolds) orig_level = level @@ -544,80 +551,59 @@ def weighted_timepoint_decoder_ec(data, nfolds=2, level=0, optimize_levels=None, assert len(level)==len(rfun), 'parameter lengths need to be the same as level if input is ' \ 'type np.ndarray or list' - - results_pd = pd.DataFrame() - for i in range(0, nfolds): + in_raw = [] + out_raw = [] + sub_in_raw = [] + sub_out_raw = [] sub_corrs = [] corrs = [] - subgroup_assignments = get_xval_assignments(len(data[0][group_assignments == i]), nfolds) + subgroup_assignments = get_xval_assignments(len(data[group_assignments == i]), nfolds) - in_data = [x for x in data[0][group_assignments == i]] - out_data = [x for x in data[0][group_assignments != i]] + + in_data = [x for x in data[group_assignments == i]] + out_data = [x for x in data[group_assignments != i]] for v in level: if v==0: - in_smooth, out_smooth, in_raw, out_raw = folding_levels_ec(in_data, out_data, level=v, cfun=None, rfun=p_rfun, + in_smooth, out_smooth, in_raw, out_raw = folding_levels(in_data, out_data, level=v, cfun=None, rfun=p_rfun, combine=combine, weights_fun=weights_fun, weights_params=weights_params) - next_corrs = (1 - sd.cdist(mean_combine(in_smooth), mean_combine(out_smooth), + next_corrs = (1 - sd.cdist(mean_combine([x for x in in_raw]), mean_combine([x for x in out_raw]), 'correlation')) + + # next_corrs = (1 - sd.cdist(mean_combine(in_smooth), mean_combine(out_smooth), + # 'correlation')) corrs.append(next_corrs) for s in range(0, 1): - sub_in_data = [x for x in data[0][group_assignments == i][subgroup_assignments==s]] - sub_out_data = [x for x in data[0][group_assignments == i][subgroup_assignments!=s]] + sub_in_data = [x for x in data[group_assignments == i][subgroup_assignments==s]] + sub_out_data = [x for x in data[group_assignments == i][subgroup_assignments!=s]] - sub_in_smooth, sub_out_smooth, sub_in_raw, sub_out_raw = folding_levels_ec(sub_in_data, sub_out_data, + sub_in_smooth, sub_out_smooth, sub_in_raw, sub_out_raw = folding_levels(sub_in_data, sub_out_data, level=v, cfun=None, rfun=p_rfun, combine=combine, weights_fun=weights_fun, weights_params=weights_params) - next_subcorrs = (1 - sd.cdist(mean_combine(sub_in_smooth), - mean_combine(sub_out_smooth), 'correlation')) - sub_corrs.append(next_subcorrs) - - elif v==1: - - in_smooth, out_smooth, in_raw, out_raw = folding_levels_ec(in_raw, out_raw, level=v, cfun=cfun, - rfun=rfun, combine=combine, - weights_fun=weights_fun, - weights_params=weights_params) - - next_corrs = (1 - sd.cdist(mean_combine(in_smooth), mean_combine(out_smooth), - 'correlation')) - corrs.append(next_corrs) - - for s in range(0, 1): - - - sub_in_smooth, sub_out_smooth, sub_in_raw, sub_out_raw = folding_levels_ec(sub_in_raw, - sub_out_raw, - level=v, - cfun=cfun, - rfun=rfun, - combine=combine, - weights_fun=weights_fun, - weights_params=weights_params) - next_subcorrs = (1 - sd.cdist(mean_combine(sub_in_smooth), - mean_combine(sub_out_smooth), 'correlation')) + next_subcorrs = (1 - sd.cdist(mean_combine([x for x in sub_in_raw]), + mean_combine([x for x in sub_out_raw]), 'correlation')) + # next_subcorrs = (1 - sd.cdist(mean_combine(sub_in_smooth), + # mean_combine(sub_out_smooth), 'correlation')) sub_corrs.append(next_subcorrs) else: - in_raw = [x for x in data[v-1][group_assignments == i]] - out_raw = [x for x in data[v-1][group_assignments != i]] - in_smooth, out_smooth, in_raw, out_raw = folding_levels_ec(in_raw, out_raw, level=v, cfun=cfun, + in_smooth, out_smooth, in_raw, out_raw = folding_levels(in_raw, out_raw, level=v, cfun=cfun, rfun=rfun, combine=combine, weights_fun=weights_fun, weights_params=weights_params) @@ -628,10 +614,7 @@ def weighted_timepoint_decoder_ec(data, nfolds=2, level=0, optimize_levels=None, for s in range(0, 1): - sub_in_raw = [x for x in data[v-1][group_assignments == i][subgroup_assignments==s]] - sub_out_raw = [x for x in data[v-1][group_assignments == i][subgroup_assignments!=s]] - - sub_in_smooth, sub_out_smooth, sub_in_raw, sub_out_raw = folding_levels_ec(sub_in_raw, + sub_in_smooth, sub_out_smooth, sub_in_raw, sub_out_raw = folding_levels(sub_in_raw, sub_out_raw, level=v, cfun=cfun, @@ -686,7 +669,44 @@ def weighted_timepoint_decoder_ec(data, nfolds=2, level=0, optimize_levels=None, return results_pd -def weighted_timepoint_decoder(data, nfolds=2, level=0, optimize_levels=None, cfun=isfc, weights_fun=laplace_weights, + +def folding_levels(infold_data, outfold_data, level=0, cfun=None, weights_fun=None, weights_params=None, combine=None, + rfun=None): + + from .timecorr import timecorr + + if rfun is None: + rfun = [None] * np.shape(level)[0] + + p_cfun = eval('autofc') + + if level == 0: + + in_fold_smooth = np.asarray(timecorr([x for x in infold_data], cfun=None, + rfun=rfun[level], combine=combine[level], weights_function=weights_fun, + weights_params=weights_params)) + out_fold_smooth = np.asarray(timecorr([x for x in outfold_data], cfun=None, + rfun=rfun[level], combine=combine[level], weights_function=weights_fun, + weights_params=weights_params)) + + in_fold_raw = infold_data + out_fold_raw = outfold_data + else: + + in_fold_smooth = np.asarray(timecorr(list(infold_data), cfun=cfun[level], rfun=rfun[level], combine=combine[level], + weights_function=weights_fun, weights_params=weights_params)) + out_fold_smooth = np.asarray(timecorr(list(outfold_data), cfun=cfun[level], rfun=rfun[level], combine=combine[level], + weights_function=weights_fun, weights_params=weights_params)) + in_fold_raw = np.asarray(timecorr(list(infold_data), cfun=p_cfun, rfun=rfun[level], combine=null_combine, + weights_function=eye_weights, weights_params=eye_params)) + out_fold_raw = np.asarray(timecorr(list(outfold_data), cfun=p_cfun, rfun=rfun[level], combine=null_combine, + weights_function=eye_weights, weights_params=eye_params)) + + return in_fold_smooth, out_fold_smooth, in_fold_raw, out_fold_raw + + + +def weighted_timepoint_decoder_ec(data, nfolds=2, level=0, optimize_levels=None, cfun=isfc, weights_fun=laplace_weights, weights_params=laplace_params, combine=mean_combine, rfun=None, opt_init=None): """ :param data: a list of number-of-observations by number-of-features matrices @@ -707,11 +727,6 @@ def weighted_timepoint_decoder(data, nfolds=2, level=0, optimize_levels=None, cf of the total number of windows """ - assert len(np.unique( - list(map(lambda x: x.shape[0], data)))) == 1, 'all data matrices must have the same number of timepoints' - assert len(np.unique( - list(map(lambda x: x.shape[1], data)))) == 1, 'all data matrices must have the same number of features' - if nfolds == 1: sub_nfolds = 1 nfolds = 2 @@ -719,7 +734,7 @@ def weighted_timepoint_decoder(data, nfolds=2, level=0, optimize_levels=None, cf else: sub_nfolds = 1 - group_assignments = get_xval_assignments(len(data), nfolds) + group_assignments = get_xval_assignments(data.shape[1], nfolds) orig_level = level @@ -763,49 +778,72 @@ def weighted_timepoint_decoder(data, nfolds=2, level=0, optimize_levels=None, cf assert len(level)==len(rfun), 'parameter lengths need to be the same as level if input is ' \ 'type np.ndarray or list' + + results_pd = pd.DataFrame() + for i in range(0, nfolds): - in_raw = [] - out_raw = [] - sub_in_raw = [] - sub_out_raw = [] sub_corrs = [] corrs = [] - subgroup_assignments = get_xval_assignments(len(data[group_assignments == i]), nfolds) - + subgroup_assignments = get_xval_assignments(len(data[0][group_assignments == i]), nfolds) - in_data = [x for x in data[group_assignments == i]] - out_data = [x for x in data[group_assignments != i]] + in_data = [x for x in data[0][group_assignments == i]] + out_data = [x for x in data[0][group_assignments != i]] for v in level: if v==0: - in_smooth, out_smooth, in_raw, out_raw = folding_levels(in_data, out_data, level=v, cfun=None, rfun=p_rfun, + in_smooth, out_smooth, in_raw, out_raw = folding_levels_ec(in_data, out_data, level=v, cfun=None, rfun=p_rfun, combine=combine, weights_fun=weights_fun, weights_params=weights_params) - # next_corrs = (1 - sd.cdist(mean_combine([x for x in in_raw]), mean_combine([x for x in out_raw]), + # next_corrs = (1 - sd.cdist(mean_combine(in_smooth), mean_combine(out_smooth), # 'correlation')) - - next_corrs = (1 - sd.cdist(mean_combine(in_smooth), mean_combine(out_smooth), + next_corrs = (1 - sd.cdist(mean_combine(in_raw), mean_combine(out_raw), 'correlation')) corrs.append(next_corrs) for s in range(0, 1): - sub_in_data = [x for x in data[group_assignments == i][subgroup_assignments==s]] - sub_out_data = [x for x in data[group_assignments == i][subgroup_assignments!=s]] + sub_in_data = [x for x in data[0][group_assignments == i][subgroup_assignments==s]] + sub_out_data = [x for x in data[0][group_assignments == i][subgroup_assignments!=s]] - sub_in_smooth, sub_out_smooth, sub_in_raw, sub_out_raw = folding_levels(sub_in_data, sub_out_data, + sub_in_smooth, sub_out_smooth, sub_in_raw, sub_out_raw = folding_levels_ec(sub_in_data, sub_out_data, level=v, cfun=None, rfun=p_rfun, combine=combine, weights_fun=weights_fun, weights_params=weights_params) - # next_subcorrs = (1 - sd.cdist(mean_combine([x for x in sub_in_raw]), - # mean_combine([x for x in sub_out_raw]), 'correlation')) + # next_subcorrs = (1 - sd.cdist(mean_combine(sub_in_smooth), + # mean_combine(sub_out_smooth), 'correlation')) + next_subcorrs = (1 - sd.cdist(mean_combine(sub_in_raw), + mean_combine(sub_out_raw), 'correlation')) + sub_corrs.append(next_subcorrs) + + elif v==1: + + in_smooth, out_smooth, in_raw, out_raw = folding_levels_ec(in_raw, out_raw, level=v, cfun=cfun, + rfun=rfun, combine=combine, + weights_fun=weights_fun, + weights_params=weights_params) + + next_corrs = (1 - sd.cdist(mean_combine(in_smooth), mean_combine(out_smooth), + 'correlation')) + corrs.append(next_corrs) + + for s in range(0, 1): + + + sub_in_smooth, sub_out_smooth, sub_in_raw, sub_out_raw = folding_levels_ec(sub_in_raw, + sub_out_raw, + level=v, + cfun=cfun, + rfun=rfun, + combine=combine, + weights_fun=weights_fun, + weights_params=weights_params) next_subcorrs = (1 - sd.cdist(mean_combine(sub_in_smooth), mean_combine(sub_out_smooth), 'correlation')) sub_corrs.append(next_subcorrs) @@ -814,8 +852,10 @@ def weighted_timepoint_decoder(data, nfolds=2, level=0, optimize_levels=None, cf else: + in_raw = [x for x in data[v-1][group_assignments == i]] + out_raw = [x for x in data[v-1][group_assignments != i]] - in_smooth, out_smooth, in_raw, out_raw = folding_levels(in_raw, out_raw, level=v, cfun=cfun, + in_smooth, out_smooth, in_raw, out_raw = folding_levels_ec(in_raw, out_raw, level=v, cfun=cfun, rfun=rfun, combine=combine, weights_fun=weights_fun, weights_params=weights_params) @@ -826,7 +866,10 @@ def weighted_timepoint_decoder(data, nfolds=2, level=0, optimize_levels=None, cf for s in range(0, 1): - sub_in_smooth, sub_out_smooth, sub_in_raw, sub_out_raw = folding_levels(sub_in_raw, + sub_in_raw = [x for x in data[v-1][group_assignments == i][subgroup_assignments==s]] + sub_out_raw = [x for x in data[v-1][group_assignments == i][subgroup_assignments!=s]] + + sub_in_smooth, sub_out_smooth, sub_in_raw, sub_out_raw = folding_levels_ec(sub_in_raw, sub_out_raw, level=v, cfun=cfun, @@ -973,41 +1016,6 @@ def pca_decoder(data, nfolds=2, dims=10, cfun=isfc, weights_fun=laplace_weights, return results_pd -def folding_levels(infold_data, outfold_data, level=0, cfun=None, weights_fun=None, weights_params=None, combine=None, - rfun=None): - - from .timecorr import timecorr - - if rfun is None: - rfun = [None] * np.shape(level)[0] - - p_cfun = eval('autofc') - - if level == 0: - - in_fold_smooth = np.asarray(timecorr([x for x in infold_data], cfun=None, - rfun=rfun[level], combine=combine[level], weights_function=weights_fun, - weights_params=weights_params)) - out_fold_smooth = np.asarray(timecorr([x for x in outfold_data], cfun=None, - rfun=rfun[level], combine=combine[level], weights_function=weights_fun, - weights_params=weights_params)) - - in_fold_raw = infold_data - out_fold_raw = outfold_data - else: - - in_fold_smooth = np.asarray(timecorr(list(infold_data), cfun=cfun[level], rfun=rfun[level], combine=combine[level], - weights_function=weights_fun, weights_params=weights_params)) - out_fold_smooth = np.asarray(timecorr(list(outfold_data), cfun=cfun[level], rfun=rfun[level], combine=combine[level], - weights_function=weights_fun, weights_params=weights_params)) - in_fold_raw = np.asarray(timecorr(list(infold_data), cfun=p_cfun, rfun=rfun[level], combine=null_combine, - weights_function=eye_weights, weights_params=eye_params)) - out_fold_raw = np.asarray(timecorr(list(outfold_data), cfun=p_cfun, rfun=rfun[level], combine=null_combine, - weights_function=eye_weights, weights_params=eye_params)) - - return in_fold_smooth, out_fold_smooth, in_fold_raw, out_fold_raw - - def reduce_wrapper(data, dims=10, level=0, rfun=None): if not level == 0: