What we tried
Every hour, on every subway line, the MTA might post an alert that says "delays" or "service suspended." We asked a simple question: can a computer look at what already happened and guess whether an alert like that is coming in the next hour?
We gave the computer only things it could know ahead of time: which line it is, what time it is, and how much trouble that line has had lately. Then we showed it 1,052,867 hours of history, every line and every hour from 2021-01-01 to 2026-04-27, and let it look for patterns.
The rule we asked it to learn: a line-hour counts as a "bad hour" if an unplanned delay or suspension alert for that line starts inside the next 60 minutes. Planned work, like weekend track repairs, does not count.
To be fair, we tested it on months it had never seen. Everything below comes from that test: the last 15% of the timeline, starting in July 2025.
Try the model
This is the actual model, running in your browser. Move the three controls and watch the train.
Starts at the line's real average. Dragging it changes the line's recent alert count, its 30-day disruption rate, and how long since its last problem, all together.
What we found
It catches most bad hours…
When we used the model's alarm line, it noticed of the real disruptions in the test months. To catch that many by guessing, you'd have to flag most of the day.
Out of 100 real disruptions, the dark squares are the ones the model flagged ahead of time.
…but it cries wolf a lot.
Of every 100 hours the model raised an alarm for, only about turned into a real disruption. That's better than the you'd get by picking hours at random, but not by enough to send riders alerts.
Out of 100 alarms, the dark squares are the ones that were right.
Mostly it just remembers who's been having a bad month.
We gave the A train two versions of the same hour. One used its real recent history. The other pretended its history was the same as an average line. The score fell from the alarm zone to the middle of the meter. The line's name matters a little. What happened to it lately matters more.
Why we wouldn't put this in an app
- Three out of four alarms would be false. People would learn to ignore it within a week.
- The score is a ranking, not a promise. A 0.60 doesn't mean "60% chance." It means "riskier than a 0.40."
- It only knows about alerts. The MTA posts one when something has already gone wrong somewhere, so a stalled train that never gets an alert is invisible to it.
- The subway changes. The pattern it learned from 2021 to 2024 still worked in 2025, but nothing guarantees it holds next year.
What it is good for: helping someone decide where to look first. That's a smaller job than predicting the future, and one it can actually do.
Want the details?
The full research brief has the exact numbers, the charts, every threshold, and the sliders for all eighteen inputs. The code rebuilds everything from the public MTA data with one command.