← Back to Investigation Overview
⚠ Diagnostic run on buggy v4/v5 estimates. This scan was the clue that led to finding the zone bug — see overview for the full story.
2D Profile Log-Likelihood: δ × μhome
K=10 NFXP · Group 008 (08:00–16:00) · 44 persons (top-3 home zones) ·
All other parameters fixed at MLE · Scan date 2026-05-12
1 Key Findings
Grid maximum
δ = μhome = 0.01
LL = −1491 (corner)
MLE point (nearest grid)
δ=0.039, μhome=0.068
LL ≈ −1847
ΔLL (MLE vs corner)
−356 nats
over 44 persons
Surface shape
Monotone ↘
no interior peak
Main finding: The 2D profile LL surface has no interior maximum.
LL decreases monotonically as either δ or μhome increases, with the grid maximum
at the smallest values tested. The MLE is not placed at μhome > δ because the
data prefers that ordering — it is placed there by constraints from other parameters
(α, β, βshop, βleis, c_change) that are held fixed in this scan.
Why LL is monotone in this scan
LL(θ) = Uobs(θ) − V(s0; θ).
In this scan, Uobs is invariant to δ — the matched observed-path
utility does not respond to δ at all (see §4). Only μhome shifts Uobs
upward through home-step utilities.
Meanwhile V(s0) grows with both δ and μhome because
more attractive activities inflate the log-partition function. Since V(s0)
grows faster than Uobs as δ increases, LL falls.
What this means for identification
δ is not identified from the observed path utility in this group — its
signature is entirely in V(s0), the denominator. The optimizer pins δ through
a balance with α (earliness), β (lateness), and mode-choice terms that are not visible in
this 2D scan. Fixing those parameters at MLE values removes the identifying variation,
making the surface look monotone.
Implication: The fact that μhome > δ at the MLE is a consequence
of the other 8 parameters' optimal values, not a direct preference in the (δ, μhome) subspace.
2 Intuitive Explanation
The LL formula as a bet
Think of LL = Uobs − V(s0) as measuring how well an observed day competes against the best possible day.
Uobs — what the agent actually earned on their observed day (sum of step utilities along the observed path).
V(s0) — what the best possible day looks like under the current parameters (the log-partition function from backward induction).
MLE finds parameters where people's actual days look as good as possible relative to what they could have done.
A large gap (Uobs ≪ V) means the model thinks people could have done much better — bad fit.
① Why LL is monotone in δ — structural, not an artifact
Uobs is completely invariant to δ (see ② below). So as δ rises, only V(s0) moves — it grows because work looks more attractive, inflating the "best possible day." LL = Uobs − V always falls.
This is structural, not an artifact of fixing other params.
No matter what the other 8 parameters are, Uobs will never respond to δ,
and V(s0) will always grow with δ. The monotone slope in δ is unavoidable in this model.
② Why LL is monotone in μhome — also structural
As μhome rises, both Uobs and V(s0) grow — but V grows faster.
Why? V tracks the optimal path's home fraction; Uobs tracks the observed path's home fraction.
Observed persons spend some time on shopping, travel, leisure — the model sees those as suboptimal when home is very attractive. So V always pulls ahead.
Fixing other params changes how steep the slope is (e.g. negative β0,shop = −0.795 makes shopping unattractive, steepening the home dominance), but not its direction.
The monotone slope in μhome is robust across reasonable param values.
③ The δ-invariant Uobs — the clue that exposed the zone bug
Changing δ from 0.01 to 0.14 moves Uobs by exactly zero for all 44 persons.
This is the anomaly that triggered the root cause investigation.
The cause: the graph was built using only Person 0's work zone as the WORK zone.
Workers at any other zone had their observed WORK steps silently dropped from Uobs
(no matching state found). With no WORK steps in Uobs, δ has no numerator signal.
This is not a structural property of the model — it is a data-construction bug.
After the zone-agnostic fix in v6, WORK states are built at all 144 zones, so observed WORK
steps will match and Uobs will respond to δ as expected.
Why the surface has no kink at the breakeven diagonal (δ = μhome):
The breakeven is a behavioural threshold — below it, agents prefer home over work in the simulation.
But the likelihood surface is smooth across it because logit choice probabilities are continuous in parameters.
The MLE can sit on either side of the diagonal without any discontinuity in the objective.
The LL "does not know" the breakeven exists; only the forward simulation does.
3 LL Surface: Heatmap & Contour
Hover for exact values. Red star = MLE (δ=0.0408, μhome=0.0617).
Dashed line = δ = μhome breakeven. All other parameters fixed at MLE.
Heatmap (absolute LL)
Contour (ΔLL from grid max)
4 Interactive 1D Slices
Select a fixed value for one parameter and see how LL varies along the other.
LL(δ) | μhome fixed
LL(μhome) | δ fixed
5 LL Decomposition: Uobs vs V(s0)
LL = Uobs − V(s0). This decomposes the surface into the numerator (observed-path utility)
and denominator (log-partition / value function). The key anomaly — Uobs does not respond to δ — is visible here.
Key anomaly (now explained): Uobs is identical for all δ values — δ has zero effect on the observed-path utility for these 44 persons.
Root cause: the graph was built with WORK states only in Person 0's zone. Workers at other zones had their WORK steps
silently unmatched and dropped from Uobs. This is a graph construction bug, not a model property.
After the zone-agnostic fix (v6), Uobs will properly include WORK step utilities, and δ will be identified from the numerator.
6 Full LL Grid (Sum over 44 persons)
Rows = μhome, Columns = δ. Highlighted cell = nearest grid point to MLE.
7 Interpretation & Next Steps
Why δ ended up below μhome at MLE (now understood)
Zone bug: Uobs had no WORK signal for δ.
Because WORK states were only built for Person 0's zone, all other workers'
observed WORK steps were silently dropped. The optimizer had no numerator signal
for δ — it could only be pushed indirectly through V(s0), ending up near-zero.
Non-worker bias: monotone downward pull.
Non-workers' V(s0) grows with δ (hypothetical WORK paths in the graph),
but their Uobs has no WORK steps. Each non-worker contributes a term
that is monotone decreasing in δ, pulling it toward zero.
μhome > δ is a consequence, not a preference.
With δ artificially suppressed, μhome dominated. This is not what the
data prefers — it is what the bug forced. The v6 estimates (zone-agnostic + workers-only)
will tell us the true relationship.
What actually fixed it — two bugs, now resolved
Fix 1 — Zone-agnostic graph construction.
Build the group graph with mandatory_sequence = [(WORK, None)] so WORK states
are generated at all 144 zones, not just Person 0's zone.
After this fix, observed WORK steps match states in the graph → Uobs responds to δ → proper identification.
Fix 2 — Workers-only estimation sample.
Exclude non-workers from the sample. Non-workers' V(s0) grows with δ (hypothetical WORK paths),
but their Uobs never has WORK steps → monotone downward pull on δ.
With workers-only, every person in the LL sum has observed WORK steps, giving δ a proper numerator signal.
Status — v6 re-estimation running.
Both fixes are in production. v6 launched 2026-05-12 with 793 workers, 109 timing-window groups,
zone-agnostic graphs, analytical gradient, warm start from v5 checkpoint.
Expected to converge tomorrow morning. The scan on this page will be re-run on v6 estimates to confirm proper identification.