def test_designmat(tmpdir): mat1 = Design_Matrix({'X':[1,4,2,7,5,9,2,1,3,2],'Y':[3,0,0,6,9,9,10,10,1,10],'Z':[2,2,2,2,7,0,1,3,3,2],'intercept':[1,1,1,1,1,1,1,1,1,1]},TR=2.0,hasIntercept=True) mat2 = Design_Matrix({'X':[9,9,2,7,5,0,1,1,1,2],'Y':[3,3,3,6,9,0,1,10,1,10],'Z':[2,6,3,2,7,0,1,7,8,8],'intercept':[1,1,1,1,1,1,1,1,1,1]},TR=2.0,hasIntercept=True) #appending assert mat1.append(mat1,axis=1).shape == (mat1.shape[0],mat1.shape[1]+mat2.shape[1]) assert mat1.append(mat2,axis=0).shape == (mat1.shape[0]+mat2.shape[0],mat1.shape[1]+1) #convolution doesn't affect intercept assert all(mat1.convolve().iloc[:,-1] == mat1.iloc[:,-1]) #but it still works assert (mat1.convolve().iloc[:,:3].values != mat1.iloc[:,:3].values).any() #Test vifs expectedVifs = np.array([ 1.03984251, 1.02889877, 1.02261945]) assert np.allclose(expectedVifs,mat1.vif()) #poly mat1.addpoly(order=4).shape[1] == mat1.shape[1]+4 mat1.addpoly(order=4,include_lower=False).shape[1] == mat1.shape[1]+1 #zscore z = mat1.zscore(colNames=['X','Z']) assert (z['Y'] == mat1['Y']).all() assert z.shape == mat1.shape
def test_designmat(tmpdir): mat1 = Design_Matrix({ 'X':[1, 4, 2, 7, 5, 9, 2, 1, 3, 2], 'Y':[3, 0, 0, 6, 9, 9, 10, 10, 1, 10], 'Z':[2, 2, 2, 2, 7, 0, 1, 3, 3, 2], 'intercept':[1, 1, 1, 1, 1, 1, 1, 1, 1, 1] }, sampling_rate=2.0,polys=['intercept']) mat2 = Design_Matrix({ 'X':[9, 9, 2, 7, 5, 0, 1, 1, 1, 2], 'Y':[3, 3, 3, 6, 9, 0, 1, 10, 1, 10], 'Z':[2, 6, 3, 2, 7, 0, 1, 7, 8, 8], 'intercept':[1, 1, 1, 1, 1, 1, 1, 1, 1, 1] }, sampling_rate=2.0, polys=['intercept']) # Appending # Basic horz cat new_mat = mat1.append(mat1,axis=1) assert new_mat.shape == (mat1.shape[0], mat1.shape[1] + mat2.shape[1]) both_cols = list(mat1.columns) + list(mat1.columns) assert all(new_mat.columns == both_cols) # Basic vert cat new_mat = mat1.append(mat1,axis=0) assert new_mat.shape == (mat1.shape[0]*2, mat1.shape[1]+1) # Advanced vert cat new_mat = mat1.append(mat1,axis=0,keep_separate=False) assert new_mat.shape == (mat1.shape[0]*2,mat1.shape[1]) # More advanced vert cat new_mat = mat1.append(mat1,axis=0,add_poly=2) assert new_mat.shape == (mat1.shape[0]*2, 9) #convolution doesn't affect intercept assert all(mat1.convolve().iloc[:, -1] == mat1.iloc[:, -1]) #but it still works assert (mat1.convolve().iloc[:, :3].values != mat1.iloc[:, :3].values).any() #Test vifs expectedVifs = np.array([ 1.03984251, 1.02889877, 1.02261945]) assert np.allclose(expectedVifs,mat1.vif()) #poly mat1.add_poly(order=4).shape[1] == mat1.shape[1]+4 mat1.add_poly(order=4, include_lower=False).shape[1] == mat1.shape[1]+1 #zscore z = mat1.zscore(columns=['X', 'Z']) assert (z['Y'] == mat1['Y']).all() assert z.shape == mat1.shape # clean mat = Design_Matrix({ 'X':[1, 4, 2, 7, 5, 9, 2, 1, 3, 2], 'A':[1, 4, 2, 7, 5, 9, 2, 1, 3, 2], 'Y':[3, 0, 0, 6, 9, 9, 10, 10, 1, 10], 'Z':[2, 2, 2, 2, 7, 0, 1, 3, 3, 2], 'C':[1, 4, 2, 7, 5, 9, 2, 1, 3, 2], 'intercept':[1, 1, 1, 1, 1, 1, 1, 1, 1, 1] }, sampling_rate=2.0,polys=['intercept']) mat = mat[['X','A','Y','Z','C','intercept']] assert all(mat.clean().columns == ['X','Y','Z','intercept']) # replace data mat = Design_Matrix({ 'X':[1, 4, 2, 7, 5, 9, 2, 1, 3, 2], 'A':[1, 4, 2, 7, 5, 9, 2, 1, 3, 2], 'Y':[3, 0, 0, 6, 9, 9, 10, 10, 1, 10], 'Z':[2, 2, 2, 2, 7, 0, 1, 3, 3, 2], 'C':[1, 4, 2, 7, 5, 9, 2, 1, 3, 2] }, sampling_rate=2.0) mat = mat.replace_data(np.ones((mat.shape[0],mat.shape[1]-1)),column_names=['a','b','c','d']) assert(np.allclose(mat.values,1)) assert(all(mat.columns == ['a','b','c','d'])) #DCT basis_mat mat = Design_Matrix(np.random.randint(2,size=(500,3)),sampling_rate=2.0) mat = mat.add_dct_basis() assert len(mat.polys) == 11 assert mat.shape[1] == 14 #Up and down sampling mat = Design_Matrix(np.random.randint(2,size=(500,4)),sampling_rate=2.0,columns=['a','b','c','d']) target = 1 assert mat.upsample(target).shape[0] == mat.shape[0]*2 - target*2 target = 4 assert mat.downsample(target).shape[0] == mat.shape[0]/2
num_runs = 4 TR = 2.0 sampling_freq = 1. / TR all_runs = Design_Matrix(sampling_freq=sampling_freq) for i in range(num_runs): # 1) Load in onsets for this run onsetsFile = os.path.join(get_resource_path(), 'onsets_example.txt') dm = onsets_to_dm(onsetsFile, sampling_freq=sampling_freq, run_length=160, sort=True) # 2) Convolve them with the hrf dm = dm.convolve() # 2) Load in covariates for this run covariatesFile = os.path.join(get_resource_path(), 'covariates_example.csv') cov = pd.read_csv(covariatesFile) cov = Design_Matrix(cov, sampling_freq=sampling_freq) # 3) In the covariates, fill any NaNs with 0, add intercept and linear trends and dct basis functions cov = cov.fillna(0) # Retain a list of nuisance covariates (e.g. motion and spikes) which we'll also want to also keep separate for each run cov_columns = cov.columns cov = cov.add_poly(1).add_dct_basis() # 4) Join the onsets and covariates together