Skip to content

Missingness support for Simulators#239

Open
mattlevine22 wants to merge 16 commits into
mainfrom
ml-missingness-simulators
Open

Missingness support for Simulators#239
mattlevine22 wants to merge 16 commits into
mainfrom
ml-missingness-simulators

Conversation

@mattlevine22
Copy link
Copy Markdown
Collaborator

@mattlevine22 mattlevine22 commented May 28, 2026

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, DiscreteTimeSimulator and ODESimulator now support obs_values containing NaNs under an index-preserving interpretation: obs_values[k] always refers to latent index k, 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:

  • MultivariateNormal observations
  • factorized Independent(..., 1) observations

To 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 from obs=... sample sites to numpyro.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:

  • scorer math,
  • discrete simulator behavior,
  • ODE simulator behavior,
  • hierarchical/plated behavior.

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:

  • do we really want the missingness utils in dynestyx/internal/observation_missingness.py?

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 DiscreteTimeSimulator and ODESimulator.
  • 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.

Comment thread dynestyx/simulators.py Outdated
Comment on lines +1101 to +1107
return self._simulate_missing_scan(
name,
dynamics,
times=times,
ctrl_values=ctrl_values,
missing_data=missing_data,
)
Comment thread dynestyx/simulators.py Outdated
Comment on lines +1386 to +1391
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
Comment on lines +136 to +139
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)
@mattlevine22
Copy link
Copy Markdown
Collaborator Author

@copilot does the most recent commit address your comments/concerns?

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 11 out of 12 changed files in this pull request and generated 2 comments.

"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",
Comment thread tests/missingness/utils.py Outdated
Comment on lines +75 to +80
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)
Copy link
Copy Markdown
Collaborator

@DanWaxman DanWaxman left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is directionally right, but I have a few concerns:

  1. There's a lot of new complexity; observation_missingness has 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.
  2. 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.
  3. 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_scan is doing almost the same thing as the normal simulation loop, with an abstracted scorer (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.

Comment thread docs/tutorials/gentle_intro/00_index.ipynb Outdated
},
{
"data": {
"image/png": "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
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Collaborator Author

@mattlevine22 mattlevine22 May 29, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment thread dynestyx/simulators.py
Comment on lines +1009 to +1012
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
)
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why size 1?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Comment thread dynestyx/simulators.py Outdated
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),
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd like to avoid "score", it's somewhat overloaded for us

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

renamed things to log_potential

Comment thread dynestyx/internal/observation_missingness.py
Comment thread dynestyx/internal/observation_missingness.py Outdated
@mattlevine22 mattlevine22 requested a review from DanWaxman May 29, 2026 22:57
@mattlevine22 mattlevine22 marked this pull request as ready for review May 29, 2026 22:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants