Source code for glmdenoise.utils.make_design_matrix
import numpy as np
from scipy.interpolate import pchip
[docs]def make_design(events, tr, n_times, hrf=None):
"""generate either a blip design or one convolved with an hrf
Args:
events ([type]): [description]
tr ([type]): [description]
n_times ([type]): [description]
hrf ([type], optional): Defaults to None. [description]
Returns:
[type]: [description]
"""
# loop over conditions
conditions = np.unique(events.trial_type)
n_conditions = len(set(events['trial_type'].values))
dm = np.zeros((n_times, n_conditions))
if hrf is None:
for i, cond in enumerate(conditions):
# onset times for qth condition in run p
otimes = np.array(
events[events['trial_type'] == cond]['onset'].values//tr).astype(int)
yvals = np.zeros((n_times))
for r in otimes:
yvals[r] = 1
dm[:, i] = yvals
else:
# calc
all_times = np.linspace(0, tr*(n_times-1), n_times)
hrf_times = np.linspace(0, tr*(len(hrf)-1), len(hrf))
for i, cond in enumerate(conditions):
# onset times for qth condition in run p
otimes = events[events['trial_type'] == cond]['onset'].values
# intialize
yvals = np.zeros((n_times))
# loop over onset times
for r in otimes:
# interpolate to find values at the data sampling time points
f = pchip(r + hrf_times, hrf, extrapolate=False)(all_times)
yvals = yvals + np.nan_to_num(f)
# record
dm[:, i] = yvals
return dm