This vignette documents the two-level nested gravitation model added in the 0.2.0 development line of bayesianOU, the comparative experiment configurations, and every design decision taken while implementing it (D-IMPL-1 .. D-IMPL-11). The package documents all methodological decisions in its reference material on purpose: the reader should be able to reconstruct why each modelling choice was made, not only what the code does.
The code chunks are illustrative (eval = FALSE) so the
vignette builds without a Stan backend; copy them into a session with
cmdstanr (or rstan) installed to run them.
The substantive target is the gravitation of market prices toward
prices of production described in §2.4 of Algunas reflexiones sobre
los precios de producción de Marx. Market prices phi
revert (pointwise, not uniformly) to a long-run attractor
Phi, the price of production, which is itself
Phi = k + K G' (eq. 9): the cost price
k = c + v plus the total capital advanced K
times the general profit rate G' = sum(EBO) / sum(K). The
package operationalizes this as a nested Ornstein-Uhlenbeck (OU)
process:
Phi (not to a
constant), with the aggregate profit rate (TMG) modulating the
gravitation speed.G'-driven mean
mu. In the Level-3 model (§11) that mean also tracks labour
values, so prices of production gravitate around values.The constructed production-price index enters as a noisy
measurement of the latent Phi, not as a known
regressor. We do not claim this is the only or the
first integration of these components; the contribution is the explicit,
estimable canonization of the nested structure for this class of
question.
Per sector s, on the standardized scale,
Euler-discretized with dt = 1:
Level 1 (market phi = Yz):
dev_{s,t} = phi_{s,t-1} - Phi_{s,t-1}
kappa^m_{s,t} = kappa_cap * inv_logit( kappa_tilde_s + beta1 * zTMG_t )
phi_{s,t} = phi_{s,t-1} + kappa^m_{s,t} ( -dev + a3_s dev^3 ) + gamma COMstd + eps
eps ~ Student-t( nu, 0, exp(h_{s,t}/2) ) # SV log-variance h (AR1)
Level 2 (latent production Phi):
mu_{s,t} = m0_s + m1 G'_t
Phi_{s,t} = Phi_{s,t-1} + kappa^p_s ( mu_{s,t} - Phi_{s,t-1} ) + sigma_p eta
Phi-anchor: index_{s,t} ~ Normal( Phi_{s,t}, sigma_phi_meas )
The reversion speeds are bounded to (0, kappa_cap)
through a logit link (see D-IMPL-2). The single-level model
(n_levels = 1) is preserved exactly: the market reverts to
a constant theta_s with Phi entering as an
exogenous linear forcing.
library(bayesianOU)
# Two-level fit (market phi = Y, constructed production index = X, G' driver):
fit <- fit_ou_nested(
Y = Y, X = X, TMG = TMG, COM = COM, CAPITAL_TOTAL = K,
n_levels = 2, Gprime = Gprime,
theta_separation = "soft", k_uncertainty = "meas",
chains = 4, iter = 4000, warmup = 2000
)
print(fit) # separation evidence, reversion-speed ranges, MCMC health
summary(fit) # Level-2 parameter table + OOS metrics
plot(fit, type = "phi") # latent production price with credible band
plot(fit, type = "mu") # G'-driven Level-2 mean trajectoryThe Stan model is a single file,
inst/stan/ou_nested.stan, covering both modes.
n_levels = 1 reproduces the retired legacy
ou_nonlinear_tmg.stan bit-for-bit. The
operational definition of “bit-exact” matters:
generate_quantities
of both the legacy and the unified n_levels = 1
model over the same input draws, and compare
log_lik cell by cell. Result:
identical() = TRUE, 0 of 72000 cells differ.log_lik stored during
sampling shows a ~5e-8 difference that is not an
algebraic discrepancy but the CSV serialization rounding of cmdstan
(sig_figs): sampling computes log_lik at full
precision in memory, while generate_quantities reads the
draws rounded from CSV. The gq-vs-gq comparison isolates code
equivalence from the serialization artifact. That is the
correct notion of bit-exact here.The legacy draws, the data and the reference log_lik are
frozen as fixtures so the guard
(tests/testthat/test-equivalence.R) stays runnable after
the legacy file was removed. The same gq-over-frozen-draws design backs
the per-configuration golden guards of §12.
The first 2-level prototype did not converge (R-hat ~ 17,
Phi RMSE ~ 1e16) and did not recover parameters.
Root cause: the Euler reversion speeds were unbounded
(exp link). For dt = 1 the AR coefficient of
the linear part is (1 - kappa); with
kappa > 2 its modulus exceeds 1 and the OU recursion is
explosive. In single-level mode the data pinned
kappa ~ 0.4; in 2-level mode the latent Phi
gave the sampler freedom to explore the explosive region.
Root-cause fix (not a patch): in 2-level mode the
speeds are bounded to (0, kappa_cap) via a logit link, with
the TMG modulation inside the link, so neither the level nor
the TMG term can push the speed out of the stable region:
kappa^m_{s,t} = kappa_cap * inv_logit( kappa_tilde_s + beta1 * zTMG_t )
kappa_cap is configurable; the default 2
admits the full stable region (kappa < 2 stable,
kappa < 1 monotone without overshoot). Defaulting to
2 rather than 1 does not
assume monotone convergence (anti-overreach). The single-level path
keeps the legacy exp link untouched; the equivalence was
re-certified after the change.
The latent Phi recursion propagates the
state forward (unlike the Level-1 cubic, which acts on the
observed market price and therefore never diverges). With cubic
/ stochastic-volatility richness on Level 2, wide random inits and
warmup exploration can make the latent trajectory explosive (the
discrete cubic map or an extreme volatility draw). The fix is
layered:
[-10, 10] before cubing and the Level-2 SV scale to
[1e-3, 1e1]. Both are inert when the Level-2 switches are
off, so the canonical Level 2 keeps the exact linear Gaussian OU.0.3) so the latent recursion starts in a
stable region; warmup then adapts. The single-level keeps the legacy
random init.This is the Level-2 analogue of the D-IMPL-2 reversion-speed bound.
While the Stan model was incomplete, unrealized options raised a
clear error instead of being silently ignored (D-IMPL-3): a
non-canonical level_spec or
k_uncertainty = "recon" errored until the corresponding
Stan machinery existed. Both are now realized (§7-§9).
The disaggregation draws of the market price couple to the OU model
by multiple imputation (D-IMPL-4).
fit_ou_nested_mi() refits the OU once per imputation and
combines results two complementary ways:
P(kappa^m > kappa^p)) and the Rubin-pooled latent
Phi.A documented caveat: the Rubin interval is Normal/t on the natural
scale, so for boundary-constrained parameters
(e.g. sigma_Phi) it can graze the boundary; a log-scale
pooling is a possible refinement. This is a property of Rubin’s rule,
not a defect of the machinery.
Out-of-sample (D-IMPL-5).
evaluate_oos_nested() differs decisively from the
single-level recursion: the market reverts to the latent
Phi, which is itself propagated forward by its own Level-2
OU toward the G'-driven mean. The market never sees the
realized future X. Two caveats, identical in spirit to the
single-level evaluate_oos(): the forecast is conditional on
the aggregate drivers G'_t and zTMG_t, and it
uses plug-in posterior medians (it is a mean-equation forecast, not the
full posterior predictive). diagnostics$oos is populated
for 2-level fits.
Level-2 mean trajectory (D-IMPL-6).
extract_mu_trajectory() reconstructs
mu_{s,t} = m0_s + m1 G'_t over the posterior draws (median
+ bands), exposed as fit$mu_path; it is the structural hook
to the Level 3 of values (§11), where the mean gains the value term
m_v V_{s,t}. The 2-level result carries the S3 class
ou_nested_2level at the top level (the
object the user holds), so print / summary /
plot dispatch naturally; the inner factor_ou
keeps a plain model string to avoid a duplicate class on a
nested element.
k_uncertainty = "recon" realizes eq. 11: the anchor of
the latent Phi is no longer the fixed constructed index but
the reconstruction Phi = k + K G' with the total capital
advanced K treated as uncertain.
f_Y.
K = K_hat * exp(sigma_K * z_K),
z_K ~ Normal(0,1), a non-centered lognormal around the
point estimate K_hat = CAPITAL_TOTAL. sigma_K
(priors$sigma_K_recon, default 0.10, ~10% multiplicative
uncertainty) is a prior input.X. Since X = k + K_hat G' by construction, as
sigma_K -> 0 the standardized reconstruction collapses
exactly onto the "meas" anchor. The two modes are
contrastable on the same latent OU, differing only in how the
anchor is formed.X departs from
the deterministic k + K_hat G' (max relative discrepancy
> 1e-3) a warning fires; recon then does not reduce to meas and the
user is told.Phi_anchor_eff ~ Normal(Phi, sigma) with
Phi_anchor_eff a deterministic function of z_K
is a hierarchical measurement model (a log-density factor
coupling two quantities), not a change of variables of the base measure,
so no Jacobian term is required.Each level toggles four richness dimensions: cubic
drift, sv (stochastic volatility), student_t
tails and hierarchy (cross-sector partial pooling),
materialized as 8 integer Stan flags. They act only in 2-level
mode; the single-level model is always the full legacy Level 1,
so n_levels = 1 is untouched. The
canonical configuration (Level 1 full; Level 2
cubic/SV/ Student-t off, hierarchy on) reproduces the previous 2-level
model exactly: the Level-2 richness blocks are length 0 when off.
ou_level_spec() builds the named configurations of the
comparative experiment:
ou_level_spec("canonical") # Level 1 full, Level 2 lean (linear Gaussian OU)
ou_level_spec("both_full") # both levels full
ou_level_spec("both_lean") # both levels lean
ou_level_spec("n1_lean") # Level 1 lean, Level 2 lean
# Fit a configuration:
fit_bf <- fit_ou_nested(Y, X, TMG, COM, K, n_levels = 2, Gprime = Gprime,
level_spec = ou_level_spec("both_full"))The fifth arm of the experiment is the single-level model
(fit_ou_nested(..., n_levels = 1)). Dispatch is honest: a
malformed spec, or a lean Level 1 in single-level mode, errors rather
than being silently ignored. No configuration is claimed uniquely
correct; the experiment reports which one the data support, by parameter
recovery and out-of-sample / leave-cluster-out performance.
When the Level-2 richness is on, the latent production price acquires
its own cubic coefficient a3_p, Student-t degrees of
freedom nu_p, and a time-varying stochastic-volatility
scale sigma_p(t) = exp(h_p/2). The summary exposes all
three, by symmetry with the already-exposed a3_p and
because a both_full fit whose Level-2 tail and volatility
parameters were hidden would be uninterpretable (the maximum-robustness
criterion). The quantities are derived from the posterior draws
(nu_p = 2 + nu_p_tilde;
sigma_p(t) = exp(h_p/2)), so no Stan-side change
was needed and the bit-exact n = 1 path is untouched. They are
NULL when the corresponding switch is off, leaving the
canonical summary unchanged.
The nested cascade extends to a third level
(n_levels = 3). The latent production price now reverts
toward a mean that also tracks the value index
V (the direct price c + v + p), so the
production prices gravitate around values (Marx, Capital III
ch. IX): mu_{s,t} = m0_s + m1 G'_t + m_v V_{s,t}.
V is supplied through the V_value argument (T
x S) and built by direct empirical construction,
V = k_cost + EBO (= DirectPrices_Index). It is
a measured anchor, not the solution of a value system: there is
no Leontief inverse and no simultaneist algebra. The
model standardizes V column-wise on the training window, so
the coupling m_v is a dimensionless slope.m_v ~ Normal(0, 0.5) is neutral; the ch. IX hypothesis
m_v > 0 is adjudicated by the data, not imposed (the
same anti-overreach stance as the soft kappa^m > kappa^p
separation). On the real 37-sector panel the posterior is
m_v ~ 1.01 with P(m_v > 0) = 1: production
prices track values almost one-to-one in standardized units (the
empirical content of the transformation problem), a result
found, not assumed.sigma_phi_meas_fixed = 0.05) rather than estimated. In the
deterministic limit the estimated SD piled against its lower bound 0 (a
boundary funnel); fixing it is the sigma_meas -> 0 limit
done well and removes the funnel (on the panel: rhat_max
2.208 -> 1.079, E-BFMI ~0.02 -> ~1.0). The estimated mode is kept
for the K-stochastic / recon anchor (§8).== 2 to >= 2 so
n_levels = 3 inherits the whole latent machinery; the only
n_levels == 3 addition is the value term.
n_levels in {1,2} is byte-for-byte unchanged (equivalence
and all goldens re-certified, plus a level3 golden).n_levels = 3 the
joint kappa^m > kappa^p separation collapses: once the
value term absorbs the production mean, kappa^p is
re-identified and its meaning changes. This is a substantive shift to
interpret, not a convergence regression.# Level-3 fit: production gravitates around the value anchor V = k_cost + EBO.
fit3 <- fit_ou_nested(
Y = Y, X = X, TMG = TMG, COM = COM, CAPITAL_TOTAL = K,
n_levels = 3, Gprime = Gprime,
V_value = k_cost + EBO, # direct price c + v + p (DIRECT construction)
sigma_phi_meas_fixed = 0.05 # K-deterministic anchor (D-IMPL-9.4)
)
summary(fit3)$level2_table # now carries the m_v row (value coupling)Multiple imputation and out-of-sample at Level 3
(D-IMPL-11). The disaggregation coupling (§6) and the
out-of-sample recursion (§7) both extend to the value model.
fit_ou_nested_mi() accepts n_levels = 3 with
the same V_value anchor (which, like X,
CAPITAL_TOTAL and COM, may be either a fixed
matrix or supplied per imputation under the unified external multiple
imputation, D-IMPL-13.5/14.1); it adds the coupling m_v to
the Rubin-pooled set, and the latent-Phi pooling and the
separation evidence now apply to n_levels >= 2.
evaluate_oos_nested() gains the value term in its Level-2
attractor (a V_z argument plus an m_v median),
so the held-out forecast for a 3-level fit reverts to
m0 + m1 G' + m_v V rather than the plain Level-2 mean. Both
extensions are gated and additive: with no value anchor the behaviour is
byte-identical to the 2-level case.
mi3 <- fit_ou_nested_mi(
phi_draws = phi_draws, X = X, TMG = TMG, COM = COM, CAPITAL_TOTAL = K,
Gprime = Gprime, V_value = k_cost + EBO, n_levels = 3, M = 25,
sigma_phi_meas_fixed = 0.05
)
mi3$rubin[mi3$rubin$parameter == "m_v", ] # Rubin-pooled value couplingRicher value dynamics (deferred). Whether
V should itself be a fourth latent state with its own OU
and measurement (symmetric to Phi), instead of an observed
anchor, is an open design question deferred to the user (D-8.7). The
canonical minimal version implemented here is V observed;
the latent-V variant is recorded as canonized debt, not
built.
The definitive run (sigma = 0.05 arm).
The canonical empirical result is the unified external-MI fit on the
37-sector x 61-year US panel (n_levels = 3,
K-deterministic, M = 25, 4 chains x 3500 post-warmup draws,
adapt_delta = 0.97). It clears an impeccable per-imputation
gate — pooled rhat_max < 1.01 (max 1.006), bulk/tail ESS
>= 1000 (min 1918 / 3105), and zero
divergences after a single-imputation top-up at
adapt_delta = 0.99 removed the lone divergent transition in
one of the 25 fits (the other 24 contributions bit-identical, so the
pooled estimates move only in the 4th-7th decimal). The value coupling
is m_v = 1.0136, 95% CI [1.0096, 1.0176],
P(m_v > 0) = 1, fmi = 0.37: prices of
production track values almost one-to-one in standardized units, with
the external value/capital uncertainty genuinely propagated (the
fmi > 0 certifies the multiple imputation is doing work
— under a single deterministic anchor it was 0).
Weighting is by value added, a declared double
proxy. The hypothesis asks for averages weighted by each
capital’s share in total social capital (in modern terms, gross
investment by branch), not simple averages. Empirically that share
cannot be measured by its ideal referent: for the US (BEA)
neither gross investment nor the capital stock exists
disaggregated by branch. The national totals are therefore allocated to
industries by value-added (VAB) share for the
value-bearing flows — compensation v and operating surplus
p (imputed 1960-1996; direct from the Use tables 1997-2020)
— and by intermediate-consumption (CI) share for the
constant-capital stocks — fixed-capital consumption and non-financial
assets (whole span). The effective weighting key is thus VAB (and CI): a
declared double proxy for social-capital participation, not the
capital stock and not investment flow. The aggregate G' in
Phi = k + K G' is correspondingly the VAB-weighted average
rate of profit. (Source:
Documentacion_Excel_Tasa_Media_Ganancia_Nov22.)
The sigma arm is a regularizer, and the
sweep confirms robustness. sigma_phi_meas = 0.05
is a declared latency regularizer, not a data-calibrated
magnitude (under external MI there is no measurement residual left to
calibrate). Its influence was assessed by a full sensitivity sweep
sigma in {0.02, 0.05, 0.10} at the same base seed (15000);
all three arms clear the impeccable gate (0 divergences each). The
load-bearing conclusions are invariant to the
regularizer:
sigma |
m_v |
median kappa_m |
market half-life | median kappa_p |
|---|---|---|---|---|
| 0.02 | 1.0138 | 0.0986 | 9.0 yr | 0.864 |
| 0.05 | 1.0136 | 0.0977 | 9.0 yr | 0.888 |
| 0.10 | 1.0126 | 0.0970 | 9.0 yr | 0.935 |
m_v ~ 1.013 (spread 0.001) and the market half-life (9.0
years, with near-identical sector ranges) are essentially unchanged
across the sweep. The only sigma-sensitive quantity is the
magnitude of kappa_p, which rises monotonically
with sigma (a looser regularizer lets the latent
Phi float, so it re-anchors to value faster) but stays in
the same fast regime — consistent with kappa_p being the
re-identified, caveated parameter (D-IMPL-10.1). The sweep therefore
robustifies the anchor rather than qualifying it.
The Level-3 result m_v ~ 1 is measured on standardized
levels, and the production index
Phi = k + K G' shares the cost price k = c + v
with the value index V = k + p. A mainstream critic can
object that the two series move together because they are the same
accounting. The objection is valid for the shared level — and only
there. The Marxian content lives elsewhere, and the defence is to move
the evidence onto a quantity the construction does not
predetermine.
k:
W_i = Phi_i - V_i = (k_i + K_i G') - (k_i + p_i) = K_i G' - p_i.
What remains is purely the redistribution of the transformation — the
uniform profit mark-up on advanced capital minus the sector’s own
surplus — and, since G' = sum(p) / sum(K), it sums to zero
across sectors by construction:
sum_i W_i = G' sum_i K_i - sum_i p_i = 0. The “spurious”
part lives entirely in k; the Marxian content lives
entirely in the zero-sum wedge W.phi - V: do they revert and stay bounded rather than
diverge? No accounting identity implies a reversion speed
kappa; two series can be definitionally co-moving in levels
while their deviations do anything (random walk, explosive, white
noise). The weight of evidence therefore shifts from m_v (a
level, definitional) to kappa, the out-of-sample recursion
and the wedge (all construction-orthogonal). See §13.sum p, G') but break the sectoral Marxian
structure, and show that gravitation is weaker or absent for them than
for the true V.
convergenceDFM::placebo_values() implements two:
"uniform" (p = G' K, so V = Phi
and the wedge is null — the no-redistribution null) and
"permute" (a seeded derangement that mis-pairs
K_i with p_i while preserving the yearly
total). If the genuine sectoral V gravitates better than
placebos that share all aggregate accounting, the specific Marxian
structure adds information beyond the shared k.G' anchor is social surplus P, by
definition. That G' = sum(P)/sum(K) is anchored in
total social surplus is the Marxian definition of the general
rate of profit, not a hypothesis to prove; what is empirical and
falsifiable is that the production prices built with that
G' govern the gravitation and that the wedge behaves as
bounded zero-sum redistribution rather than a diverging gap.k
is the mechanism of that theory, not a confounder — this is
theory-laden measurement (as measuring kinetic energy two ways and
finding they agree is internal consistency, not a spurious link). The
defence is the conjunction: declare the definitional part
openly (anti-overreach as armour), move the evidence to the
construction-orthogonal dynamics (wedge, reversion, kappa,
OOS), add placebos, and lean on the theory’s causal warrant.Diagnostics and the empirical finding (D-IMPL-13.4).
The wedge tools live in convergenceDFM:
compute_wedge(K, Gprime, p) (with a per-year zero-sum
check), wedge_stationarity(W) (per-sector AR(1) half-life +
ADF, panel summary, with no single fabricated panel p-value), and
placebo_values(). On the corrected real panel the wedge
sums to zero (~2e-16), its magnitude |W|/Phi
has median ~6%, and it is highly persistent
(rho ~ 0.96, half-life ~10-16 years; ADF
rejects a unit root in only 1/37 sectors). A 200-draw permutation
placebo does not separate from the true wedge
(empirical p ~ 0.65). Read honestly (anti-overreach,
exactly as expected): with 61 annual observations and decade-scale
half-lives a univariate unit-root test is structurally underpowered —
the low-kappa trap (§13) made visible. The
wedge does its primary job (a construction-orthogonal, zero-sum,
pointwise-bounded quantity that disarms the spuriousness charge) and
exposes, without cosmetics, where univariate data cannot decide; the
dynamic discrimination is then carried by the OU posterior of
kappa (pooled, prior- informed, more powerful than ADF) and
by out-of-sample forecasting.
Definitive run (sigma = 0.05). On the
definitive unified-MI panel the wedge sums to zero to machine precision
(max|sum_i W_i| = 4.6e-10), its magnitude
|W|/Phi has median 6.1%, and it is highly
persistent: AR(1) rho = 0.958, central half-life
9.6 years, and a per-imputation half-life of
9.5 years [8.3, 11.4] across the 25
imputations. The univariate ADF rejects a unit root in only
1/37 sectors and a 200-draw permutation placebo does
not separate from the true wedge (empirical p = 0.65) — the
low-kappa trap (§13) made visible, exactly as anticipated,
not a failure of the construction. The wedge’s decade-scale persistence
coincides with the market half-life (§13): the characteristic deviation
time-scale of the system is roughly a decade, coherent across
levels.
The substantive claim “prices gravitate” is the claim
kappa > 0; its speed is secondary.
kappa > 0 is
convergence: stationary, with finite stationary variance
sigma^2 / (2 kappa) and half-life
(ln 2) / kappa. kappa = 0 is a random walk;
kappa < 0 explodes. A slow gravitation is not
weak evidence — it is what the theory predicts (secular, slow
gravitation of market prices around prices of production; a fast
kappa would be suspicious).P(kappa > 0) = 1 is uninformative
here. By construction
kappa = kappa_cap * inv_logit(.) lies in
(0, kappa_cap), so the sign probability is trivially one.
The informative per-sector quantity is the half-life
(ln 2) / kappa and whether it exceeds the observed span.
The mixture-posterior half-life
(separation_pooled$halflife_* and the thinned
kappa_mixture from
fit_ou_nested_mi(..., keep_kappa_mixture = TRUE)) is
reported in preference to a moment-based delta on kappa,
because kappa_p piles near its lower boundary precisely in
the slow regime, where a Gaussian/t approximation is least
faithful.kappa > 0 then it converges (ergodicity)” is the
mathematics, and the data supply an inferential guarantee:
posterior mass on kappa > 0 (here, credible half-lives)
together with identification.kappa trap. Empirically, with
61 years, a low kappa > 0 becomes indistinguishable from
kappa = 0 (a unit root): a half-life near the sample length
means the likelihood barely sees one half-life and cannot separate “very
slow reversion” from “no reversion”. This is why kappa_p
was weakly identified at n_levels = 2. The credible
guarantee of kappa > 0 can evaporate in the
slow regime — not because there is no convergence but because the data
do not resolve it; this threatens the cornerstone itself in that regime
and is not a side detail.kappa is soft. Boundedness and reversion of the
wedge (§12), out-of-sample forecasting, and placebos give evidence of
gravitation without requiring kappa to be pinned
down. They are not decoration: they are the instruments that secure the
cornerstone when kappa alone is too weakly identified (the
n=2 regime). When kappa is well identified
(the n=3 regime, fast kappa_p),
kappa suffices on its own.kappa > 0 — with (ii) the
sampler convergence — rhat < 1.01, the HMC
mixed well. They are independent: a perfectly mixed sampler can report
that kappa is credibly ~0 (no economic
convergence), and a non-converged sampler says nothing. This vignette
and the reporting use “gravitation / reversion” for the economics and
“mixing / sampler convergence” for the MCMC, always.P(kappa^m > kappa^p) (the soft separation, in
separation_pooled$prob_sep_by_sector), the half-life and
its interval, and a low-kappa-trap flag (half-life beyond
the span). Report the sectoral distribution, not only the
aggregate: the joint kappa^m > kappa^p is an AND over
all 37 sectors, so a joint near 0 is not “no
separation” but “no longer in every sector simultaneously” — and at
n_levels = 3 the joint typically collapses because the
value term re-identifies kappa_p (D-IMPL-10.1).Definitive run (sigma = 0.05). Market
gravitation (kappa^m, market price toward production price)
has a median half-life of 9.0 years (sector range
6.2-17.7); production gravitation (kappa^p, production
price toward the value-anchored mean) a median of 0.8
years — production prices are strongly value-anchored
(m_v ~ 1 and fast reversion), while the market
gravitates slowly, faithful to Marx’s secular tendency. The joint
kappa^m > kappa^p is 0 and
P(kappa^m > kappa^p) is below 0.1 in 36/37 sectors: at
n_levels = 3 the value term re-identifies
kappa_p upward, so the order is dominated by the fast
production reversion (read the sectoral distribution, not the collapsed
joint; the lone exception is Warehousing, P = 0.35, where
kappa_p ~ kappa_m).
The low-kappa trap, quantified per sector: by the
majority-mass criterion P(half-life > horizon) > 0.5
no sector is in the trap (0/37 at both the 42-year
training and 61-year full horizons, market and production) — the
hierarchical posterior resolves every sector’s central
half-life inside the sample, precisely where the univariate ADF (1/37
rejections, §12) cannot. But the slow tail is not
empty: the slowest sectors (Information,
kappa^m = 0.039, half-life median 17.7 with q97.5 ~82
years; Professional/scientific/technical services; Oil & gas;
Construction) retain non-negligible upper-tail mass beyond the horizon —
P(half-life > 42) = 0.143 for Information, and the
widest sectoral half-life q97.5 reaches ~290 years. So the median
gravitation is empirically resolved everywhere, yet for the slowest
sectors the posterior does not rule out near-unit-root behaviour: that
residual 10-14% upper-tail mass is the trap, now measured
rather than asserted. This is exactly why the cornerstone leans on the
pooled kappa posterior together with the wedge and OOS,
never on a univariate stationarity test. (These figures are the
central sigma = 0.05 arm; the
sigma in {0.02, 0.10} arms reproduce them — median market
half-life 9.0 years in all three — so the trap structure is robust to
the regularizer; see the sweep table in §11.)
The package follows a layered validation standard (algebraic / statistical / numeric, kept separate):
kappa_p,
kappa_m_base, m1) are checked for 90%
credible-interval coverage, and the latent Phi for
correlation with the truth. The script is
validacion/recovery_by_config.R; the gated regression test
is tests/testthat/test-recovery-by-config.R (set
BAYESOU_RUN_RECOVERY_CONFIG=1). The Student-t
nu and the SV scale are weakly identified when stochastic
volatility is present (the prior dominates) and are deliberately
excluded from the coverage assertion.Phi that wanders with a strong
G'-driven mean while the index is only a noisy
measurement), PSIS-LOO prefers the 2-level model. We report the
comparison and its standard error rather than over-claiming a universal
ranking: on real, weakly separated data competing specifications are
often statistically indistinguishable in elpd.log_lik; the permanent test
(tests/testthat/test-golden-configs.R) recomputes
log_lik via generate_quantities and asserts a
bit-for-bit match. Regenerate with
validacion/make_golden_configs.R.a3 < 0 is a stability
assumption, not an estimated result; it precludes detecting
locally self-amplifying regimes.validate_ou_fit()
surfaces and warns on it, and the leave-cluster-out design (in the
companion convergenceDFM) is the robustness answer under
cross-sectional dependence. “Surviving leave-cluster-out” means
predictive robustness under dependence, not a topological
invariant.sigma_phi_meas = 0.05 arm, a declared latency
regularizer rather than a calibrated magnitude. The full
sigma in {0.02, 0.05, 0.10} sweep (all gate-clean) confirms
the conclusions are robust to it: m_v ~ 1.013 and the
9.0-year market half-life are invariant across arms, with only the
magnitude of kappa_p mildly sigma-dependent
(sweep table, §11).A full validation block was run on the canonical K-deterministic
variant (sigma = 0.05 arm), in the order internal ->
external -> SBC. Throughout, the economic convergence
(gravitation: kappa, half-life) and the sampler
convergence (R-hat, divergences, ESS) are kept lexically distinct, and
the verdict is prepared, anti-overreach, for the likely case that the
hierarchical model does not dominate simpler rivals predictively.
Internal (synthetic, known truth).
n = 3).
Panels are simulated from the three-level law with known
(kappa_m, kappa_p, m1, m_v) (fresh truth + data per
replicate, over the realistic parameter region), fit via the direct-Stan
path (truths kept literal, no re-standardization), and judged by 90%
credible-interval coverage. Over 105 replicates (S=8 plus S=37 at the
real dimension) the pooled coverage is 0.91
(kappa_p, kappa_m_base, m1,
m_v all near the nominal 0.90), corr(Phi) ~
0.999, R-hat < 1.007. The m_v interval widens
honestly from a strong value anchor (width ~0.074) to a weak
one (~0.131): the model does not fabricate precision when the value
signal is weak. A handful of divergences across ~100 fits is a per-fit
rate diagnostic, not a hard zero (the empirical coverage itself rules
out posterior bias).kappa -> 0): the posterior reports a ~50-year
half-life and only ~5% of null sectors reach the real-data 9-year
half-life – the pipeline does not manufacture fast
gravitation from a random walk. (b) An m_v = 0 DGP with a
persistent value regressor present: the posterior of m_v
covers 0 (no hallucinated value anchoring). Coverage of a near-boundary
kappa is not the right metric (a bounded parameter’s
credible interval departs from nominal at the boundary by construction);
the substantive anti-false-positive criterion is the one reported.kappa_m toward
slowness; at the real operating point (between-imputation
correlation ~0.78) the bias is a modest ~13-26% and kappa_m
coverage stays near nominal (~0.79). The bias direction is
conservative: the true gravitation is at-least-as-fast
as the reported 9-year half-life (likely ~7-8 years), within the same
slow regime.kappa_m, kappa_p,
m_v, m1. SBC is run on the exactly-simulatable
linear core (Level-1 OU + stochastic volatility + Student-t + hierarchy
+ Level-2 + value): the cubic restoring term is not
exactly forward-simulatable (the unclamped dev^3 of the
likelihood explodes a forward recursion), so its SBC is infeasible;
since on real data a3 ~ -0.047 sits essentially at its
prior, the cubic is a minor refinement, and its kappa_m
calibration is the one I1 certifies.External (real BEA panel, vs legitimate rivals).
kappa = 0 (no-gravitation) restriction, with RMSE, Gaussian
log-score, and an honest paired standard error. Across panels the
random walk beats the OU, and the
kappa = 0 restriction beats or ties it; the OU only
outperforms the flat AR(1). The nested gravitation does
not improve out-of-sample forecasting.n = 1, 2, 3). The value term is predictively
indistinguishable (Deltaelpd ~ 0.7, se ~
0.9); PSIS-LOO is unreliable here (high Pareto-k from the latent SV
state), so it is secondary and the held-out OOS is primary. Consistent
with E1.convergenceDFM). The wedge
W = Phi - V = K G' - p is zero-sum, bounded and persistent
(rho ~ 0.96, half-life ~9.6 y), but permutation placebos
that preserve all aggregates are not separated by any
univariate statistic (ADF or reversion-speed). This is the
low-kappa trap made visible (a near-unit root at T = 61
leaves the augmented Dickey-Fuller test underpowered), not a model
failure.The three external nulls (the OU is not a better forecaster; the value term adds no predictive density; no univariate test separates the wedge) do not refute the substantive claims, and the argument that they do not is not special pleading:
phi -> Phi -> V. Predictive
skill and univariate separability are a different functional of the same
model. A correctly specified slow-mean-reverting process simultaneously
has well-defined structural parameters and a near-random-walk
predictive distribution at horizons short relative to its half-life.
Both are true at once.kappa > 0 vs kappa = 0 are
nearly identical – E1); its forecast variance saturates while the
realized error grows (the long-horizon log-score gap – E1); and the
augmented Dickey-Fuller power tends to its size as the root approaches
unity (so univariate tests cannot separate the wedge – E3). Finding
these signatures is corroboration of the slow
form of the thesis, not an anomaly it survives.k = c + v by construction, so the marxian
content lives in W, not in the definitional level
co-movement the critique targets; the claim is tested on
W’s dynamics, in the posterior.kappa trap leaves the slow
tail of the posterior near the unit root – and the reported 9-year
half-life is, if anything, a conservatively slow estimate (I1b). A
single mechanism – slow gravitation – simultaneously is the thesis,
entails every external null, and survives in the validated structural
register: the opposite of special pleading.