`gaussian_dlm_obs_lpdf` returns NaN instead of rejecting when the innovation variance collapses after time zero

Offen
#3,381 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Maintainer antworten meist innerhalb von 1 Tag

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Anfängerfreundlichkeit
72/100
Issue-Typ
Bug
Klarheit
Klar beschrieben
Aktivitätsstatus
Aktiv
Tech-Stack
cpp
Bereich
tooling

Rechercherichtung

Beginne mit der vector-V-Überladung von gaussian_dlm_obs_lpdf und ihren bestehenden Tests und verfolge, wie Q nach dem ersten Zeitschritt geprüft wird. Füge einen Regressionsfall hinzu, der auf dem deterministischen Modell im Bericht basiert, und überprüfe, dass die später auftretende Null-Innovationsvarianz std::domain_error auslöst, statt NaN zurückzugeben.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

The vector-V overload checks the innovation variance Q only in the first time step (if (i == 0) check_positive(function, "Q0", Q)). Later time steps compute 1.0 / Q and log(Q) unchecked. A deterministic model whose state covariance collapses after the first update returns NaN silently:

Eigen::MatrixXd y(1, 2);  y << 0.5, 0.5;   // r = 1 variable, T = 2
Eigen::MatrixXd F(1, 1);  F << 1.0;
Eigen::MatrixXd G(1, 1);  G << 1.0;
Eigen::VectorXd V(1);     V << 0.0;         // passes check_nonnegative
Eigen::MatrixXd W(1, 1);  W << 0.0;         // passes check_pos_semidefinite
Eigen::VectorXd m0(1);    m0 << 0.0;
Eigen::MatrixXd C0(1, 1); C0 << 1.0;
double lp = stan::math::gaussian_dlm_obs_lpdf<false>(y, F, G, V, W, m0, C0);
// lp = -nan, no exception

At t = 0, Q = 1 > 0 so the check passes; the update collapses C to zero, so from t = 1 on, Q = 0, Q_inv = inf, and the log density is NaN. The doc comment promises std::domain_error for non-PSD matrices in the Kalman filter.

Environment:
  • Ubuntu 22.04.5 LTS (WSL2, kernel 6.18.33.2-microsoft-standard-WSL2), x86_64
  • stan-dev/math develop @ d20b238b9c
  • g++ 11.4.0 (Ubuntu 22.04), -std=c++17
Vorherrschende Sprache
C++
Sterne
845
Forks
225
Ø Merge
4 T. 21 Std.
Gemergte PRs (30 T.)
13

Entwicklungsumgebung

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus stan-dev/math

Alle Issues in stan-dev/math

Ähnliche Issues

Weitere Issues zu C++

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.