Missingness support for Simulators#239
Conversation
There was a problem hiding this comment.
Pull request overview
This PR adds NaN-based missing-observation support for simulator-backed inference, with shared scorer utilities and tests covering discrete-time, ODE, hierarchical, and scorer behavior.
Changes:
- Added internal missing-observation preprocessing/scoring helpers for full-row and partial missingness.
- Integrated factor-based observation scoring into
DiscreteTimeSimulatorandODESimulator. - Added focused missingness test models/utilities and updated the gentle intro tutorial index.
Reviewed changes
Copilot reviewed 11 out of 12 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
dynestyx/internal/__init__.py |
Adds an internal helpers package marker. |
dynestyx/internal/observation_missingness.py |
Adds missing-observation preprocessing and masked likelihood scoring. |
dynestyx/simulators.py |
Wires missing-observation scoring into discrete and ODE simulators. |
tests/missingness/__init__.py |
Adds missingness test package marker. |
tests/missingness/models.py |
Adds shared discrete/ODE/plated test models. |
tests/missingness/utils.py |
Adds masking and manual log-prob test helpers. |
tests/missingness/test_scorers.py |
Tests scorer preprocessing and masked likelihood math. |
tests/missingness/test_discrete_simulator.py |
Tests discrete simulator missingness behavior and MCMC smoke path. |
tests/missingness/test_ode_simulator.py |
Tests ODE simulator missingness behavior and MCMC smoke path. |
tests/missingness/test_hierarchical.py |
Tests plated simulator missingness behavior. |
docs/tutorials/gentle_intro/00_index.ipynb |
Adds missing-observation simulator tutorial entry to the index. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| return self._simulate_missing_scan( | ||
| name, | ||
| dynamics, | ||
| times=times, | ||
| ctrl_values=ctrl_values, | ||
| missing_data=missing_data, | ||
| ) |
| scorer = ( | ||
| build_missing_observation_scorer( | ||
| observation_model=dynamics.observation_model, | ||
| missing_data=prepare_missing_observation_data(obs_values), | ||
| ) | ||
| if obs_values is not None and not is_dirac_observation |
| y = self.missing_data.safe_obs[t_idx] | ||
| obs_mask = self.missing_data.obs_mask[t_idx] | ||
| row_has_any_observed = self.missing_data.row_has_any_observed[t_idx] | ||
| obs_dist = self.observation_model(x=x, u=u, t=t) |
|
|
||
| def prepare_missing_observation_data(obs_values: Array) -> MissingObservationData: | ||
| """Replace NaNs with safe fill values and cache row-level missingness summaries.""" | ||
| obs_mask = jnp.isfinite(obs_values) |
|
@copilot does the most recent commit address your comments/concerns? |
| "partial_idx_dim0 = np.array([8, 18, 72, 90])\n", | ||
| "partial_idx_dim1 = np.array([25, 33, 84, 95])\n", | ||
| "\n", | ||
| "transition_cov = jnp.array([[0.1, 0.01], [-0.01, 0.15]])\n", |
| scan_names = sorted( | ||
| name | ||
| for name in trace | ||
| if name.startswith(prefix) and name.endswith("_lp") and name != scalar_name | ||
| ) | ||
| pieces.extend(jnp.ravel(factor_log_prob(trace, name)) for name in scan_names) |
DanWaxman
left a comment
There was a problem hiding this comment.
I think this is directionally right, but I have a few concerns:
- There's a lot of new complexity;
observation_missingnesshas a dataclass,Protocol, datahelper, scorer class, and factory, along with some math. This is a lot of complexity when it feels like just the data helper and scorer class should suffice. - Simulators is getting quite long. It may be out of scope for this PR, but I do think it's time to break up that class if we're adding these new features.
- I don't really want totally separate pathways for the missing data unless it's totally necessary (and I feel it probably isn't). The
_simulate_missing_scanis doing almost the same thing as the normal simulation loop, with an abstractedscorer(which I would like to change the name of); we should just use that abstracted scorer directly, always, if we're going to already add the new complexity.
| }, | ||
| { | ||
| "data": { | ||
| "image/png": "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 |
There was a problem hiding this comment.
It's true that we should use particle filtering/smoothing here, but that's because EKF is going to do really bad with Laplace observations.
There was a problem hiding this comment.
I changed to:
If we want to perform Filtering/Smoothing as before, we would need to use a variant that can handle these non-Gaussian observations (e.g. PF/PS or EKF/EKS); however, as noted in the previous tutorial, these methods are not yet set up to automatically support missing data. The EnKF, while configured to automatically support missing data, is not set up to support non-Gaussian observations.
Nevertheless, the MCMC + Simulator() strategy can handle all forms of missingness (partial and full) under non-Gaussian observation models as long as the observation model is independent per observation dimension, which is the case here.
| with numpyro.plate(f"{name}_n_simulations", 1): | ||
| x_prev_site: Real[Array, " state_dim"] | Real[Array, ""] = numpyro.sample( # type: ignore | ||
| f"{name}_x_0", dynamics.initial_condition | ||
| ) |
There was a problem hiding this comment.
this appears in main as well...I think it is to keep a leading axis for consistency w.r.t. when we do multiple rollout simulations
| u_0 = _get_val_or_None(ctrl_values, 0) | ||
| numpyro.factor( | ||
| f"{name}_y_0_lp", | ||
| scorer.score_step(x=x_prev, u=u_0, t=times[0], t_idx=0), |
There was a problem hiding this comment.
I'd like to avoid "score", it's somewhat overloaded for us
There was a problem hiding this comment.
renamed things to log_potential
Summary
This PR adds missing-observation support for simulator-based inference with non-Dirac observation models, plus a new tutorial showing how to use
Simulator+ MCMC with missing data.On the implementation side,
DiscreteTimeSimulatorandODESimulatornow supportobs_valuescontainingNaNs under an index-preserving interpretation:obs_values[k]always refers to latent indexk, so missing observations do not remove latent states from the model. Full-row missingness is supported for all non-Dirac observation models by simply skipping the observation log-probability at those indices. Partial missingness is supported when the observation model has structure that can be marginalized cleanly, specifically:MultivariateNormalobservationsIndependent(..., 1)observationsTo keep the simulator code clean, the missing-data logic is factored into a shared internal scorer layer in dynestyx/internal/observation_missingness.py. When
NaNs are present, the simulator switches fromobs=...sample sites tonumpyro.factor(...)-based masked observation scoring while preserving the existing no-missing fast paths.The PR also adds a focused test suite under tests/missingness/ covering:
Finally, it adds a new gentle-intro tutorial notebook, 11b_missing_observations_simulator_mcmc.ipynb, which explains the full-vs-partial missingness distinction for simulator-based inference, compares the Gaussian case against KF smoothing, and illustrates additional non-Gaussian observation families supported by the simulator missingness path.
Questions / notes:
dynestyx/internal/observation_missingness.py?