def glm_nipy(fmri_data, contrasts=None, hrf_model='Canonical', drift_model='Cosine', hfcut=128, residuals_model='spherical', fit_method='ols', fir_delays=[0], rescale_results=False, rescale_factor=None): """ Perform a GLM analysis on fMRI data using the implementation of Nipy. Args: fmri_data (pyhrf.core.FmriData): the input fMRI data defining the paradigm and the measured 3D+time signal. contrasts (dict): keys are contrast labels and values are arithmetic expressions involving regressor names. Valid names are: * names of experimental conditions as defined in fmri_data * constant hrf_model: "Canonical", "Canonical with Derivative", "FIR" residuals_model: "spherical", "ar1" fit_method: "ols", "kalman" (If residuals_model is "ar1" then method is set to "kalman" and this argument is ignored) fir_delays: list of integers indicating the delay of each FIR coefficient (in terms of scans). Eg if TR = 2s. and we want a FIR duration of 20s.: fir_delays=range(10) Returns: (glm instance, design matrix, dict of contrasts of objects) Examples: >>> from pyhrf.core import FmriData >>> from pyhrf.glm import glm_nipy >>> g,dmtx,con = glm_nipy(FmriData.from_vol_ui()) >>> g,dmtx,con = glm_nipy(FmriData.from_vol_ui(), \ contrasts={'A-V':'audio-video'}) """ paradigm = fmri_data.paradigm.to_nipy_paradigm() # BOLD data Y = fmri_data.bold.T n_scans = Y.shape[1] # Design matrix frametimes = np.linspace(0, (n_scans - 1) * fmri_data.tr, n_scans) design_matrix = dm.make_dmtx(frametimes, paradigm, hrf_model=hrf_model, drift_model=drift_model, hfcut=hfcut, fir_delays=fir_delays) ns, nr = design_matrix.matrix.shape logger.info('Design matrix built with %d regressors:', nr) for rn in design_matrix.names: logger.info(' - %s', rn) # GLM fit my_glm = glm.glm() logger.info('Fit GLM - method: %s, residual model: %s', fit_method, residuals_model) my_glm.fit(Y.T, design_matrix.matrix, method=fit_method, model=residuals_model) from pyhrf.tools import map_dict from pyhrf.paradigm import contrasts_to_spm_vec if rescale_results: if 1: if rescale_results and rescale_factor is None: # Rescale by the norm of each regressor in the design matrix dm_reg_norms = (design_matrix.matrix ** 2).sum(0) ** .5 logger.info('GLM results (beta and con effects) are ' 'rescaled by reg norm. Weights: %s ', str(dm_reg_norms)) for ib in xrange(my_glm.beta.shape[0]): my_glm.beta[ib] = my_glm.beta[ib] * dm_reg_norms[ib] else: logger.info('GLM results (beta and con effects) are ' 'rescaled by input scale factor.') # Use input rescale factors: for ib in xrange(rescale_factor.shape[0]): my_glm.beta[ib] = my_glm.beta[ib] * rescale_factor[ib] # TOCHECK: nvbeta seems to be a covar matrix between reg # -> we dont get position-specific variances ... #my_glm.nvbeta[ib,:] = my_glm.nvbeta[ib,:] * rescale_factor[ib]**2 if contrasts is not None: con_vectors = contrasts_to_spm_vec(design_matrix.names, contrasts) # if rescale_results: # for con_vec in con_vectors.itervalues(): # con_vec *= dm_reg_norms contrast_result = map_dict(my_glm.contrast, con_vectors) else: contrast_result = None return my_glm, design_matrix, contrast_result # actually: not possible to compute PPM from glm results # Should relaunch estimation with propoer model under SPM # def PPMcalculus_glmWN(beta, var_beta, dm, threshold_value): '''
def glm_nipy(fmri_data, contrasts=None, hrf_model='Canonical', drift_model='Cosine', hfcut=128, residuals_model='spherical', fit_method='ols', fir_delays=[0], rescale_results=False, rescale_factor=None): """ Perform a GLM analysis on fMRI data using the implementation of Nipy. Args: fmri_data (pyhrf.core.FmriData): the input fMRI data defining the paradigm and the measured 3D+time signal. contrasts (dict): keys are contrast labels and values are arithmetic expressions involving regressor names. Valid names are: * names of experimental conditions as defined in fmri_data * constant hrf_model: "Canonical", "Canonical with Derivative", "FIR" residuals_model: "spherical", "ar1" fit_method: "ols", "kalman" (If residuals_model is "ar1" then method is set to "kalman" and this argument is ignored) fir_delays: list of integers indicating the delay of each FIR coefficient (in terms of scans). Eg if TR = 2s. and we want a FIR duration of 20s.: fir_delays=range(10) Returns: (glm instance, design matrix, dict of contrasts of objects) Examples: >>> from pyhrf.core import FmriData >>> from pyhrf.glm import glm_nipy >>> g,dmtx,con = glm_nipy(FmriData.from_vol_ui()) >>> g,dmtx,con = glm_nipy(FmriData.from_vol_ui(), \ contrasts={'A-V':'audio-video'}) """ paradigm = fmri_data.paradigm.to_nipy_paradigm() # BOLD data Y = fmri_data.bold.T n_scans = Y.shape[1] # pyhrf.verbose(1, 'Input BOLD: nvox=%d, nscans=%d' %Y.shape) # Design matrix frametimes = np.linspace(0, (n_scans-1)*fmri_data.tr, n_scans) design_matrix = dm.make_dmtx(frametimes, paradigm, hrf_model=hrf_model, drift_model=drift_model, hfcut=hfcut, fir_delays=fir_delays) ns, nr = design_matrix.matrix.shape pyhrf.verbose(2, 'Design matrix built with %d regressors:' %nr) for rn in design_matrix.names: pyhrf.verbose(2, ' - %s' %rn) # ax = design_matrix.show() # ax.set_position([.05, .25, .9, .65]) # ax.set_title('Design matrix') # plt.savefig(op.join(output_dir, 'design_matrix.png')) # GLM fit my_glm = glm.glm() pyhrf.verbose(2, 'Fit GLM - method: %s, residual model: %s' \ %(fit_method,residuals_model)) my_glm.fit(Y.T, design_matrix.matrix, method=fit_method, model=residuals_model) from pyhrf.tools import map_dict from pyhrf.paradigm import contrasts_to_spm_vec if rescale_results: # Rescale by the norm of the HRF: # from nipy.modalities.fmri.hemodynamic_models import _hrf_kernel, \ # sample_condition # oversampling = 16 # hrfs = _hrf_kernel(hrf_model, fmri_data.tr, oversampling, # fir_delays=fir_delays) # hframetimes = np.linspace(0, 32., int(32./fmri_data.tr)) # hr_regressor, hr_frametimes = sample_condition( # (np.array([0]),np.array([0]),np.array([1])), # hframetimes, oversampling) # from scipy.interpolate import interp1d # for i in xrange(len(hrfs)): # f = interp1d(hr_frametimes, hrfs[i]) # hrfs[i] = f(hframetimes).T # n_conds = len(fmri_data.paradigm.stimOnsets) # for i in xrange(n_conds * len(hrfs)): # h = hrfs[i%len(hrfs)] # my_glm.beta[i] = my_glm.beta[i] * (h**2).sum()**.5 #my_glm.variance = np.zeros_like(my_glm.beta) if 1: if rescale_results and rescale_factor is None: #Rescale by the norm of each regressor in the design matrix dm_reg_norms = (design_matrix.matrix**2).sum(0)**.5 pyhrf.verbose(2,'GLM results (beta and con effects) are '\ 'rescaled by reg norm. Weights: %s ' \ %str(dm_reg_norms)) for ib in xrange(my_glm.beta.shape[0]): my_glm.beta[ib] = my_glm.beta[ib] * dm_reg_norms[ib] #my_glm.nvbeta[ib,:] = my_glm.nvbeta[ib,:] * dm_reg_norms[ib]**2 else: pyhrf.verbose(2,'GLM results (beta and con effects) are '\ 'rescaled by input scale factor.') # Use input rescale factors: for ib in xrange(rescale_factor.shape[0]): my_glm.beta[ib] = my_glm.beta[ib] * rescale_factor[ib] #TOCHECK: nvbeta seems to be a covar matrix between reg # -> we dont get position-specific variances ... #my_glm.nvbeta[ib,:] = my_glm.nvbeta[ib,:] * rescale_factor[ib]**2 if contrasts is not None: con_vectors = contrasts_to_spm_vec(design_matrix.names, contrasts) # if rescale_results: # for con_vec in con_vectors.itervalues(): # con_vec *= dm_reg_norms contrast_result = map_dict(my_glm.contrast, con_vectors) else: contrast_result = None return my_glm, design_matrix, contrast_result #actually: not possible to compute PPM from glm results #Should relaunch estimation with propoer model under SPM #def PPMcalculus_glmWN(beta, var_beta, dm, threshold_value): '''
def glm_nipy(fmri_data, contrasts=None, hrf_model='Canonical', drift_model='Cosine', hfcut=128, residuals_model='spherical', fit_method='ols', fir_delays=[0], rescale_results=False, rescale_factor=None): """ Perform a GLM analysis on fMRI data using the implementation of Nipy. Args: fmri_data (pyhrf.core.FmriData): the input fMRI data defining the paradigm and the measured 3D+time signal. contrasts (dict): keys are contrast labels and values are arithmetic expressions involving regressor names. Valid names are: * names of experimental conditions as defined in fmri_data * constant hrf_model: "Canonical", "Canonical with Derivative", "FIR" residuals_model: "spherical", "ar1" fit_method: "ols", "kalman" (If residuals_model is "ar1" then method is set to "kalman" and this argument is ignored) fir_delays: list of integers indicating the delay of each FIR coefficient (in terms of scans). Eg if TR = 2s. and we want a FIR duration of 20s.: fir_delays=range(10) Returns: (glm instance, design matrix, dict of contrasts of objects) Examples: >>> from pyhrf.core import FmriData >>> from pyhrf.glm import glm_nipy >>> g,dmtx,con = glm_nipy(FmriData.from_vol_ui()) >>> g,dmtx,con = glm_nipy(FmriData.from_vol_ui(), \ contrasts={'A-V':'audio-video'}) """ paradigm = fmri_data.paradigm.to_nipy_paradigm() # BOLD data Y = fmri_data.bold.T n_scans = Y.shape[1] # Design matrix frametimes = np.linspace(0, (n_scans - 1) * fmri_data.tr, n_scans) design_matrix = dm.make_dmtx(frametimes, paradigm, hrf_model=hrf_model, drift_model=drift_model, hfcut=hfcut, fir_delays=fir_delays) ns, nr = design_matrix.matrix.shape logger.info('Design matrix built with %d regressors:', nr) for rn in design_matrix.names: logger.info(' - %s', rn) # GLM fit my_glm = glm.glm() logger.info('Fit GLM - method: %s, residual model: %s', fit_method, residuals_model) my_glm.fit(Y.T, design_matrix.matrix, method=fit_method, model=residuals_model) from pyhrf.tools import map_dict from pyhrf.paradigm import contrasts_to_spm_vec if rescale_results: if 1: if rescale_results and rescale_factor is None: # Rescale by the norm of each regressor in the design matrix dm_reg_norms = (design_matrix.matrix**2).sum(0)**.5 logger.info( 'GLM results (beta and con effects) are ' 'rescaled by reg norm. Weights: %s ', str(dm_reg_norms)) for ib in xrange(my_glm.beta.shape[0]): my_glm.beta[ib] = my_glm.beta[ib] * dm_reg_norms[ib] else: logger.info('GLM results (beta and con effects) are ' 'rescaled by input scale factor.') # Use input rescale factors: for ib in xrange(rescale_factor.shape[0]): my_glm.beta[ib] = my_glm.beta[ib] * rescale_factor[ib] # TOCHECK: nvbeta seems to be a covar matrix between reg # -> we dont get position-specific variances ... #my_glm.nvbeta[ib,:] = my_glm.nvbeta[ib,:] * rescale_factor[ib]**2 if contrasts is not None: con_vectors = contrasts_to_spm_vec(design_matrix.names, contrasts) # if rescale_results: # for con_vec in con_vectors.itervalues(): # con_vec *= dm_reg_norms contrast_result = map_dict(my_glm.contrast, con_vectors) else: contrast_result = None return my_glm, design_matrix, contrast_result # actually: not possible to compute PPM from glm results # Should relaunch estimation with propoer model under SPM # def PPMcalculus_glmWN(beta, var_beta, dm, threshold_value): '''