Specification · shipped ladder
The Price Model
What is fitted, what is pooled, and what is asserted. Every number is measured off the running encoder and the fitted model when this page is built, so it cannot describe a version that is not in force. 21,510 closed sales, 5,223 design columns.
1. What is fitted
log price = μ + Σ Prung[place] + Σ Mc[bin] + Σ bin · ( Wc[type] + Uc[area] ) + ε
The fit's target is log price. The estimator's is a difference: a comp is priced as anchor + ( level(subject) − level(anchor) ), so only the gap between two homes is ever used, never a level on its own. Both statements are true and the page used to give only the first.
This has not always been the specification. Inside lattice_v3 it has: the target and the difference-composition are byte-identical to the first commit of that engine. The PREVIOUS engine, lattice_v2, estimated differently — the subject's own level plus a shrunken median anchor residual, not a pure anchor-plus-difference. Numbers from the two engines are not comparable.
2. The place hierarchy
Five nested rungs. A home takes a step from every rung it has; a missing rung costs precision and never reachability. Two ladders can fill them: the shipped one, and the derived taxonomy - 26 columns over the unit set, reduced to components, clustered and then agglomerated into contiguous areas. Only the village and segment rungs differ; everything else is common.
The two ladders are not the same shape. The shipped village rung is an HOA village where one exists and a geometric cell everywhere else, so it is a place by administration. The derived one is a place by RESEMBLANCE, agglomerated to be contiguous - and the segment rung above it holds classes, which are kinds rather than places: two areas forty miles apart can share one. That is what the model is being asked to pool across.
3. Pooling — what keeps a thin level honest
Every place step and every interaction slope is a random effect: it is shrunk toward zero by the ratio of its group's own variance to the noise variance. A group the data cannot support gets a small σ and is pulled most of the way back to its parent. This is the mechanism that lets a rung holding four sales exist at all — and the mechanism that quietly hides a rung that should not.
Fitted noise σobs = 0.1473 in log points, about 15.9% on price.
A group whose σ is small against the noise is being pooled hard: its levels are mostly its parent's. A group whose σ rivals the noise is being trusted.
4. The interaction, and where it gets thin
Each ladder rung carries a slope that may differ by unit type (W) and by area (U). W is cheap: three types. U is not — it is one slope per coordinate per area, so it multiplies with the taxonomy's granularity.
U rests on 34 sales at the median, and 10% of its slopes on fewer than ten. There are 3,283 of them against 21,510 sales. Under a finer taxonomy this is where the cost lands: the areas rung went from 276 to 685 places and U went from 3,283 to 8,125 columns, so the median sales behind one slope fell from 34 to 16. Nothing about that is automatically wrong — the pooling in section 3 exists for it — but it is the first place to look when a finer taxonomy stops paying.
5. The ladders
HURDLE rung 0 is the default and is not tied to rung 1UNK unread, costs precision only
beds
before 0-8, one rung each
now 0-9 singly, then 10-11, 12-13, 14-15, 16-17, 18+
One tail rule shared with baths. Beds 7+ was 62 homes over six rungs, one listing claiming 34 bedrooms; pooling raises the count behind each rung so the smoothness prior can hold an order there instead of chasing noise.
baths
before 0-13 half-steps, one rung each
now same rule, in half-steps
Counted in half-steps, so rung 10 is five baths. Above the pair point it now reads 579 / 185 / 53 / 17 / 9 instead of eight rungs holding as few as one sale.
spb
before 443 / 517 / 589 / 675 / 849 sqft per bedroom
now 443 / 517 / 589 / 675 / 849
big HURDLE
before (no ladder - living area entered only through spb)
now 3000 / 4000 / 5300 / 7100 / 9500
Living area had no ladder: it entered only as feet per bedroom, which is a shape. The cuts step by a constant ratio of about 1.33 rather than evenly, because density collapses at the top - p90 is 3,556 sqft, p99 is 5,945, the largest is 21,433. It is the only scheme tried where price per foot stays monotone to the top: $677, $726, $761, $860, $931.
lot HURDLE
before 1.87 / 2.51 / 3.92 lot-to-living ratio, detached only
now 1.87 / 2.51 / 3.92 / 5.0 / 8.0 / 15.0
A RATIO - lot size over living area - not an absolute lot, which is why it separates a cottage on an acre from an estate on the same acre. The old top bin was open-ended and held a fifth of detached sales across a 25,712-fold range.
relief
before (no ladder)
now county quartiles, read from geo_relelev_band
Already a rank in 0..1, so the cuts are global county quartiles on purpose: a within-tract baseline would normalise the same quantity twice.
floors
before 1 / 2 / 3+
now unchanged
era
before 1975 / 1988 / 1999 / 2008
now 1975 / 1988 / 1999 / 2008
time
before one rung per quarter
now one rung per quarter, origin from the data
pool_priv
before (one binary, `pool`, conflating private with community)
now private pool Y/N
One binary conflated a private pool with community access, and 71% of the old 'no pool' rung turned out to have access.
pool_other
before (did not exist)
now community pool access Y/N
view
before none / other / ocean
now priority order over 39 MLS tokens - SEE THE CAVEAT
MEASURED AND FAILING. The rungs assert more is better; within every class the order inverts, and rungs 0-5 sit inside a 3% band while only the top separates. Token by token the signal is real and NOT ordered the way this ladder claims - see studies/view_study.py.
Why a hurdle ladder cuts its first tie. The smoothness prior says adjacent increments should resemble each other, which keeps a thin rung from wandering. On a hurdle that same tie drags a sparse estate rung toward the dense default beneath it, so the one triple spanning the hurdle is dropped and the estate rungs are estimated from estate homes.
← back to the studies