Add stochastic noise to simulations for more realistic brain dynamics.
Adding Noise
from tvbo import Dynamics, SimulationExperiment, Noise
model = Dynamics.from_db("Generic2dOscillator")
# Deterministic
exp_det = SimulationExperiment(dynamics=model)
exp_det.integration.duration = 500
res_det = exp_det.run()
# Stochastic — add Gaussian noise
exp_noise = SimulationExperiment(dynamics=model)
exp_noise.integration.duration = 500
exp_noise.integration.noise = Noise(
**{"noise_type": "gaussian", "parameters": {"sigma": {"value": 0.01}}}
)
res_noise = exp_noise.run()
============================================================
STEP 1: Running simulation...
============================================================
Simulation period: 500.0 ms, dt: 0.01220703125 ms
Transient period: 0.0 ms
Simulation complete.
============================================================
Experiment complete.
============================================================
============================================================
STEP 1: Running simulation...
============================================================
Simulation period: 500.0 ms, dt: 0.01220703125 ms
Transient period: 0.0 ms
Simulation complete.
============================================================
Experiment complete.
============================================================
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 2, figsize=(10, 3), sharey=True)
axes[0].plot(res_det.integration.time, res_det.integration.isel(variable=0).data.values, lw=0.5)
axes[0].set_title("Deterministic")
axes[1].plot(res_noise.integration.time, res_noise.integration.isel(variable=0).data.values, lw=0.5)
axes[1].set_title(
f"With noise ({exp_noise.integration.noise.parameters['sigma'].name} = {exp_noise.integration.noise.parameters['sigma'].value})"
)
for ax in axes:
ax.set_xlabel("Time (ms)")
plt.tight_layout()
plt.show()
Noise Types
| Gaussian / White |
"gaussian" |
Independent samples at each time step |
| Ornstein-Uhlenbeck |
"ou" |
Temporally correlated (colored) noise |
Ornstein-Uhlenbeck
integration:
noise:
noise_type: ou
parameters:
nsig: {value: 0.01}
ntau: {value: 10.0}
The OU process has a time constant ntau controlling the autocorrelation.
YAML Specification
integration:
method: heun
step_size: 0.1
duration: 5000
noise:
noise_type: gaussian
parameters:
nsig: {value: 0.015}
Key Parameters
nsig |
Noise amplitude (\(\sigma\)). Diffusion coefficient \(D = \frac{1}{2}\sigma^2\) |
ntau |
OU time constant (only for ou type) |
Stochastic integration uses the Heun method (stochastic Heun-Euler). Set method: heun for best accuracy with noise.