Methodology
The site uses two models built from EPA fish-tissue data. The 95% and 99% bounds come from quantile-regression curves: four site and fish measurements are combined into a single score, x, and PFAS (in ppb) is estimated as y = C / x, with a different constant C for each confidence level. The exact prediction comes from a separate machine-learning model, described below. The four inputs are:
Proximity to Known Military Installations (averaged into D)
The site's latitude/longitude is compared against a reference list of ~750 U.S. military installation coordinates (military bases historically associated with PFAS-containing firefighting foam, AFFF). The distance in miles to the nearest installation is calculated using the haversine formula.
Proximity to the Nearest Urban Area (averaged into D)
Urban areas concentrate many other PFAS sources, such as industrial discharge, wastewater treatment plants, landfills and stormwater runoff. The distance in miles from the site to the nearest 2020 Census Urban Area is looked up from the U.S. Census TIGERweb service (0 mi if the site is inside one, to within ~50 m). The two polluter distances are averaged into a single value: D = (military-base distance + urban-area distance) / 2.
Elevation (E)
Site elevation above sea level is looked up automatically from the latitude/longitude using the Open-Meteo Elevation API (90 m Copernicus DEM), converted from meters to miles, and used directly as an input to the formula. Sites at or below sea level are treated as 0 mi.
Relative Fish Length (R)
PFAS is known to bioaccumulate over an organism's lifetime, so fish size is used as a proxy for age. Because typical size varies widely between species, the model uses relative length: the fish's length divided by the average length of that same species in the study dataset. A value above 1 means the fish is larger than average for its species. Larger relative length lowers x, which raises the estimate.
95% and 99% confidence bounds
| Output | Quantile (q) | Formula (PFAS, ppb) |
|---|---|---|
| 95% confidence | 0.95 | y = 199.183 / x |
| 99% confidence | 0.99 | y = 711.2349 / x |
A q-level estimate means that, in the fitted data, a fraction q of fish fell below the
curve. So the 95% value is the level you can be about 95% sure this fish is
below. Because the curves rise very steeply as x gets small, each bound has a
ceiling: the 95% bound is capped at 533.896 ppb, the
second-highest PFAS value measured in the dataset, and the 99% bound at
1,552.824 ppb, the highest. A result shown at exactly one of these
values has hit its cap, which mostly happens at sites near sea level, where
x is close to 0. The logic lives in the getPFASUE() function in the
main page's source code.
Exact prediction: Extra Trees model
We trained several machine-learning models on the 1,110 composite samples and compared how well each predicted PFAS. An Extra Trees model performed best, with a median error of 3.04 ppb, so it is the one used for the exact prediction. Half of its predictions were within about 3 ppb of the measured value.
How it works
Extra Trees ("extremely randomized trees") builds a large number of decision trees. Each tree asks a series of yes/no questions about the inputs, such as "is the site within 5 miles of an urban area?", and ends at a predicted PFAS level. The trees are grown with extra randomness in which questions they ask and where they split, so each one makes slightly different mistakes. Averaging all of them cancels out much of that noise. Our model uses 500 trees, each with about 200 end points and a typical depth of around 19 questions.
What it looks at
- The fish: its species and its length compared with the average for that species. The 27 most common species each get their own category; 21 rarer species with only a few samples are grouped together.
- The site: elevation, latitude and longitude, and the type of water (lake, river or stream, or Great Lake).
- Nearby pollution sources: distance to the nearest military base and to the nearest urban area. Both are put on a log scale, so the difference between 1 and 5 miles counts for more than the difference between 100 and 105 miles.
- Nearby measurements: the PFAS measured at the 5 closest of the 868 sampled sites, weighted so closer sites count more, plus how far away those sites are.
- Survey: the samples come from three EPA surveys (rivers and streams 2018–19, Great Lakes 2020 and lakes 2022). The model knows which survey each sample came from, and predictions on this site are made as if from the 2022 lakes survey.
Details
The model was trained to predict the logarithm of PFAS, which keeps a few very high samples from dominating, and its output is converted back to ppb. It runs on our server, so the trained trees are never downloaded to your browser. Like any model, it can only learn patterns that appear in the training data, so it is less reliable for unusual sites or species with few samples.
PFAS compounds covered
PFAS is a family of thousands of chemicals. The estimates on this site account for the combined total of these 33 PFAS compounds, including the two most studied, PFOS and PFOA, and newer replacement chemicals such as GenX (HFPO-DA) and ADONA:
- PFBAPerfluorobutyric acid
- PFPeAPerfluoropentanoic acid
- PFHxAPerfluorohexanoic acid
- PFHpAPerfluoroheptanoic acid
- PFOAPerfluorooctanoic acid
- PFNAPerfluorononanoic acid
- PFDAPerfluorodecanoic acid
- PFUnAPerfluoroundecanoic acid
- PFDoAPerfluorododecanoic acid
- PFTrDAPerfluorotridecanoic acid
- PFTeDAPerfluorotetradecanoic acid
- PFBSPerfluorobutanesulfonic acid
- PFPeSPerfluoropentanesulfonic acid
- PFHxSPerfluorohexanesulfonic acid
- PFHpSPerfluoroheptanesulfonic acid
- PFOSPerfluorooctanesulfonic acid
- PFNSPerfluorononanesulfonic acid
- PFDSPerfluorodecanesulfonic acid
- PFDoSPerfluorododecanesulfonic acid
- 4:2 FTS1H,1H,2H,2H-Perfluorohexane sulfonic acid
- 6:2 FTS1H,1H,2H,2H-Perfluorooctane sulfonic acid
- 8:2 FTS1H,1H,2H,2H-Perfluorodecane sulfonic acid
- PFOSAPerfluorooctanesulfonamide
- N-MeFOSAN-Methylperfluorooctanesulfonamide
- N-EtFOSAN-Ethylperfluorooctanesulfonamide
- N-MeFOSAAN-Methylperfluoro-1-octanesulfonamidoacetic acid
- N-EtFOSAAN-Ethylperfluorooctanesulfonamidoacetic acid
- N-MeFOSEN-Methylperfluoro-1-octanesulfonamidoethanol
- N-EtFOSEN-Ethylperfluoro-1-octanesulfonamidoethanol
- HFPO-DAHexafluoropropylene oxide dimer acid
- ADONA4,8-Dioxa-3H-perfluorononanoic acid
- 9Cl-PF3ONS9-Chlorohexadecafluoro-3-oxanonane-1-sulfonic acid
- 11Cl-PF3OUdS11-Chloroeicosafluoro-3-oxaundecane-1-sulfonic acid