Last seen:
Elapsed days:
Sensor Location
Longitude:
AQI Distribution
Good
Moderate
Unhealthy for Sensitive Groups
Unhealthy
Very Unhealthy
This timeline shows daily average AQI values over the reporting period.
The horizontal colored bands indicate AQI category thresholds: green for Good, yellow for Moderate, orange for Unhealthy for Sensitive Groups, red for Unhealthy, and purple for Very Unhealthy. The white line traces the daily average AQI.
Shaded background regions indicate winter (October–March, blue) and summer (April–September, green) seasons. Seasonal patterns may reflect heating-related emissions in winter or wildfire smoke impacts in summer.
This chart summarizes AQI patterns aggregated by month across the selected date range.
Monthly aggregation is useful for identifying recurring seasonal patterns (for example, wintertime emissions or summertime wildfire smoke impacts) while smoothing short-term day-to-day variability.
This chart summarizes AQI patterns by hour of day across the selected date range.
Hourly aggregation can highlight diurnal patterns such as morning/evening activity, overnight inversions, or changes driven by local sources and meteorology.
Accepted
Rejected
Missing
This chart shows the proportion of sensor readings that passed quality assurance checks during the reporting period.
PurpleAir sensors have two independent PM2.5 sensors (A and B channels). Readings are accepted when both channels agree within acceptable tolerances. Readings are rejected when there are significant discrepancies between channels, missing data, or values outside expected ranges.
Missing indicates hours where no observation was recorded (for example, if the sensor was offline).
A high acceptance rate indicates reliable sensor performance, while elevated rejection rates may indicate sensor issues or environmental interference.
Generate a Word document report containing:
- Sensor location map
- AQI distribution summary
- Daily AQI timeline
- Data quality summary
Download Report
All air quality sensors featured in this application are part of the
monitoring network. PurpleAir is a real-time air quality monitoring network made up of sensors that detect particulate matter (PM2.5 and PM10) in the air.
All plots in this application are built using filtered and quality controlled data. This document outlines the QA/QC process that’s used to accept or reject readings from the PurpleAir monitors. Note that the raw data tab, including the data download option, returns all records, including those that are rejected (with columns indicating the record status and rejection reason if the record was rejected).
Data Validation and Filtering Process
A sequential, automated validation process is applied to all incoming PurpleAir sensor readings. Each record is systematically evaluated against a series of predefined criteria. Records that do not meet these criteria are flagged and excluded from subsequent analysis and visualization to maintain high data quality standards.
The following checks are performed:
-
Relative Humidity Check: If humidity detections from both sensors are missing, then the record is rejected. If at least one reading was made, then an effective humidity is calculated by taking the average of all readings from the detectors. If the subsequent effective reading is outside of the range 0-100%, then it is rejected. Relative humidity is needed to calculate the correction factor in a subsequent step.
-
PM2.5 Channel Data Check: If either sensor is missing a PM2.5 reading, then the record is rejected.
-
PM2.5 Measurement Plausibility Check: If either sensor’s PM2.5 reading is outside of the range 0-1000 µg/m³, then the record is rejected.
-
Inter-Channel PM2.5 Agreement Check: If the absolute difference between the two PM2.5 readings is greater than 5 µg/m³ and the readings differ by more than 30%, then the record is rejected. This procedure is consistent with recommendations from scientific literature and agency guidelines for PurpleAir data processing:
- Barkjohn, B. P., Gantt, B., and Clements, A. L. (2021). Development and application of a U.S.-wide PurpleAir PM2.5 correction factor. Atmospheric Measurement Techniques, 14(6), 4617-4637.
- U.S. Environmental Protection Agency. PurpleAir PM2.5 U.S. Correction and Data Flagging guidelines.
Applying Correction Factors
For outdoor sensors, the following correction is applied to the raw PM2.5 concentrations in conjunction with the observed relative humidity:
Corrected PM2.5 (PM_corr) is calculated as follows:
If raw PM2.5 (PM_raw) < 50 µg/m³:
PM_corr = 0.524 * PM_raw - 0.0862 * RH + 5.75
Else if raw PM2.5 (PM_raw) >= 50 µg/m³ AND PM_raw < 229 µg/m³:
PM_corr = 0.786 * PM_raw - 0.0862 * RH + 5.75
Else (if raw PM2.5 (PM_raw) >= 229 µg/m³):
PM_corr = 0.69 * PM_raw + 0.000884 * (PM_raw^2) + 2.97
Where:
- PM_corr is the corrected PM2.5 concentration.
- PM_raw is the raw PM2.5 concentration from the sensor (denoted as
pm_atmin the code). - RH is the relative humidity in percent (denoted as
rhin the code).
The correction is applied independently to each of the sensor readings, and then the average of them is taken to get the final corrected concentration.
AQI Calculation
AQI is calculated from the final corrected concentration, using the following formula:
AQI = ((I_high - I_low) / (C_high - C_low)) * (Cp - C_low) + I_low
Where:
- Cp is the truncated (to one decimal place) corrected PM2.5 concentration.
- I_high is the AQI value corresponding to C_high.
- I_low is the AQI value corresponding to C_low.
- C_high is the concentration breakpoint greater than or equal to Cp.
- C_low is the concentration breakpoint less than or equal to Cp.
The specific breakpoints used are defined in the purpleair.R script and correspond to the standard US EPA PM2.5 AQI calculation:
| C_low (µg/m³) | C_high (µg/m³) | I_low | I_high | Category |
|---|---|---|---|---|
| 0.0 | 9.0 | 0 | 50 | Good |
| 9.1 | 35.4 | 51 | 100 | Moderate |
| 35.5 | 55.4 | 101 | 150 | Unhealthy for Sensitive Groups |
| 55.5 | 125.4 | 151 | 200 | Unhealthy |
| 125.5 | 225.4 | 201 | 300 | Very Unhealthy |
| 225.5 | 325.4 | 301 | 500 | Hazardous |
If Cp is greater than the highest breakpoint (325.4 µg/m³), the calculation still uses the last segment’s slope. The final AQI value is then rounded to the nearest integer and capped at 500 if the clamp parameter is true (which it is by default in the get_sensor_data function).