# Methods for three HomeRiskIQ weather record analyses

## Source freeze and reproduction

The primary input is NOAA NCEI `StormEvents_details-ftp_v1.0_d2025_c20260819.csv.gz`, retrieved anew on October 31, 2026. `d2025` is the data year; `c20260819` is the archive creation date. The live directory retrieved in the same freeze lists this as its 2025 details file. We use the complete 2025 calendar-year archive rather than the partially available 2026 file. The archive has 72,360 rows and 72,360 unique EVENT_ID values. A record is the unit of analysis unless explicitly identified otherwise. Neither rows nor EPISODE_ID values automatically represent distinct physical storms.

`source-manifest.json` gives exact URLs, retrieval start/end UTC, byte lengths and SHA256 hashes. Paths resolve from the manifest's directory. `raw/Storm-Data-Bulk-csv-Format.pdf` is the downloaded source schema, with `raw/schema.txt` as its extracted text. `results/schema_observed.json` records all observed column names, year values and geography types. File-level hashes protect the frozen inputs; they do not prove every source observation is correct or complete. Source revisions after this freeze may change results.

Run from any working directory with Python 3.9 or newer:

```
python3 /path/to/home-b/scripts/reproduce.py
```

This uses only the Python standard library, verifies frozen-source hashes, checks EVENT_ID uniqueness and regenerates all CSV and JSON analysis outputs. It does not access the network or any private contacts/audit file. The separate `freeze_sources.py` is an explicit new-freeze utility, not a normal reproduction command. Do not rerun it to audit this snapshot. `make_charts.py` requires matplotlib 3.6 or newer; run it after reproduction to render original PNG/SVG figures from the derived tables. Numerical output is independent of plotting-library availability. No script depends on files outside this package.

## Selection family and uncertainty

The work began with a national/state screen of the current archive. `flood_selection_screen.csv` retains every state-or-territory/event-type group with at least one Flood or Flash Flood record, including zero-interval and positive-only sensitivity results. `selection_universe.json` records the overall tornado and winter subsets. The final cases were purposively selected for different data questions: cross-boundary identity in a documented Kentucky tornado, timestamp sensitivity in Arkansas flood reports, and within-county geography in Grant County winter reports. They are exploratory illustrations, not random samples, a prespecified test family, a ranking of risk, or evidence of national prevalence. No sampling confidence intervals are estimated. Administrative reporting coverage, category choices, missing context, source revisions and geographic aggregation are the principal uncertainties; adding a sampling margin of error would not resolve them.

## Kentucky tornado identity

Selected EVENT_IDs are 1263465 (Russell County, state 21 / county 207), 1292921 (Pulaski, 21/199), and 1292941 (Laurel, 21/125), all CZ_TYPE=C and EVENT_TYPE=Tornado. These are a deliberately identified case, not the result of automatically merging all similar records. The physical identification comes from the official NWS Jackson event account and its linked May 22 2025 1900 UTC public information statement. The statement is agency-authored primary evidence hosted by the Iowa Environmental Mesonet, not an IEM-authored survey.

The reproduction checks that Russell's TOR_OTHER_CZ_STATE/FIPS/NAME and TOR_OTHER_WFO point to Pulaski, and Pulaski's point to Laurel. Both boundaries also have equal end/begin times after converting the recorded standard-time offsets. Russell uses CST-6; Pulaski and Laurel use EST-5. UTC = recorded local time minus the signed source offset. No daylight-saving correction is applied on top of those explicit standard-time offsets. Each date string is independently checked against BEGIN/END_YEARMONTH, DAY and TIME before calculations. The full UTC chronology is May 17 02:27 to 03:56, with 8-, 49- and 32-minute record intervals. This is 89 elapsed minutes between endpoints, not 89 minutes of home exposure or proof of uninterrupted ground contact. The survey notes a possible brief early lift.

Three records have two EPISODE_ID values and two WFO codes. No state-wide tornado count is estimated. Continuation fields are not assumed complete everywhere, and a blank final continuation field is not by itself used to infer a physical endpoint. The current source segment-length fields sum to 60.08 miles; the May 22 preliminary survey says 59.92 miles. The 0.16-mile difference is unreconciled. We do not identify its cause, replace one product with the other, label 60.08 an official survey total, or use the values to draw a parcel-level track. Source EF classifications are preserved as segment classifications, never applied to every location in a county. The current bulk schema's listed wind-speed ranges are not used.

## Arkansas timestamp sensitivity

Universe: every record in the source with STATE_FIPS=5 and EVENT_TYPE exactly Flood or Flash Flood: 258 rows, all CZ_TYPE=C. No minimum damage, fatality, report-source or duration threshold selects them. We count each unique EVENT_ID once. Flood and Flash Flood are separate reporting categories, not interchangeable hazard measures.

For each row, encoded minutes = END_DATE_TIME minus BEGIN_DATE_TIME after explicit `%d-%b-%y %H:%M:%S` parsing. Cross-midnight and cross-month dates are retained. Separate numeric timestamp fields must match the parsed date strings. All 258 selected rows have parseable timestamp fields and no negative interval. Empty strings are not converted to zero. A stored equal pair is classified as a zero encoded interval, not automatically as missing, incorrect, instant flooding or a documented sentinel. The provided schema does not specify an equal-time sentinel; we have no row-specific confirmation of why those pairs were entered. This limitation is part of the finding, not a resolved data-cleaning decision.

Flash Flood: 84/144 equal pairs=58.3333%; 60 positive pairs; all-row median 0 minutes; positive-only median 121.5 minutes. Flood: 8/114 equal pairs=7.0175%; 106 positive pairs; all-row median 3,472 minutes (57.8667 hours); positive-only median 4,518.5 minutes (75.3083 hours). The positive-only calculations are a selection-sensitivity exercise, not corrected event-duration estimates. Every denominator is records, never homes, population, inundated area or independent floods. All 84 Flash Flood equal pairs have WFO=LZK; LZK contributes 86 Flash Flood rows overall. Retain all other offices in `ar_flood_wfo_sensitivity.csv`; no causal explanation of office differences is asserted. Example narratives are EVENT_ID 1237319 and 1276670. They substantiate reported impacts, not durations. The NWS flash-flood definition concerns onset within six hours of a triggering event; it does not cap total inundation duration.

## Grant County forecast zones

Universe: STATE_FIPS=54, CZ_TYPE=Z, CZ_FIPS in{501,502}, EVENT_TYPE in{Blizzard,Heavy Snow,Ice Storm,Lake-Effect Snow,Winter Storm,Winter Weather}. All 35 selected records have WFO=LWX. These are WVZ501 Western Grant and WVZ502 Eastern Grant, named in the NWS forecast selector. Civil Grant County FIPS 54023 is contextual only; zone 501/502 are not county FIPS codes. No polygon overlay, area normalization, household denominator or address assignment is performed. Any future address-specific application would require correct point-to-zone geography and boundary-version validation.

The chosen six categories exclude Cold/Wind Chill, Extreme Cold/Wind Chill, Frost/Freeze and other categories. Calendar-year 2025 includes parts of two winter seasons. Preserve the six-category universe, including zero-count categories; a missing category is not proof of no weather. There are 26 western records from 25 episode IDs and 9 eastern records from 9 episode IDs. The 9 eastern episode IDs are also present in the western set. Episode membership is a reporting grouping, not a physical-storm deduplication. We do not sum zone counts and label the result county storms.

Paired examples: episode 198329, EVENT_ID 1226337 west Ice Storm and 1226342 east Winter Weather; episode 198585, EVENT_ID 1227810 west Winter Storm and 1227805 east Winter Weather. Eastern EVENT_NARRATIVE is blank in these examples; shared EPISODE_NARRATIVE remains available. Blank text is not evidence of no impacts. The entire West Virginia six-category screening universe contains one CZ_TYPE=C Heavy Snow row in Upshur, preserved in the audit output rather than silently normalized or joined into Grant. No inference about why that row is county-coded is made.

## Appropriate use

The deliverables explain reporting identity, temporal interpretation and spatial resolution. They do not estimate future damage, climate trends, insurance needs, a home's probability of loss or the effectiveness of specific protective purchases. Use current local warnings for current conditions. Source-record histories are not a substitute for site-specific evidence.
