Every formula below is implemented in the source query and every quantity it produces is exported, so that an interval can be recomputed from the graph without access to the database. This page states them in one place; the authoritative implementation remains the SQL.
The parameters in force are recorded on samian:DatingModel_v1 and are
read from the data rather than restated here, so they cannot drift.
m = (mean(datemin) + mean(datemax)) / 2
The centre about which the effective interval is built. Averaged over every potter attested at the findspot.
As implemented:
((AVG(p.datemin) + AVG(p.datemax)) / 2.0)::numeric(10,1)
σ = sqrt( mean(width² / 12) + var(midpoints) )
Two sources of spread are added. The first term is the internal fuzziness of each potter’s own range, treated as uniform, whose variance is width²/12. The second is the disagreement between potters about where the centre lies. Where only one potter contributes, the second term is zero and the first survives — a single potter still does not date a findspot to a point.
As implemented:
SQRT( AVG(POWER(p.datemax - p.datemin, 2) / 12.0)
+ COALESCE(VAR_SAMP((p.datemin + p.datemax) / 2.0), 0) )
k = k_max − (k_max − k_min) · (1 − exp(−n / τ))
The multiplier falls from k_max towards k_min as evidence accumulates, so that a well-attested findspot receives a narrower interval. n is the stamp count of the findspot. Until revision 30a it was the number of stamps carrying a die attribution, which tied the width of the box to how completely the die record happened to be filled in; where no die was recorded at all, k fell back to k_max and the interval widened for a reason unconnected with the material. The two counts agree throughout the present corpus, so the correction moves no number — it removes a failure mode.
As implemented:
( (SELECT k_max FROM params)
- ((SELECT k_max FROM params) - (SELECT k_min FROM params))
* (1 - EXP(-COUNT(di.number)::numeric / (SELECT tau FROM params))) )
eff_start = m − k·σ eff_end = m + k·σ
The interval drawn as the box. It is an archaeologically motivated ‘virtual fuzzy year’, not a confidence interval; no probability statement attaches to it. Its width is exactly 2·k·σ, which is the identity used to verify that the exported figures are sufficient to reconstruct the interval.
As implemented:
( (AVG(p.datemin)+AVG(p.datemax))/2.0
± k_eff
* SQRT( AVG(POWER(p.datemax - p.datemin, 2)/12.0)
+ COALESCE(VAR_SAMP((p.datemin+p.datemax)/2.0), 0) ) )
q_interval = exp( − sqrt(var(datemin) + var(datemax))
/ |mean(datemax) − mean(datemin)| )
Dispersion relative to interval width, mapped onto (0, 1]. Because the denominator is a width rather than a calendar value, this axis is unaffected by proximity to the era boundary.
As implemented:
EXP(-(SQRT(VAR_SAMP(p.datemin) + VAR_SAMP(p.datemax)) /
ABS(AVG(p.datemax) - AVG(p.datemin))))
q_start = exp( − sd(datemin) / |mean(datemin)| )
q_end = exp( − sd(datemax) / |mean(datemax)| )
These divide by a calendar value, so material dated near the era boundary is penalised for its position in the calendar rather than for any weakness in the evidence. At Amiens the mean end date is AD 3, and a scatter of 15 years therefore yields q_end ≈ 0.004 — a red whisker that says ‘close to the era boundary’, not ‘poorly dated’. Exported for completeness and used for whisker colour, but not suitable as a quality measure on its own.
As implemented:
EXP(-(STDDEV_SAMP(p.datemin) / ABS(AVG(p.datemin))))
EXP(-(STDDEV_SAMP(p.datemax) / ABS(AVG(p.datemax))))
r = n_stamps_die / n_dies
q_repetition = 1 − 1 / max(r, 1)
Describes deposit character rather than dating quality. The two axes are deliberately kept apart: combining them would let a findspot that is simply not a hoard appear badly dated. Findspots without die attribution yield NULL, not zero, because absence of die information is not evidence of absent repetition.
As implemented:
ROUND(SUM(stamps_pp)::numeric / NULLIF(SUM(dies_pp),0), 3)
CASE WHEN MIN(k.rep) IS NULL THEN NULL
ELSE ROUND(1 - 1.0/GREATEST(MIN(k.rep),1), 3) END
Two identities hold for every row, and checking them confirms that the exported figures suffice to reconstruct the interval:
k = k_max − (k_max − k_min) · (1 − exp(−n_stamps_die / τ))
width = eff_end − eff_start = 2 · k · σ
Against the current data both hold to within the rounding imposed by the
SQL column types — 4.8 × 10⁻⁵ for k, which is stored as numeric(10,4),
and 0.09 years for the width, stored as numeric(10,1).
lado:qInterval measures how tightly the contributing potter datings
agree. lado:qRepetition measures how often the same dies recur, which
indicates deposit character. They are exported separately and never
averaged.
The reason is that a findspot which is not a hoard would otherwise appear badly dated. Inchtuthil is the standing example: its dating is sound, but it is not a deposit, and a combined score would drag it down for a property that has nothing to do with dating quality.
lado:qStart and lado:qEnd divide by a calendar value. Material dated
near the era boundary is therefore penalised for where it sits in the
calendar rather than for any weakness in the evidence. At Amiens the mean
end date is AD 3 and the scatter is 15 years, giving q_end ≈ 0.004 — the
red whisker in the figure records proximity to the era boundary, not a
poor date. lado:qInterval divides by an interval width and is free of
this distortion.
The source query excludes rows where datemax takes one of the values
260, 120, 150. The reason is not
documented. The filter is not neutral: it removes the affected potters at
every findspot, not at selected ones. It is recorded in the graph as
lado:excludedDatemax on the model rather than left silent, so that a
reader can see that a selection was made even though its rationale is
currently unavailable.