Reynold's Fantasy Wrap
Fantasy Football · Half-PPR

How the model thinks · part 2

Who Actually Has the Ball

The model doesn't start with points. It starts with who is getting the work, how that has moved over the last few weeks, and how little it should trust the yards that came with it. Here is that layer, the idea I tested and left out, and what to do with it on a Sunday morning.

In 2023 I drafted Miles Sanders. Carolina had just paid him, he was coming off 1,269 yards in Philadelphia, and I had him penciled in as a starter for the year. Week 1 he got 18 carries. Fine. Week 2, 14. Week 3, 9. Week 4, Chuba Hubbard out-carried him 14 to 13, and from there it was Hubbard’s backfield. Sanders finished with 129 carries, 41st among running backs, at 3.35 a carry. Hubbard had 238 (all nflverse, 2023).

Here’s the part I’m not proud of. I held him through most of that. Not because the box score said to, the box score was ugly, but because I was still reading the contract. He was supposed to be the guy. The carries were telling me by week 3 that he wasn’t, and the carries were right.

That’s the second layer of how this thing works, and it’s the layer I trust most: before a single point is projected, the model has to decide who is actually getting the ball.

Opportunities first, points last

The first article was about the stats I trust, and the short version was targets and carries over yards and touchdowns. The model takes that literally. It counts opportunities: carries for a back, targets for a receiver, throws plus runs for a quarterback. Each one is weighted by where it happened, because a carry from the two-yard line and a carry from your own thirty are not the same asset. A goal-line back with twelve touches can be worth more than a change-of-pace back with eighteen, and the model knows it before the touchdown column does.

Then it asks how that opportunity has been moving. Recent games count more than old ones. A game from five weeks ago carries about half the weight of last week’s, and last season fades out quickly once a player has a few games this year. That’s the Sanders lesson written into the code. By week 4 of 2023 the model would have had Hubbard’s carries climbing and Sanders’ falling, and it would have moved on while I was still waiting for the version of him I’d drafted.

I used to think of this as looking at a span of games instead of one box score. It’s the same idea. A single Sunday has too much in it, the score, the weather, one drive that ended in a fumble. Four Sundays tell you what the coach thinks of the player.

The part it barely trusts

What the model does with yards and touchdowns is where people push back, so I’ll be plain about it. It pulls efficiency hard toward the league average. A back running 5.5 a carry gets projected closer to 4.3 than to 5.5. A receiver catching 80 percent of his targets gets treated like someone catching closer to the league rate. The touches are trusted; what the player did with them is not, or not much.

That isn’t a philosophy. It’s what two seasons of backtesting said. Efficiency this month does a poor job of predicting efficiency next month. Volume this month predicts volume next month very well. When we let the model trust efficiency more, it got worse at ordering players. So it doesn’t.

The cleanest example I’ve ever seen of why is Diontae Johnson in 2022. He was targeted 147 times, sixth most of any receiver in the league. He caught 86 of them for 882 yards. He scored zero touchdowns. Not one, all season, the only receiver in the top twenty for targets without a score. He had eight touchdowns the year before and five the year after (nflverse, 2021 to 2023). If you were ranking him on his box score in 2022 he was a disaster. If you were ranking him on his opportunity he was a top-ten receiver who was owed a correction, and the correction came.

Zero touchdowns on 147 targets is a coin landing on tails fifteen times. It happens. It doesn’t mean the coin is broken.

Trust the plan, watch the trend

I’ll admit this only feels wrong when it doesn’t turn into points, and then it feels very wrong. Quentin Johnston this year is the case my gut keeps bringing up. Through three weeks he has 17 targets, which is real work for a third receiver, and 6 catches for 64 yards on them (nflverse, 2026). He keeps getting the ball thrown his way and keeps not turning it into anything. As a fan I want to write him off. His coach might be getting there too.

What I’ve come around to is that the model and my gut are actually pointing the same direction here, just at different speeds. Regressing his catch rate to the league average is the machine’s version of “trust the plan but keep an eye on it.” It doesn’t throw out his targets, because targets are the signal. It just refuses to believe three games of drops tell you much about the next three. If the targets dry up, that’s the trend that matters, and the model will see it in the volume before I see it in the box score. If the targets stay and the catches stay ugly for two more months, then you’ve learned something about the player, and by then the model has too.

The trend to watch is always the touches. The points follow or they don’t, and mostly they follow.

New toys and job changes

Here’s where I know my own weakness. When a starter goes down and a rookie takes over, I want to go all in. New toy. And I also know that one fumble later the coach puts the veteran back in because he can pass block and hold onto the ball, and the rookie is in the doghouse for a month.

The model takes a position on this and I’ve mostly made peace with it. A player with no games on record gets his depth-chart slot’s usual volume. If a back who was getting 20 carries goes down and the rookie is listed as the starter, the model projects him something like the starter’s workload, not a rookie discount. That was my instinct too when I said it out loud: if the job is there, expect 15 carries. The doghouse is a story we tell after the fact, and the backtests say projecting the job beats projecting the fear.

Where this actually breaks is not the rookie. It’s knowing who has the job at all. The depth charts this model reads are a guess about that, and twice already this season the guess has been wrong. Drew Lock was starting in Seattle while Sam Darnold sat and the chart still had Darnold first. Case Keenum was named Chicago’s starter on a Saturday, and every depth chart I could find still had Tyson Bagent ahead of him on Sunday. He wasn’t on my quarterback list. He started. The fix was boring: when a starter is ruled out, keep the next two men, each ranked on his own games, and let the reader see both. Opportunity is the whole model, so the model can’t afford to be wrong about whose opportunity it is.

The idea I tested and left out

There was a smarter-sounding version of all this that I really wanted to work.

Instead of projecting a player from his own history, project him from the job. Carolina’s lead back gets a certain number of carries under this coach no matter who he is. Kansas City’s number one receiver gets a certain share of targets. So when a new player steps into the slot, give him the slot’s numbers, not his own thin ones. I called it job volume, and the logic is exactly the Sanders logic: the coach’s habit is the real signal, and the name on the jersey is noise.

It got tested the way everything here gets tested, on two full seasons it had never seen, against the model as it was. And it half worked. For quarterbacks with almost no history, the ones the idea was built for, the projection error dropped a lot, from about 6.6 points a game to about 5.2 on players with no prior season at all. But for everyone else, running backs, receivers, tight ends with a real history of their own, it got slightly worse. And on the thing the site actually grades, how well the list orders players, the change was inside the noise both years. My rule is that a change has to clearly help in both seasons or it doesn’t go in. This didn’t, so it didn’t.

It lives in the code with the switch off. The one place it’s used is narrow: a player with no games at all gets his slot’s volume instead of a made-up floor, which is the rookie rule above. That’s the honest version of a good idea that wasn’t good enough. I’d rather tell you about it than pretend the model was born knowing what to ignore.

What to actually do on Sunday morning

My advice goes a couple of ways, and it’s less about the model than about you.

If you have a set of rankings you trust, use them. If player one is ranked three spots higher than player two and you’re not sure, start player one. When two players are that close the difference is a coin flip, and the rankings have already done their best guess at how that game goes. Take the flip. Overthinking it doesn’t make you right more often, it just makes you miserable by Sunday night, and I want to enjoy game day, not sit there hating a decision I agonized over.

What I’m really describing is choosing a process. Mine is rooted in usage, the touches and how they’re trending, and a list built on the same thing. If I stay consistent with it every week, I know what I’m trusting. Don’t look back. The one exception is if the process starts costing you, week after week, on the same kind of call. Then it’s not bad luck anymore, it’s a trend, and trends are the thing this whole article is about. That’s when you reassess.

Next in this series: target share and carries specifically, what the model does with them, and why a receiver’s share of his team’s targets matters more than the raw number.

Sources: player and team statistics from nflverse (2021 to 2026 seasons). Model parameters and backtest results from this site’s model log, published on the methodology page.