How foraging.ninja predicts where porcini, morel, chanterelle, matsutake, and oyster
mushrooms grow in Colorado — the data sources, mathematical approach, and peer-reviewed
literature behind every score.
Transparency note: We describe the model architecture and factor categories
in full. The specific factor weights, score calibration constants, and implementation code
are proprietary. This page cites the primary literature that informed every major modeling
decision.
1. Mathematical Framework
Each 250 m × 250 m grid cell receives a suitability score via a
log-linear weighted geometric mean across up to 40 independent ecological factors:
scoreraw = exp( Σk (wk / Σw) · ln(fk + ε) )
score = clip( scoreraw2.5 / anchorWard, 0, 1 )
Why geometric mean? Unlike an arithmetic mean, the geometric mean is
ruthless about missing requirements: if any critical factor scores near zero
(wrong elevation, wrong tree species, wrong soil pH), the geometric mean collapses
the total score toward zero. This shatters "red blobs" into precise hotspots.
Hard-zero vetoes: Four factors can force the score to exactly 0.0 regardless
of all other factors: absence of ectomycorrhizal host trees, outside the species' elevation
bracket, below the species' minimum summer precipitation threshold, and above the species'
maximum summer temperature threshold.
Ward CO anchor normalisation: The score is divided by the raw score computed
at Ward, Colorado (40.080°N, 105.542°W) — the site of a well-documented August 2021
B. rubriceps flush event with multiple iNaturalist records. This means Ward in peak
conditions scores exactly 1.0 (100), and all other cells are expressed relative to that
historical benchmark.
2. Factor Categories
All 40 factors are grouped into six categories. Weights are calibrated against
iNaturalist field observations using logistic regression and then hand-tuned against
published literature. Factor weights sum to 1.0.
Host & Stand Structure (~24% weight)
LANDFIRE EVT host species identity
FIA species composition (IDW)
FIA stand basal area (Bonet 2012)
Forest age / stand maturity (EVH)
Forest edge distance
Climate (~18% weight)
Summer precipitation (Jul+Aug+Sep)
September trigger pulse
Winter snowpack (Oct–Mar)
Summer max temperature
August dewpoint
Diurnal temperature range
Terrain & Hydrology (~16% weight)
Elevation zone
Topographic Wetness Index
Topographic Position Index
N-facing aspect (northness)
Heat Load Index
Stream proximity
Soils (~16% weight)
Soil pH 0–30 cm (POLARIS)
Soil organic carbon
Bulk density
Hydraulic conductivity (Ksat)
Cation exchange capacity
Soil porosity
Remote Sensing (~9% weight)
NDVI summer amplitude (MODIS)
Land surface temperature (MODIS)
Canopy cover % (LANDFIRE)
Snow disappearance DOY (MODIS)
Disturbance & Succession (~8% weight)
Post-fire age bonus (MTBS/NIFC)
Bark/spruce beetle kill (USFS IDS)
Forest loss year (Global Forest Change)
SNODAS April SWE (snowpack)
3. NaN Transparency Masking
Before any math runs, cells are hard-excluded and rendered as fully transparent
(NaN) if any of these conditions fire:
1Elevation bracket — below 2,440 m (8,000 ft) or above 3,660 m (12,000 ft)
2No forest canopy — NLCD Tree Canopy Cover < 20% (catches plains, crops, barren rock, cities, ski runs)
3TIGER Census urban areas — all Census-designated urban boundaries + 500 m buffer (prevents color leaking onto suburbs)
4NLCD developed classes — NLCD 21/22/23/24 (developed open/low/medium/high) + 500 m buffer
5Hydrologic exclusion — TWI > 23.5 flags open water, wetlands, and standing water features
6LANDFIRE EVT non-forest veto — cells with non-forest/non-woodland EVT codes (agriculture, grassland, shrubland, barren) receive NaN regardless of elevation or canopy
4. Live Conditions Channels
The static habitat map shows long-term average conditions. The live conditions overlay
multiplies the static score by a daily channel vector, updated each morning:
1
SNOTEL 30-day precipitation anomaly
Source: NRCS AWDB station network; 30-day cumulative vs. 5-yr climatology
2
PRISM gridded 30-day antecedent precipitation
Source: PRISM Climate Group, Oregon State University; daily 4km grids
3
PRISM trigger window (5–10 day rain + temperature drop)
Source: PRISM daily 4km; captures the specific rainfall event + cool-down that triggers fruiting body initiation (Pilz & Molina 2002)
Source: Open-Meteo ECMWF IFS; 7-day total forecast for upcoming fruiting window
8
Seasonal day-of-year fruiting curve
Empirical curve derived from 15-year iNaturalist + GBIF observation phenology; varies by elevation band
5. Score Tier Thresholds
Tier boundaries are calibrated to the empirical score distribution of all forest cells
within the elevation bracket (2,440–3,660 m, TCC ≥ 20%):
Hotspot ≥ 0.96 — top ~10% of eligible cells. All major factors align: prime host EVT, optimal elevation, adequate soil pH and summer precip. Calibrated to Ward CO Aug 2021.
Great 0.92–0.96 — top 10–25%. Excellent conditions; one or two minor factors suboptimal.
Good 0.83–0.92 — middle 25–55%. Strong habitat but one significant factor (e.g., marginal pH, low-density host stand) reduces confidence.
Fair 0.69–0.83 — lower 55–85%. Worth exploring if nearby, but expect inconsistent results.