Does behaviour fall into discrete states?

Not yet. One method found none and could not find one we planted; MoSeq finds regimes but cannot carve them the same way twice.

1
slow modes that beat the surrogates
M = 1: the registered verdict is CONTINUUM
0.500
planted switch recovered
balanced accuracy; the bar is 0.8
0.51 / 0.50
arena decodable when still
pose / mask stream; 0.5 is chance, so both kept
Left, as registered: the gap between successive slow timescales, mice (blue, 95% bootstrap) against the upper bound of five surrogates run through the same pipeline. No gap clears them. The bootstrap need not bracket the point: sorted ratios are at least 1, so resampling biases them up. Right, post-hoc: the slowest timescale by lag. White noise gives 3.8 × the lag at every lag, an estimation floor; the mice sit well above it at short lags and on it at the lag the rule chose.
Left, as registered: the gap between successive slow timescales, mice (blue, 95% bootstrap) against the upper bound of five surrogates run through the same pipeline. No gap clears them. The bootstrap need not bracket the point: sorted ratios are at least 1, so resampling biases them up. Right, post-hoc: the slowest timescale by lag. White noise gives 3.8 × the lag at every lag, an estimation floor; the mice sit well above it at short lags and on it at the lag the rule chose.

This is not evidence that behaviour is a continuum. A 2 s switch planted at +1 SD in two channels was recovered at chance, at every lag tried. The null comes from an instrument that failed its own sensitivity check.

stepwhat the registration saidwhat happened
memory Kshortest window within 1% of the best 0.5 s forecast1 frame: past frames add nothing
lag τwhere the slowest timescale stops growingnever stops; fell to the grid edge, 64 frames
gate 1a gap beats all five surrogatesnone does
gate 2states reproduce across splits and seedsnot reached
gate 3the planted switch is recovered0.500: fail

Why it failed. The lag rule waited for a plateau, but the noise floor grows with the lag, so it ran to the grid edge, where the floor hides everything. At short lags the mice have many slow directions of about equal speed (eigenvalues 0.973, 0.964, 0.962) and no gap, so there are no few dominant states to pick out, planted or real.

What the transfer operator splits, at a lag of one frame

Not registered, and not states. At a one-frame lag, where the mice beat white noise, the largest spectral gap gives two macrostates. Each holds 7–11% of frames; the other 82% abstain. Four clips each, green border inside.

state 1 · 11.4% of frames · median bout 1.0 s

day 5, context B · bout 1.4 s
day 4, context A · bout 1.5 s
day 5, context B · bout 0.8 s
day 5, context A · bout 0.9 s

state 0 · 6.5% of frames · median bout 1.0 s

day 6, context B · bout 1.4 s
day 3, context A · bout 0.9 s
day 5, context B · bout 0.8 s
day 7, context B · bout 1.0 s

MoSeq, run as a test

MoSeq always returns syllables: its prior assumes discrete regimes. So it was run with the answer fixed in advance, on the repaired pose before smoothing, beside white-noise and phase-randomised copies fitted the same way.

checkmicephase-randomisedwhite noisebarverdict
gain over one linear AR (nats/frame)5.322.691.63mice beat both by 0.05pass: +2.63 [2.37, 2.91]
syllables agree across seeds (median AMI)0.4730.5560.641≥ 0.70fail
syllables in use13–1627–3124–30reported—
median dwell (frames)18–1939–4321–25reported—

Verdict: fail. The mice carry structure a switching model captures and noise does not. But the syllables that carve it change with the random seed, agreeing less than white noise's do. White noise also gets more syllables than the mice.

What the syllables look like

Four report animals per syllable, 2 s each, starting half a second before the bout. A green border marks the frames MoSeq put in the syllable. These are for looking: the syllables failed the seed test, so none is a behaviour.

syllable 0 · 47.7% of frames · median bout 1.9 s

day 7, context A · bout 7.0 s
day 2, context C · bout 4.4 s
day 6, context B · bout 0.9 s
day 7, context B · bout 0.6 s

syllable 1 · 11.9% of frames · median bout 1.1 s

day 6, context B · bout 0.6 s
day 5, context A · bout 0.5 s
day 6, context B · bout 0.9 s
day 3, context A · bout 0.6 s

syllable 2 · 9.4% of frames · median bout 1.2 s

day 5, context A · bout 1.2 s
day 3, context B · bout 0.8 s
day 3, context B · bout 1.8 s
day 3, context A · bout 0.5 s

syllable 3 · 5.4% of frames · median bout 1.1 s

day 7, context B · bout 2.7 s
day 7, context B · bout 0.6 s
day 6, context A · bout 0.5 s
day 6, context A · bout 1.0 s

syllable 5 · 4.0% of frames · median bout 1.2 s

day 3, context A · bout 1.8 s
day 4, context B · bout 4.4 s
day 6, context B · bout 0.8 s
day 1, context A · bout 2.6 s

syllable 25 · 3.3% of frames · median bout 2.8 s

day 5, context B · bout 2.1 s
day 6, context A · bout 4.5 s
day 6, context A · bout 2.1 s
day 2, context C · bout 1.1 s

syllable 4 · 2.7% of frames · median bout 0.8 s

day 3, context B · bout 0.9 s
day 3, context B · bout 0.6 s
day 3, context A · bout 0.7 s
day 3, context B · bout 1.1 s

syllable 7 · 2.2% of frames · median bout 1.0 s

day 4, context B · bout 1.3 s
day 3, context A · bout 0.7 s
day 3, context A · bout 1.0 s
day 7, context B · bout 0.8 s

syllable 10 · 2.1% of frames · median bout 1.2 s

day 7, context B · bout 1.5 s
day 4, context A · bout 0.5 s
day 5, context A · bout 0.8 s
day 4, context B · bout 1.3 s

syllable 8 · 1.7% of frames · median bout 0.8 s

day 3, context A · bout 0.7 s
day 5, context B · bout 1.3 s
day 4, context A · bout 0.5 s
day 2, context C · bout 0.5 s

syllable 12 · 1.6% of frames · median bout 1.3 s

day 5, context B · bout 1.5 s
day 3, context B · bout 1.2 s
day 4, context A · bout 0.7 s
day 3, context A · bout 2.7 s

syllable 9 · 1.3% of frames · median bout 0.8 s

day 1, context A · bout 0.5 s
day 1, context A · bout 0.7 s
day 4, context B · bout 1.9 s
day 4, context B · bout 0.5 s

syllable 30 · 1.2% of frames · median bout 8.5 s

day 4, context B · bout 15.6 s
day 6, context B · bout 31.3 s
day 7, context B · bout 5.7 s
day 6, context B · bout 8.9 s

syllable 6 · 1.0% of frames · median bout 0.7 s

day 2, context C · bout 0.6 s
day 2, context C · bout 0.6 s
day 2, context C · bout 0.6 s
day 4, context A · bout 1.1 s

syllable 16 · 0.9% of frames · median bout 0.7 s

day 5, context B · bout 0.8 s
day 5, context B · bout 0.5 s
day 2, context C · bout 0.8 s
day 0, context A · bout 0.5 s
decoding arena A vs Bbalanced accuracy
freezing alone0.669 [0.634, 0.703]
syllables, moving frames0.749 [0.717, 0.779]
both0.765 [0.734, 0.797]
syllables, freezing frames only (leak check)0.710 [0.677, 0.744]

Syllables add to freezing, but they read the arena too: they decode it on freezing frames, where behaviour should not differ. The registered reading is confounded, and descriptive only since MoSeq failed. The freeze threshold scores 64% of frames as freezing, so that check is weaker than intended.

The pose it ran on

poseskull jitter (/bl)bone violationsfast motion keptmoved (px)
raw DLC0.03511.78%100%0
disposition0.03351.42%90%0.05
repaired (adopted)0.02891.44%31%1.14

The repair passes all four gates. Skull jitter falls 18% against raw DLC, violations stay at the cleaned level, and it keeps more fast motion than the old shipped pose (22%). Almost all of the gain is the 0.25 s median filter.

SAM's mask vetoed only 0.07% of keypoints, 72% of them the nose, and 3.2× as often in arena B as in A. At one keypoint in a thousand it cannot drive a result, but its cause is not settled.