def group_analysis_signs(design, contrast, mask, signs=None): """ This function refits the EM model with a vector of signs. Used in the permutation tests. Returns the maximum of the T-statistic within mask Parameters ---------- design: one of 'block', 'event' contrast: str mask: array-like signs: ndarray, optional Defaults to np.ones. Should have shape (*,nsubj) where nsubj is the number of effects combined in the group analysis. Returns ------- minT: np.ndarray, minima of T statistic within mask, one for each vector of signs maxT: np.ndarray, maxima of T statistic within mask, one for each vector of signs """ maska = np.asarray(mask).astype(np.bool) # Which subjects have this (contrast, design) pair? subjects = futil.subject_dirs(design, contrast) sd = np.array([np.array(load_image(pjoin(s, "sd.nii")))[:,maska] for s in subjects]) Y = np.array([np.array(load_image(pjoin(s, "effect.nii")))[:,maska] for s in subjects]) if signs is None: signs = np.ones((1, Y.shape[0])) maxT = np.empty(signs.shape[0]) minT = np.empty(signs.shape[0]) for i, sign in enumerate(signs): signY = sign[:,np.newaxis] * Y varest = onesample.estimate_varatio(signY, sd) random_var = varest['random'] adjusted_var = sd**2 + random_var adjusted_sd = np.sqrt(adjusted_var) results = onesample.estimate_mean(Y, adjusted_sd) T = results['t'] minT[i], maxT[i] = np.nanmin(T), np.nanmax(T) return minT, maxT
def permutation_test(design, contrast, mask=GROUP_MASK, nsample=1000): """ Perform a permutation (sign) test for a given design type and contrast. It is a Monte Carlo test because we only sample nsample possible sign arrays. Parameters ---------- design: one of ['block', 'event'] contrast: str nsample: int Returns ------- min_vals: np.ndarray max_vals: np.ndarray """ maska = np.asarray(mask).astype(np.bool) subjects = futil.subject_dirs(design, contrast) Y = np.array([np.array(load_image(pjoin(s, "effect.nii")))[:,maska] for s in subjects]) nsubj = Y.shape[0] signs = 2*np.greater(np.random.sample(size=(nsample, nsubj)), 0.5) - 1 min_vals, max_vals = group_analysis_signs(design, contrast, maska, signs) return min_vals, max_vals
def group_analysis(design, contrast): """ Compute group analysis effect, sd and t for a given contrast and design type """ array = np.array # shorthand # Directory where output will be written odir = futil.ensure_dir(futil.DATADIR, 'group', design, contrast) # Which subjects have this (contrast, design) pair? subjects = futil.subject_dirs(design, contrast) sd = array([array(load_image(pjoin(s, "sd.nii"))) for s in subjects]) Y = array([array(load_image(pjoin(s, "effect.nii"))) for s in subjects]) # This function estimates the ratio of the # fixed effects variance (sum(1/sd**2, 0)) # to the estimated random effects variance # (sum(1/(sd+rvar)**2, 0)) where # rvar is the random effects variance. # The EM algorithm used is described in # # Worsley, K.J., Liao, C., Aston, J., Petre, V., Duncan, G.H., # Morales, F., Evans, A.C. (2002). \'A general statistical # analysis for fMRI data\'. NeuroImage, 15:1-15 varest = onesample.estimate_varatio(Y, sd) random_var = varest['random'] # XXX - if we have a smoother, use # random_var = varest['fixed'] * smooth(varest['ratio']) # Having estimated the random effects variance (and # possibly smoothed it), the corresponding # estimate of the effect and its variance is # computed and saved. # This is the coordmap we will use coordmap = futil.load_image_fiac("fiac_00","wanatomical.nii").coordmap adjusted_var = sd**2 + random_var adjusted_sd = np.sqrt(adjusted_var) results = onesample.estimate_mean(Y, adjusted_sd) for n in ['effect', 'sd', 't']: im = api.Image(results[n], coordmap.copy()) save_image(im, pjoin(odir, "%s.nii" % n))