Package: neuropop
neuropopanalysis tools for large-scale neural recordingsCopyright (C) 2023 Howard Hughes Medical Institute Janelia Research Campus, the labs of Carsen Stringer and Marius PachitariuThis code is licensed under GPL v3 (no redistribution without credit, and no redistribution in private repos, seelicensefor more details).references[1]Stringer, C.*, Pachitariu, M.*, Steinmetz, N., Carandini, M., & Harris, K. D. (2019). High-dimensional geometry of population responses in visual cortex.Nature, 571(7765), 361-365.[2]Stringer, C.*, Pachitariu, M.*, Steinmetz, N., Reddy, C. B., Carandini, M., & Harris, K. D. (2019). Spontaneous behaviors drive multidimensional, brainwide activity.Science, 364(6437), eaav7893.[3]Syeda, A., Zhong, L., Tung, R., Long, W., Pachitariu, M.*, & Stringer, C.* (2022). Facemap: a framework for modeling neural activity based on orofacial tracking.bioRxiv.dimensionality.pyThis module contains code for dimensionality estimation methods for neural data:Cross-validated PCA (described in[1]) is for estimating the dimensionality of neural stimulus responses where each stimulus is shown at least twice. Divide your data into two repeats -- a matrix of 2 x stimuli x neurons, and input it into the functioncvPCAto obtain the cross-validated eigenspectrum. Note that each repeat can be the average of several stimulus responses (e.g. 5-10 each). You can then use theget_powerlawfunction to estimate the exponent of the decay of the eigenspectrum. If you use these functions please cite[1].Shared variance components analysis (described in[2]) is for estimating the dimensionality of neural activity that is shared across neurons (excluding single neuron variability). This method divides the neurons in half and the timepoints in half into training and testing. Then it computes the principal components of the covariance between the two neural halves on the training timepoints, and then computing the variance of those components on the testing timepoints. Take your neural data as a matrix of neurons x time and input it into the functionSVCAto obtain the variance of each component of the covariance matrix on the test setscov(this had a powerlaw decay of ~1.1 in[2]). The function also returns the average variance of each component in each neural halfvarcov. If you use this function please cite[2].peer_prediction.pyPrediction of one half of neurons from the other half of neurons, in order to estimate an upper bound for the amount of predictable variance in the neural population. If you use this function, please cite[2].linear_prediction.pyThis module contains code for ridge regression and regularized reduced rank regression, particularly for predicting from behavior to neural activity. The main function isprediction_wrapper, ifrankis None then ridge regression is performed, otherwise reduced rank regression is performed. This function assumes you have pytorch with GPU support, otherwise setdevice=torch.device('cpu'). CCA is also implemented without GPU support. If you use these functions please cite[2].nn_prediction.pyThis module contains code for non-linear prediction of neural activity from behavior, as described in[3]. The main function isnetwork_wrapper, this function assumes you have pytorch with GPU support, otherwise setdevice=torch.device('cpu'), and it also assumes you have taken the principal components of the dataU, e.g.:# z-score neural activity
spks -= spks.mean(axis=1)[:, np.newaxis]
std = ((spks**2).mean(axis=1) ** 0.5)[:, np.newaxis]
std[std == 0] = 1
spks /= std

# compute principal components
from sklearn.decomposition import PCA
Y = PCA(n_components=128).fit_transform(spks.T)
U = spks @ Y
U /= (U**2).sum(axis=0) ** 0.5

# predict Y from behavior variables x (z-score x if using keypoints)
# tcam are camera/behavior timestamps, tneural are neural timestamps
varexp, varexp_neurons, spks_pred_test0, itest, model = network_wrapper(x, Y, tcam, tneural, U, spks, delay=-1, verbose=True)If you use these functions please cite[3].future_prediction.pyThis contains functions for predicting behavioral or neural variables into the future using ridge regression with exponential basis functions (see Figure 1 in[3]). If you use these functions please cite[3].requirementsThis package relies on the following excellent packages (recommended to cite these in your work as well if you use them):numpyscipyscikit-learnpytorch