# using-nemos
> Use this skill when writing code that uses the NeMoS (Neural Models and Statistics) Python package for fitting Generalized Linear Models (GLMs) to neuroscience data. Covers basis functions, single-neuron and population GLMs, observation models (Poisson, Gaussian, Gamma), regularization, cross-validation with scikit-learn, and encoding/decoding analyses. Use when the user mentions NeMoS, nmo, GLM fitting for neural data, basis functions for neural modeling, or population GLMs.
- Author: Ben Dichter
- Repository: catalystneuro/claude-skills
- Version: 20260207115015
- Stars: 1
- Forks: 0
- Last Updated: 2026-02-07
- Source: https://github.com/catalystneuro/claude-skills
- Web: https://mule.run/skillshub/@@catalystneuro/claude-skills~using-nemos:20260207115015
---
---
name: using-nemos
description: >
Use this skill when writing code that uses the NeMoS (Neural Models and Statistics) Python package
for fitting Generalized Linear Models (GLMs) to neuroscience data. Covers basis functions,
single-neuron and population GLMs, observation models (Poisson, Gaussian, Gamma), regularization,
cross-validation with scikit-learn, and encoding/decoding analyses. Use when the user mentions
NeMoS, nmo, GLM fitting for neural data, basis functions for neural modeling, or population GLMs.
---
Help users write correct, idiomatic NeMoS code for fitting GLMs to neural data. NeMoS is built on
JAX and integrates tightly with pynapple for neuroscience time series data.
## NeMoS Overview
NeMoS fits Generalized Linear Models to neural data. It is JAX-based, follows the scikit-learn
API (fit/predict/score), and integrates natively with pynapple time series objects.
**Import convention:**
```python
import nemos as nmo
```
## Typical Workflow
```python
import nemos as nmo
import pynapple as nap
# 1. Load and prepare data with pynapple
data = nap.load_file("data.nwb")
spikes = data["units"]
stimulus = data["stimulus"]
# 2. Bin spikes to counts
bin_size = 0.01 # 10 ms
count = spikes[0].count(bin_size)
# 3. Create basis functions and compute features (design matrix)
basis = nmo.basis.RaisedCosineLogConv(n_basis_funcs=8, window_size=80)
X = basis.compute_features(stimulus)
# 4. Fit GLM
model = nmo.glm.GLM(solver_name="LBFGS")
model.fit(X, count)
# 5. Predict and evaluate
predicted_rate = model.predict(X)
score = model.score(X, count)
# 6. Access fitted parameters
print(model.coef_) # coefficients
print(model.intercept_) # intercept
```
## Key Design Decisions
**Eval vs Conv basis:** Use `Eval` (e.g., `BSplineEval`) for static nonlinear relationships
(position, speed). Use `Conv` (e.g., `RaisedCosineLogConv`) for temporal/history effects
(spike history, stimulus history). Conv bases convolve with input; Eval bases evaluate at input values.
**Basis composition:** Use `+` for additive (concatenate features), `*` for multiplicative
(outer product / interaction terms).
**Observation models:** Poisson for spike counts (default), Gaussian for continuous signals
(calcium imaging), Gamma/Bernoulli/NegativeBinomial for other distributions.
**GLM vs PopulationGLM:** Use `GLM` for single neurons, `PopulationGLM` for fitting all
neurons simultaneously (e.g., connectivity analysis).
## Reference Files
Based on what you need, read the appropriate reference file:
| Task | Reference |
|------|-----------|
| Choosing/creating basis functions, Eval vs Conv, composition | `./references/basis-functions.md` |
| Fitting GLMs, observation models, regularizers, solvers | `./references/fitting-glms.md` |
| Population GLMs, connectivity, feature masking | `./references/population-glms.md` |
| Cross-validation, sklearn pipelines, model/feature selection | `./references/sklearn-model-selection.md` |
| Calcium imaging, Gaussian GLMs, continuous data | `./references/continuous-data-glms.md` |
Read the relevant reference file(s) before writing code for the user.
**Related skill:** For pynapple-specific operations (loading NWB data, restrict, count, IntervalSet,
TsGroup, tuning curves, decoding, signal processing), also load the `using-pynapple` skill.
NeMoS workflows almost always involve pynapple for data preparation and analysis.
## Data Preparation
NeMoS expects:
- **Predictors (X):** 2D array, shape `(n_time_bins, n_features)`
- **Target (y):** 1D array for GLM, 2D for PopulationGLM, shape `(n_time_bins,)` or `(n_time_bins, n_neurons)`
- X and y must have the same number of time bins
When using pynapple objects, align sampling rates:
```python
# Bin spikes
count = spikes.count(bin_size, ep=epoch)
# Match predictor sampling rate to count
predictor = predictor.interpolate(count, ep=count.time_support)
# Or downsample with bin_average
downsampled = high_rate_signal.bin_average(bin_size)
```
## Converting Rates
NeMoS predicts in units of counts/bin. Convert to Hz:
```python
predicted_rate_hz = model.predict(X) / bin_size
```
## Reconstructing Filters from Basis Coefficients
```python
# Get basis kernels
_, basis_kernels = basis.evaluate_on_grid(window_size)
# Multiply with learned coefficients
filter = np.matmul(basis_kernels, model.coef_)
```
## NaN Handling
Conv bases NaN-pad initial time bins where the convolution window extends before the data.
NeMoS handles NaNs during fitting by ignoring those time bins.