def remove_subject_from_stats(meanfname, varfname, samplesize, subjvolfname, newmeanfname, newvarfname, newstdfname=''): meanfname = au.add_extension_if_needed(meanfname, au.ext_str()) varfname = au.add_extension_if_needed(varfname, au.ext_str()) subjvolfname = au.add_extension_if_needed(subjvolfname, au.ext_str()) newmeanfname = au.add_extension_if_needed(newmeanfname, au.ext_str()) newvarfname = au.add_extension_if_needed(newvarfname, au.ext_str()) if newstdfname: newstdfname = au.add_extension_if_needed(newstdfname, au.ext_str()) #load data n = samplesize meanv = nib.load(meanfname).get_data() varv = nib.load(varfname).get_data() subjv = nib.load(subjvolfname).get_data() aff = nib.load(meanfname).get_affine() #calculate new mean: ((oldmean*N) - x)/(N-1) newmean = meanv.copy() newmean = ((newmean * n) - subjv) / (n - 1) newmean = np.nan_to_num(newmean) #calculate new variance: # oldvar = (n/(n-1)) * (sumsquare/n - oldmu^2) # s = ((oldvar * (n/(n-1)) ) + oldmu^2) * n # newvar = ((n-1)/(n-2)) * (((s - x^2)/(n-1)) - newmu^2) s = varv.copy() s = ((s * (n / (n - 1))) + np.square(meanv)) * n newvar = ((n - 1) / (n - 2)) * (((s - np.square(subjv)) / (n - 1)) - np.square(newmean)) newvar = np.nan_to_num(newvar) #save nifti files au.save_nibabel(newmeanfname, newmean, aff) au.save_nibabel(newvarfname, newvar, aff) #calculate new standard deviation: sqrt(newvar) if newstdfname: newstd = np.sqrt(newvar) newstd = np.nan_to_num(newstd) au.save_nibabel(newstdfname, newstd, aff)
def change_to_absolute_values (niifname, outfname=''): niifname = au.add_extension_if_needed(niifname, au.ext_str()) if not outfname: outfname = niifname try: #load data vol = nib.load(niifname).get_data() aff = nib.load(niifname).get_affine() vol = np.abs(vol) #save nifti file au.save_nibabel (outfname, vol, aff) except: au.log.error ("Change_to_absolute_values:: Unexpected error: ", sys.exc_info()[0]) raise
def change_to_absolute_values(niifname, outfname=''): niifname = au.add_extension_if_needed(niifname, au.ext_str()) if not outfname: outfname = niifname try: #load data vol = nib.load(niifname).get_data() aff = nib.load(niifname).get_affine() vol = np.abs(vol) #save nifti file au.save_nibabel(outfname, vol, aff) except: au.log.error("Change_to_absolute_values:: Unexpected error: ", sys.exc_info()[0]) raise
def remove_subject_from_stats (meanfname, varfname, samplesize, subjvolfname, newmeanfname, newvarfname, newstdfname=''): meanfname = au.add_extension_if_needed(meanfname, au.ext_str()) varfname = au.add_extension_if_needed(varfname, au.ext_str()) subjvolfname = au.add_extension_if_needed(subjvolfname, au.ext_str()) newmeanfname = au.add_extension_if_needed(newmeanfname, au.ext_str()) newvarfname = au.add_extension_if_needed(newvarfname, au.ext_str()) if newstdfname: newstdfname = au.add_extension_if_needed(newstdfname, au.ext_str()) #load data n = samplesize meanv = nib.load(meanfname).get_data() varv = nib.load( varfname).get_data() subjv = nib.load(subjvolfname).get_data() aff = nib.load(meanfname).get_affine() #calculate new mean: ((oldmean*N) - x)/(N-1) newmean = meanv.copy() newmean = ((newmean * n) - subjv)/(n-1) newmean = np.nan_to_num(newmean) #calculate new variance: # oldvar = (n/(n-1)) * (sumsquare/n - oldmu^2) # s = ((oldvar * (n/(n-1)) ) + oldmu^2) * n # newvar = ((n-1)/(n-2)) * (((s - x^2)/(n-1)) - newmu^2) s = varv.copy() s = ((s * (n/(n-1)) ) + np.square(meanv)) * n newvar = ((n-1)/(n-2)) * (((s - np.square(subjv))/(n-1)) - np.square(newmean)) newvar = np.nan_to_num(newvar) #save nifti files au.save_nibabel (newmeanfname, newmean, aff) au.save_nibabel (newvarfname , newvar, aff) #calculate new standard deviation: sqrt(newvar) if newstdfname: newstd = np.sqrt(newvar) newstd = np.nan_to_num(newstd) au.save_nibabel (newstdfname, newstd, aff)
def group_distance (measure_function, datadir, groups, groupsizes, chkf, absolute=False, outdir='', foldno='', expname='', exclude_idx=-1, exclude_subj='', exclude_subjclass=''): olddir = os.getcwd() if not outdir: outdir = datadir ngroups = len(groups) #matrix of strings of 2000 characters maximum, to save filepaths gfnames = np.zeros ([ngroups,3], dtype=np.dtype('a2000')) subject_excluded = False for g1 in range(ngroups): g1name = groups[g1] #mean1fname gfnames[g1,0] = datadir + os.path.sep + g1name + '_' + au.mean_str() #var1fname gfnames[g1,1] = datadir + os.path.sep + g1name + '_' + au.var_str() #std1fname gfnames[g1,2] = datadir + os.path.sep + g1name + '_' + au.std_str() for g2 in range(g1+1, ngroups): g2name = groups[g2] gfnames[g2,0] = datadir + os.path.sep + g2name + '_' + au.mean_str() gfnames[g2,1] = datadir + os.path.sep + g2name + '_' + au.var_str() gfnames[g2,2] = datadir + os.path.sep + g2name + '_' + au.std_str() experiment = g1name + '_vs_' + g2name #check if exclude_subjclass is any of both current groups eg = -1 if exclude_idx > -1: if exclude_subjclass == g1name: eg = g2 elif exclude_subjclass == g2name: eg = g1 step = au.measure_str() + ' ' + measure_function.func_name + ' ' + experiment + ' ' + datadir #remove subject from stats if eg > -1: exclude_str = '_' + au.excluded_str() + str(exclude_idx) step += exclude_str experiment += exclude_str if not au.is_done(chkf, step): if not subject_excluded: newmeanfname = gfnames[eg,0] + exclude_str newvarfname = gfnames[eg,1] + exclude_str newstdfname = gfnames[eg,2] + exclude_str rstep = au.remove_str() + ' ' + au.subject_str() + ' ' + str(exclude_subj) + ' ' + au.fromstats_str() + ' ' + datadir if not au.is_done(chkf, rstep): #(meanfname, varfname, samplesize, subjvolfname, newmeanfname, newvarfname, newstdfname='') remove_subject_from_stats (gfnames[eg,0], gfnames[eg,1], groupsizes[eg][1], exclude_subj, newmeanfname, newvarfname, newstdfname) au.checklist_add (chkf, rstep) gfnames[eg,0] += exclude_str gfnames[eg,1] += exclude_str gfnames[eg,2] += exclude_str groupsizes[eg][1] -= 1 subject_excluded = True #calculating distance if not au.is_done(chkf, step): mean1fname = au.add_extension_if_needed (gfnames[g1,0], au.ext_str()) mean2fname = au.add_extension_if_needed (gfnames[g2,0], au.ext_str()) var1fname = au.add_extension_if_needed (gfnames[g1,1], au.ext_str()) var2fname = au.add_extension_if_needed (gfnames[g2,1], au.ext_str()) std1fname = au.add_extension_if_needed (gfnames[g1,2], au.ext_str()) std2fname = au.add_extension_if_needed (gfnames[g2,2], au.ext_str()) outfname = measure_function (mean1fname, mean2fname, var1fname, var2fname, std1fname, std2fname, groupsizes[g1][1], groupsizes[g2][1], experiment, outdir, exclude_idx) if absolute: change_to_absolute_values (outfname) au.checklist_add (chkf, step) return outfname
def group_distance(measure_function, datadir, groups, groupsizes, chkf, absolute=False, outdir='', foldno='', expname='', exclude_idx=-1, exclude_subj='', exclude_subjclass=''): olddir = os.getcwd() if not outdir: outdir = datadir ngroups = len(groups) #matrix of strings of 2000 characters maximum, to save filepaths gfnames = np.zeros([ngroups, 3], dtype=np.dtype('a2000')) subject_excluded = False for g1 in range(ngroups): g1name = groups[g1] #mean1fname gfnames[g1, 0] = datadir + os.path.sep + g1name + '_' + au.mean_str() #var1fname gfnames[g1, 1] = datadir + os.path.sep + g1name + '_' + au.var_str() #std1fname gfnames[g1, 2] = datadir + os.path.sep + g1name + '_' + au.std_str() for g2 in range(g1 + 1, ngroups): g2name = groups[g2] gfnames[g2, 0] = datadir + os.path.sep + g2name + '_' + au.mean_str() gfnames[g2, 1] = datadir + os.path.sep + g2name + '_' + au.var_str() gfnames[g2, 2] = datadir + os.path.sep + g2name + '_' + au.std_str() experiment = g1name + '_vs_' + g2name #check if exclude_subjclass is any of both current groups eg = -1 if exclude_idx > -1: if exclude_subjclass == g1name: eg = g2 elif exclude_subjclass == g2name: eg = g1 step = au.measure_str( ) + ' ' + measure_function.func_name + ' ' + experiment + ' ' + datadir #remove subject from stats if eg > -1: exclude_str = '_' + au.excluded_str() + str(exclude_idx) step += exclude_str experiment += exclude_str if not au.is_done(chkf, step): if not subject_excluded: newmeanfname = gfnames[eg, 0] + exclude_str newvarfname = gfnames[eg, 1] + exclude_str newstdfname = gfnames[eg, 2] + exclude_str rstep = au.remove_str() + ' ' + au.subject_str( ) + ' ' + str(exclude_subj) + ' ' + au.fromstats_str( ) + ' ' + datadir if not au.is_done(chkf, rstep): #(meanfname, varfname, samplesize, subjvolfname, newmeanfname, newvarfname, newstdfname='') remove_subject_from_stats(gfnames[eg, 0], gfnames[eg, 1], groupsizes[eg][1], exclude_subj, newmeanfname, newvarfname, newstdfname) au.checklist_add(chkf, rstep) gfnames[eg, 0] += exclude_str gfnames[eg, 1] += exclude_str gfnames[eg, 2] += exclude_str groupsizes[eg][1] -= 1 subject_excluded = True #calculating distance if not au.is_done(chkf, step): mean1fname = au.add_extension_if_needed( gfnames[g1, 0], au.ext_str()) mean2fname = au.add_extension_if_needed( gfnames[g2, 0], au.ext_str()) var1fname = au.add_extension_if_needed(gfnames[g1, 1], au.ext_str()) var2fname = au.add_extension_if_needed(gfnames[g2, 1], au.ext_str()) std1fname = au.add_extension_if_needed(gfnames[g1, 2], au.ext_str()) std2fname = au.add_extension_if_needed(gfnames[g2, 2], au.ext_str()) outfname = measure_function(mean1fname, mean2fname, var1fname, var2fname, std1fname, std2fname, groupsizes[g1][1], groupsizes[g2][1], experiment, outdir, exclude_idx) if absolute: change_to_absolute_values(outfname) au.checklist_add(chkf, step) return outfname