rrr

Reduced-rank regression.

Use method="rrr" to learn a low-rank mapping from neural activity to target variables.

When to choose this method

Choose RRR when your main objective is predicting external variables from neural activity while enforcing a low-dimensional predictive subspace.

  • Directly models neural-to-target relationships (unlike unsupervised methods).

  • Useful for neural encoding/decoding problems where targets are continuous or multidimensional.

  • Low-rank structure can improve generalization and interpretability.

RRR requires meaningful target definitions and enough data to estimate the mapping reliably.

What goes in target_da?

target_da is the targets=... argument passed to da.ephys.reduce(method="rrr", ...).

It must be an xarray.DataArray with:

  • All sample dimensions used by reduce (by default, trial and time because the default stack is ("trial", "time")).

  • Exactly one additional non-sample dimension that indexes target variables (for example "target", "behavior", or "kinematic_feature").

Common choices for target variables include:

  • Behavioral signals over time (running speed, pupil size, lick rate).

  • Kinematics over time (position/velocity components).

  • Task-variable encodings (for example one-hot vectors for stimulus/choice).

The sample coordinates in target_da should align with the neural data samples used for fitting.

ds = da.ephys.reduce(
    method="rrr",
    targets=target_da,
    rank=3,
)

Example

Time-resolved targets (default stacking over trial and time):

target_da = xr.DataArray(
    target_values,  # shape: (n_trial, n_time, n_target)
    dims=("trial", "time", "target"),
    coords={
        "trial": da.coords["trial"],
        "time": da.coords["time"],
        "target": ["x_vel", "y_vel"],
    },
)

ds = da.ephys.reduce(
    method="rrr",
    targets=target_da,
    rank=3,
)

Trial-level targets only (for example per-trial choice), by stacking trials only:

target_da = xr.DataArray(
    trial_targets,  # shape: (n_trial, n_target)
    dims=("trial", "target"),
    coords={"trial": da.coords["trial"], "target": ["left", "right"]},
)

ds = da.ephys.reduce(
    method="rrr",
    targets=target_da,
    stack=("trial",),  # now targets need only the trial sample dim
    rank=2,
)

Notes

  • targets is required.

  • rank controls the dimensionality of the learned predictive subspace.