Bayesian updating
How your logbook changes an area's score: a prior belief, your sessions as data, and the updated belief.
In plain words
For each area and season phase the app keeps one number from your logbook: the share of your sessions there that produced at least one target fish. With few sessions that share jumps around: one good day out of one is 100%. Bayesian updating starts from a prior belief and moves it toward your own record as the sessions add up. Plans on the paid tier use it; free and anonymous plans give every area the prior alone.
The prior is 2 good sessions in 4: a 50% success rate that counts as much as 4 sessions of your own Starting value: SPEC 5.8. Each session you log is added to it. After 3 good days in 4 sessions: . After 30 good days in 40: , close to your own 0.75: the prior matters less as your data grow. Both numbers come from the engine.
A session with no fish counts too, and it has to be logged: catches alone cannot give a success rate. The logbook therefore records sessions, with or without fish, and the catches inside them. A session counts once it has an end time or a fish count (an open session has no outcome yet); it is a success when its fish count is above 0, or, with no count, when it has a logged catch of the target species. It counts in the season phase of its date, from the lake temperature and its 7-day trend (Fish and temperature; Working rule: the lake average stands for the conditions during the session).
The Beta-binomial model
The success rate is uncertain, so the app describes it with a probability distribution. The Beta distribution suits a rate between 0 and 1, and it is the conjugate prior of the binomial count of good sessions: the updated distribution is again a Beta, and updating means adding counts.
The personal factor of the score is the posterior mean , with weight 0.05: from 0 to 5 points, and 2.5 with no sessions. Because of the prior it never reaches 0 or 1.
Source: Gelman et al. (2013), Bayesian Data Analysis, chapter 2. SPEC 5.13. Engine: personalCounts in packages/engine/src/personal.ts; the personal factor and PERSONAL_PRIOR in scoring.ts.
Uncertainty and the confidence label
The posterior spread shrinks as sessions add up: 0.22 for the prior alone, 0.16 after 3 good days in 4, 0.07 after 30 in 40. A wide spread means the estimate is still mostly the prior. In Phase 2 the spread of the fitted model feeds the plan's confidence label, so a wide posterior lowers it (SPEC 5.13). Today the label uses forecast lead time, the lake temperature against the tournament record, the records for the top area and the age of the data (Validation).
Hierarchical models (Phase 2)
Planned: not built yet The counts above run from Phase 1. Phase 2 adds two levels, each starting from the level above as its prior, so the model works with no data and moves toward the data as they come in:
- A global model: Bayesian logistic regression of session success on the area and lure factors, fitted each night on anonymized sessions from users who choose to share them. Its prior is centered on today's hand-set weights.
- A personal model for each user: coefficients centered on the global model and pulled toward it in proportion to how little data the user has (partial pooling). A user with no sessions gets the global model; there is no fixed session threshold. The plan shows the number of sessions behind it.
: the factor values of the session's area and lure. The fit uses a Laplace approximation (Newton iterations on about 10 to 20 coefficients), runs in a scheduled job, and hands the engine the posterior means and standard deviations, so the engine stays fast and free of data access (SPEC 5.13).
Selection bias
Users fish where the plan sends them. The areas the plan likes collect more sessions, and on days the plan picked for them, so their success rates carry the plan's own choices. Each session records the plan that recommended it, and the Phase 2 fit includes that as a covariate. Sharing for the global model is off by default and can be withdrawn; withdrawn sessions leave the next fit.
Calculator
Beta-binomial update
Runs the app's engine in this browser: scoreArea (packages/engine/src/scoring.ts), personal factor.
Prior Beta(2, 2); after 3 of 4: Beta(5, 3). This is the prior the app uses, so the two means agree. The spread, the range and the curves are page calculations; the app uses the mean.
Table of values
| Success rate, share of sessions with fish | Prior | Updated (posterior) |
|---|---|---|
| 0.00 | 0.00 | 0.00 |
| 0.10 | 0.54 | 0.01 |
| 0.20 | 0.96 | 0.11 |
| 0.30 | 1.26 | 0.42 |
| 0.40 | 1.44 | 0.97 |
| 0.50 | 1.50 | 1.64 |
| 0.60 | 1.44 | 2.18 |
| 0.70 | 1.26 | 2.27 |
| 0.80 | 0.96 | 1.72 |
| 0.90 | 0.54 | 0.69 |
| 1.00 | 0.00 | 0.00 |
Constants
| Constant | Value | In the code | Basis |
|---|---|---|---|
| Prior | 2 good sessions in 4 | PERSONAL_PRIOR (scoring.ts) | Starting value: prior 0.5 with the weight of 4 sessions (SPEC 5.8) |
| Weight of the personal factor | 0.05 | WEIGHTS.personal (scoring.ts) | Starting value: SPEC 5.8 |
Sources
- Gelman, A., Carlin, J.B., Stern, H.S., Dunson, D.B., Vehtari, A. and Rubin, D.B. (2013). Bayesian Data Analysis, 3rd edition. Chapter 2: the binomial model with a Beta prior.
- SPEC 5.13 (calibration plan).
- Links: References.