DDCM Parameter Recovery & Identification — Exact NFXP

R=30 replications · N=200 person-days · Δt=30 min · K=10 single-scale spec · 8 free params · analytical GV gradient · BHHH standard errors · source recovery_smallnet_R30_N200K10_freemu.json

0 Executive Summary

Gate PASSED. All 8 free parameters recover on synthetic data. theta_travel = 0.9975 (θ*=1.000, bias -0.0025) — the single-transport-scale payoff; beta SE = 0.0007 (was 3.98 before the late-shift fix).
theta_travel bias
-0.0025
mean Coverage Prob.
97.0%
MeanSE/SD (→1)
1.09
converged
29/30
free params
8

Mean CP ≈ 95% and MeanSE ≈ empirical-SD ⇒ the BHHH standard errors are trustworthy. This is the identification diagnostic the hEART reviewers requested (generate-from-θ* → recover).

★ Part I — Production-fidelity confirmation (single transport scale breaks the ridge)

Before the controlled R=30 study, The single-scale specification was first confirmed at production fidelity: the heavy toy (9 zones, 5 modes, Δt=15, multi-home, ~700K states/graph), single replication. The question it answered: does the single transport scale fix the broken theta_travel that the old scale-plus-level spec could not identify?

Old spec made theta_travel (a scale) and ASC_pt_adj (a level) jointly unidentified — a logit separates a slope from an intercept only weakly, so the estimator slid along a scale×level ridge. The single-scale specification uses one inclusive-value scale on the whole mode utility (u = θ·(ASC + β_time·TT + β_cost·cost) + …) and retires ASC_pt_adj, collapsing the ridge:

spectheta_travel θ̂ (θ*=1.0)bias|bias|/SEASC_pt_adj
Old (scale + level, ASC_pt_adj free)1.138+13.8%16.6 ✗−0.067 (6.8σ ✗)
Single transport scale0.992+0.8%0.87 ✓retired
The single transport scale recovers it at production fidelity (13.8% → 0.8% bias). All free params recover (R=1).
Why this is only Part I: R=1, and the SEs came from the float32 numerical Hessian (which returned a negative eigenvalue on a residual flat direction) — so the point estimates are the result, but coverage is provisional. Part II (below, sections 1–8) is the rigorous confirmation: the controlled small network, R=30 Monte-Carlo replications, and BHHH standard errors. Source: optionA_recovery_confirmation_20260619.md.

1 Part II — Controlled small network · Experiment Design

Zone layout (6 zones, single home, wide car-distance spread)

zonecar min from HOMEtrain fare ¥attractiveness P_open / role
HOME (z0)0———
SHOP-near (z1)30200X_shop=1.0noon 12:00 · WALKABLE
WORK (z2)60300—mandatory for workers
LEIS-mid (z3)60300X_leis=1.2peak 14:00
SHOP-far (z4)90400X_shop=0.8peak 16:00
LEIS-far (z5)120450X_leis=2.0evening 19:00

TRAIN = flat 30-min express to every zone; WALK competitive only on the 30-min hop; all 5 modes present (no-car archetype excludes CAR-driver, keeps CAR_PASS). Wide distance spread (30–120 min) gives the (time+cost) variation that identifies the transport scale.

Population composition — 4 archetypes (uniform ~25% each, N=200 → 198 person-days)

The synthetic population mixes the two binary characteristics that shape the choice set: car ownership (drivers can use CAR; non-owners cannot, but may ride as CAR_PASS) and worker status (workers have a mandatory WORK episode on a fixed schedule; non-workers move freely). Each archetype is ~¼ of the population; the worker archetypes are split evenly across their schedules.

archetypen (N=200)modes availableWORK schedules identifies
car · worker48all 5 (CAR driver + PT + walk/bike) 08–16, 10–15, 08–13, 12–22 (×12 each)δ, α, β + CAR-vs-TRAIN commute → θ_travel
car · non-worker50all 5— (free) β0/β1 shop & leisure; discretionary CAR-vs-TRAIN
no-car · worker50PT + walk/bike + CAR_PASS (no CAR driver) 08–16, 10–15 (×25 each)δ, α + WALK-vs-TRAIN commute → θ_travel
no-car · non-worker50PT + walk/bike + CAR_PASS— (free) β0/β1 shop & leisure; WALK-vs-TRAIN (bulk PT signal)

Why this mix. Workers (car + no-car) supply the on/pre/post-schedule WORK observations that identify δ/α/β — the 12:00–22:00 late shift is realistic (evening-shift workers exist in real diaries) and is what generates the post-schedule WORK steps identifying β. Non-workers' discretionary shop/leisure trips identify the activity intercepts/slopes (β0, β1). Car owners contribute CAR-vs-TRAIN choices and no-car agents the WALK-vs-TRAIN crossover — together the wide mode-choice variation that identifies the single transport scale θ_travel. (no-car excludes the CAR driver mode only; CAR_PASS stays available, matching the production pipeline.)

Worker schedule roles

scheduletypeidentifies
08:00–16:00standardδ / α (morning arrivals)
10:00–15:00late/shortδ / α
08:00–13:00half-dayδ / α
12:00–22:00LATE SHIFT (realistic evening worker)β — post-schedule lingering

True parameters θ* (K=10 single-scale) — fixed: c_change=0, mu_home=0 (HOME reference)

paramθ*description
delta+0.0300WORK on-schedule marginal utility (per min)
alpha+0.0010pre-schedule earliness penalty slope
beta+0.0005post-schedule lateness penalty slope
beta1_shop+0.5000SHOPPING attractiveness × P_open coefficient
beta0_shop-0.2200SHOPPING base rate (per min)
beta1_leis+0.4000LEISURE attractiveness × P_open coefficient
beta0_leis-0.4200LEISURE base rate (per min)
c_change-0.5000activity/mode switching cost (per change)
mu_home+0.0200flat constant HOME utility (per min) — FREE
theta_travel+1.0000transport SCALE on whole mode utility

Model — finite-horizon dynamic discrete choice (MEV / logit, scale = 1)

State \(s=(t,\text{zone},\text{prev\_act},\text{dur},\text{mode},\text{hist})\); at each \(s\) choose action \(a\) (next activity, destination, mode). Value function (Bellman logsum; terminal \(\bar V(s_T)=0\)), choice probability, and log-likelihood:

$$\bar V(s)=\log\!\!\sum_{a\in A(s)}\exp\!\big(u(s,a;\theta)+\bar V(s'(s,a))\big),\qquad P(a\mid s)=\exp\!\big(\underbrace{u(s,a)+\bar V(s')}_{Q(s,a)}-\bar V(s)\big)$$ $$\mathcal L(\theta)=\sum_{n}\sum_{t}\big[Q(s_{nt},a_{nt};\theta)-\bar V(s_{nt};\theta)\big] =\sum_n\sum_t\log P(a_{nt}\mid s_{nt})$$

Per-step flow utility \(u(s,a)\) (one \(\Delta t\) step)

HOME (reference): \(u_{\text{HOME}}=\mu_{\text{home}}\,\Delta t = 0\) since \(\mu_{\text{home}}\equiv 0\).

WORK/SCHOOL (piecewise-linear around individual schedule \([t_s,t_e]\)):

$$u_{\text{WORK}}(t)=\Delta t\cdot\begin{cases} \delta-\alpha\,(t_s-t) & t\lt t_s\quad\text{(earliness)}\\ \delta & t_s\le t\le t_e\quad\text{(on-schedule)}\\ \delta-\beta\,(t-t_e) & t\gt t_e\quad\text{(lateness)}\end{cases}$$

SHOPPING / LEISURE (zone \(z\), time \(t\)):

$$u_{\text{SHOP}}(z,t)=\big(\beta_1^{\text{shop}}X_{\text{shop}}[z]\,P^{\text{shop}}_{\text{open}}[z,t]+\beta_0^{\text{shop}}\big)\Delta t, \qquad u_{\text{LEIS}}\ \text{analogously}$$

TRAVEL (mode \(m\), \(o\!\to\! d\), depart \(t\)) — single transport scale:

$$u_{\text{TRAVEL}}=\theta_{\text{travel}}\big(\text{ASC}[m]+\beta_{\text{time}}\,TT_{o,d,m}+\beta_{\text{cost}}\,C_{o,d,m}\big)+2\,c_{\text{change}}+t_d+t_p$$

Fixed HH-MNL coefficients \(\beta_{\text{time}}=-0.039/\text{min}\), \(\beta_{\text{cost}}=-0.00088/\text{¥}\); \(\text{ASC}\): PT(TRAIN/BUS)\(=0\) reference, CAR\(=+2.756\), WALK\(=+1.948\), BICYCLE\(=-0.029\), CAR\_PASS\(=+0.111\). \(c_{\text{change}}\) is charged at departure AND arrival (\(2c_{\text{change}}\)/trip). Grid-rounding terms \(t_d,t_p\) (with \(\text{split}=(\lceil TT/\Delta t\rceil\Delta t-TT)/2\)): \(t_d=\mu(\text{prev},t,o)\tfrac{\text{split}}{\Delta t}\), \(t_p=\max_{\text{act}}\mu(\text{act},t{+}TT,d)\tfrac{\text{split}}{\Delta t}\). Small net: OD times are multiples of \(\Delta t{=}30\) so \(t_d{=}t_p{=}0\), and \(c_{\text{change}}{=}0\) — travel reduces to \(\theta_{\text{travel}}(\text{ASC}+\beta_{\text{time}}TT+\beta_{\text{cost}}C)\).

2 Recovery Results — Dekker Table 2 (N=200, R=30)

paramdescriptionθ*MeanbiasSD MeanSECP%APBverdict
deltaWORK on-schedule marginal utility (per min)+0.0300+0.0314+0.00140.00550.006096.714.9%✓ recovered
alpha tiny θ*pre-schedule earliness penalty slope+0.0010+0.0011+0.00010.00020.000296.7abs 0.0001✓ recovered
beta tiny θ*post-schedule lateness penalty slope+0.0005+0.0007+0.00020.00040.0007100.0abs 0.0002✓ recovered
beta1_shopSHOPPING attractiveness × P_open coefficient+0.5000+0.4962-0.00380.02400.0267100.04.0%✓ recovered
beta0_shopSHOPPING base rate (per min)-0.2200-0.2164+0.00360.01290.0149100.05.0%✓ recovered
beta1_leisLEISURE attractiveness × P_open coefficient+0.4000+0.4052+0.00520.02340.023893.34.6%✓ recovered
beta0_leisLEISURE base rate (per min)-0.4200-0.4253-0.00530.02760.028496.75.0%✓ recovered
c_changeactivity/mode switching cost (per change)-0.5000-0.4901+0.00990.17230.184893.324.5%✓ recovered
mu_homeflat constant HOME utility (per min) — FREE+0.0200+0.0207+0.00070.00250.0035100.010.5%✓ recovered
theta_traveltransport SCALE on whole mode utility+1.0000+0.9975-0.00250.05750.055993.34.6%✓ recovered

CP = % reps with θ* ∈ θ̂ ± 1.96·SE. SD = empirical std across reps; MeanSE = mean BHHH SE. ✓ = bias within ~2 SD and CP∈[85,100]. α/β have θ*≈0.001 so APB% is unstable — read the absolute bias.

Per-replication estimates — (θ̂−θ*)/SD

theta_travel shown by default; click legend to toggle. Green = converged, red = convergence-flag false (estimate still valid).

X = replication # (each of the 30 independent datasets generated at θ*). Y = (θ̂−θ*)/SD, the estimate's error in units of its own empirical SD. Why standardize: the 8 parameters span scales 0.001–0.5; dividing by each one's SD puts them on a single comparable axis. Read it as: a band centred on 0 (no drift = unbiased) with ≈95% of points within ±2 (= consistent with the reported SD).

3 Sampling Variance vs N (Exact reference for Branch B)

N-sweep in progress — 0 level(s) available so far. This section fills in as the overnight sweep completes {50,100,200,500,1000}.

4 Profile Log-Likelihood — identification evidence

1D slice of the log-likelihood in each parameter (others held at θ*). A ∩-shape peaked at θ* proves the LL responds to that parameter ⇒ identifiable. Axes normalized: x=(θ−θ*)/half-width, y=LL−max, so every identifiable curve peaks at (0,0).

paramLL peakθ*LL rangecurvature
delta+0.0300+0.030091.0concave ✓
alpha+0.0010+0.001052279.3concave ✓
beta+0.0005+0.000535358.9concave ✓
beta1_shop+0.5000+0.50005751.0concave ✓
beta0_shop-0.2200-0.220044415.0concave ✓
beta1_leis+0.4000+0.400013985.8concave ✓
beta0_leis-0.4200-0.420029858.4concave ✓
c_change-0.6000-0.500086.0concave ✓
mu_home+0.0200+0.02003331.1concave ✓
theta_travel+1.0000+1.0000286.6concave ✓

X = (θ−θ*)/half-width: the parameter slid off its true value, normalized so each param's scan spans [−1,1] (truth at x=0). Y = LL−max(LL): the log-likelihood with its own peak shifted to 0. Why both normalized: params have different units and the LL has different magnitudes per param — this overlays all 8 on one axis. A ∩-shape peaking at (0,0) ⇒ the LL responds to that parameter ⇒ identifiable; a flat line would mean non-identification.

5 Synthetic Population Behavior & Simulate-from-θ̂

The model recovered from synthetic data reproduces the θ* population's behavior: trips/person θ*=4.9 vs θ̂=4.88; mode & activity shares match (below). This is "simulate from recovered θ̂ → realistic schedules emerge". (θ̂ = R=30 N=200 rep 16.)

Mode share (of trips)

Mode share (of trips)θ* %θ̂ %
WALK49.151.4
TRAIN42.743.4
CAR6.53.5
CAR_PASS1.51.5
BICYCLE0.10.1
BUS0.10.1

Activity-step share

Activity-step shareθ* %θ̂ %
HOME45.946.8
SHOP22.422.2
LEIS16.916.8
TRAVEL10.310.2
WORK4.44.0

Activity distribution over the day

Fraction of person-steps at each activity by hour (stacked = 1.0), θ* population.

X = time of day (hour). Y = fraction of person-steps in each activity, stacked to 1.0 each hour (= 100% of agents). No normalization trick here — unlike the diagnostic plots above, the behavioral charts use natural units because the point is realism, not cross-parameter comparison: WORK fills daytime, HOME the night, shop/leisure rise toward their P_open peaks.

Trips per person — θ* vs θ̂

Departure-time distribution (trip starts by hour)

Top activity sequences (θ* population)

sequencecount
HOME→SHOP→WORK→SHOP→LEIS→HOME149
HOME→WORK→SHOP→LEIS→HOME133
HOME→SHOP→LEIS→HOME97
HOME→WORK→SHOP→LEIS→SHOP→LEIS→HOME35
HOME→SHOP→LEIS→WORK→HOME29
HOME→SHOP→LEIS→SHOP→LEIS→HOME20

6 Identification — how the hard parameters were fixed

theta_travel — single transport scale. θ_travel multiplies the WHOLE mode utility u=θ·(ASC+β_time·t+β_cost·c) (PT=0 reference); the separate PT level ASC_pt_adj is retired. This removes the scale-vs-level ridge that biased theta_travel +13.8% (|bias|/SE=16.6) under the old two-parameter spec → now -0.0025 (4.6% APB).
beta — realistic late shift. The 12:00–22:00 schedule places t_e when after-work options are closed (shops shut, leisure past peak) → agents linger past schedule → post-schedule WORK observations. With β=0.0005 (below δ/Δt at Δt=30) the post-schedule marginal is positive then declines → traceable slope. beta SE: 3.98 → 0.0007.
shop/leisure intercepts vs slopes. Two shop zones (different X, different P_open peaks) and two leisure zones break the β1·X·P vs β0 collinearity.

7 hEART Reviewer Mapping

8 Caveats & Status

Convergence flag. BFGS's gradient-norm criterion is conservative on the flat β direction; estimates are valid regardless (mean over all reps ≈ mean over converged). The N-sweep uses a loosened gtol (5e-4×steps) so the flag tracks the estimates.
Tiny-θ* APB. alpha/beta have θ*≈0.001, so APB% is unstable — the absolute bias is the meaningful figure (both negligible).

Supporting material:

Next: finish N-sweep curve → fork to Branch A (HH real-data estimation) and/or Branch B (Exact-vs-SA variance experiments), both de-risked by this passed gate.