Skip to content

Synchrony

Synchrony asks when places, events, or biological responses move together. In CubeDynamics, it is a grammar:

raw cube -> state cube -> event result -> synchrony operator -> spatial summary

That separation matters. A threshold rule should not be tangled up with a spatial comparison choice, and a center pixel should not define the whole idea of synchrony.

state cubes event catalogs occurrence severity timing duration biology coupling

Start Here

Theory Map

Ecological synchrony, Moran effects, event synchronization, climate networks, and compound events.

State and Events

Turn raw climate or biological values into standard state cubes and event catalogs.

Four Primitives

Compare occurrence, severity, timing, and duration with shared spatial modes.

Biology Coupling

Rasterize observations, align cubes, and compare lagged climate-biology states.

The First Visual

This synthetic cube shows occurrence synchrony: nearby pixels become similar when hot-state events occur at the same times. Drag the cube to inspect the time-depth and spatial faces.

If the occurrence synchrony cube does not load, open it in a new tab.

Why Four Operators?

Two locations can be synchronized in one sense and independent in another:

  • Occurrence: did the state happen at the same times?
  • Severity: were magnitudes high together when both were active?
  • Timing: did matched events begin, peak, or end together?
  • Duration: did matched events persist for similar lengths of time?

The plot below shows why the distinction is useful. In the same synthetic system, occurrence and severity tell different stories through rolling windows.

Spatial median synchrony through rolling windows

Synthetic validation case generated by examples/synchrony_section_assets.py.

Core Pattern

from cubedynamics import pipe, verbs as v

hot = (
    pipe(tmax_cube)
    | v.threshold_state(threshold=35, direction="above")
).unwrap()

events = (
    pipe(hot)
    | v.detect_events(state_var="state", min_duration=2, max_gap=1)
).unwrap()

occurrence = (
    pipe(hot)
    | v.occurrence_synchrony(spatial_mode="neighbors", radius_km=100)
).unwrap()

Read next: State and Events, then Four Primitives.