def linregress_ting(bst, tuningcurve, n_shuffles=250):
"""perform linear regression on all the events in bst, and return the R^2 values"""
if float(n_shuffles).is_integer:
n_shuffles = int(n_shuffles)
else:
raise ValueError("n_shuffles must be an integer!")
posterior, bdries, mode_pth, mean_pth = decode(bst=bst, ratemap=tuningcurve)
# bdries = np.insert(np.cumsum(bst.lengths), 0, 0)
r2values = np.zeros(bst.n_epochs)
r2values_shuffled = np.zeros((n_shuffles, bst.n_epochs))
for idx in range(bst.n_epochs):
y = mode_pth[bdries[idx]:bdries[idx+1]]
x = np.arange(bdries[idx],bdries[idx+1], step=1)
x = x[~np.isnan(y)]
y = y[~np.isnan(y)]
if len(y) > 0:
slope, intercept, rvalue, pvalue, stderr = stats.linregress(x, y)
r2values[idx] = rvalue**2
else:
r2values[idx] = np.nan #
for ss in range(n_shuffles):
if len(y) > 0:
slope, intercept, rvalue, pvalue, stderr = stats.linregress(np.random.permutation(x), y)
r2values_shuffled[ss, idx] = rvalue**2
else:
r2values_shuffled[ss, idx] = np.nan # event contained NO decoded activity... unlikely or even impossible with current code
# sig_idx = np.argwhere(r2values[0,:] > np.percentile(r2values, q=q, axis=0))
# np.argwhere(((R2[1:,:] >= R2[0,:]).sum(axis=0))/(R2.shape[0]-1)<0.05) # equivalent to above
if n_shuffles > 0:
return r2values, r2values_shuffled
return r2values
评论列表
文章目录