Skip to content

[BUG] <title> EP on kickoff events is outdated (for 2024 and 2025) #555

@TheMathNinja

Description

@TheMathNinja

Is there an existing issue for this?

  • I have searched the existing issues

Have you installed the latest development version of the package(s) in question?

  • I have installed the latest development version of the package.

If this is a data issue, have you tried clearing your nflverse cache?

I have cleared my nflverse cache and the issue persists.

What version of the package do you have?

[1] ‘5.1.0.9008’

Describe the bug

Kickoff EP is correctly calibrated up through 2023 (such that avg EPA on kickoffs is ~0), but there was no re-calibration for the new kickoff rules in 2024-2025, resulting in average kickoff EPA ~0.252 in those seasons.

Reprex

kickoff_ep_epa_by_season <- nflreadr::load_pbp(2021:2025) %>%
  filter(
    play_type == "kickoff",
    !is.na(ep),
    !is.na(epa)
  ) %>%
  group_by(season) %>%
  summarise(
    n        = n(),
    mean_ep  = round(mean(ep), 4),
    mean_epa = round(mean(epa), 4),
    .groups  = "drop"
  ) %>%
  arrange(desc(season))

> kickoff_ep_epa_by_season
# A tibble: 5 × 4
  season     n mean_ep mean_epa
   <int> <int>   <dbl>    <dbl>
1   2025  2636    1.09   0.253 
2   2024  2629    1.09   0.251 
3   2023  2561    1.09  -0.0026
4   2022  2544    1.09   0.0009
5   2021  2602    1.08  -0.0306

Expected Behavior

I expect EPA to be ~0 for all years (and therefore EP in 2024 and 2025 to be ~1.34). There' aslo an argument for 2024 and 2025 to be calibrated separately due to the touchback rule change between the two years, though it's scales of magnitute smaller than the 2023-24 change.

It's worth considering a total recalibration of EPA considering this also reduces the value of scoring events relative to non-scoring events that result in change of possession (e.g. turnovers). In other words, if we previously considered a TD worth 6 + 0.95 - 1.09 = 5.86 net points, we should adjust it to 6 + 0.95 - 1.34 = 5.61 net points.

nflverse_sitrep

> nflverse_sitrep()
── System Info ────────────────────────────────────────────────────────────────────────────────────
• R version 4.5.2 (2025-10-31 ucrt) • Running under: Windows 11 x64 (build 26100)
── Package Status ─────────────────────────────────────────────────────────────────────────────────
   package  installed  cran        dev behind
1   nfl4th 1.0.4.9007 1.0.4 1.0.4.9007       
2 nflfastR 5.1.0.9008 5.1.0 5.1.0.9008       
3 nflplotR      1.6.0 1.6.0      1.6.0       
4 nflreadr 1.5.0.9001 1.5.0 1.5.0.9001       
5 nflseedR      2.0.2 2.0.2      2.0.2       
6 nflverse 1.0.3.9001 1.0.3 1.0.3.9001       
── Package Options ────────────────────────────────────────────────────────────────────────────────
• No options set for above packages
── Package Dependencies ───────────────────────────────────────────────────────────────────────────
• askpass     (1.2.1)       • httr         (1.4.7)   • scales      (1.4.0)    
• backports   (1.5.0)       • isoband      (0.3.0)   • snakecase   (0.11.1)   
• base64enc   (0.1-3)       • janitor      (2.2.1)   • stringi     (1.8.7)    
• bigD        (0.3.1)       • jquerylib    (0.1.4)   • stringr     (1.6.0)    
• bitops      (1.0-9)       • jsonlite     (2.0.0)   • sys         (3.4.3)    
• bslib       (0.9.0)       • juicyjuice   (0.1.0)   • tibble      (3.3.0)    
• cachem      (1.1.0)       • knitr        (1.51)    • tidyr       (1.3.2)    
• cli         (3.6.5)       • labeling     (0.4.3)   • tidyselect  (1.2.1)    
• commonmark  (2.0.0)       • lifecycle    (1.0.5)   • timechange  (0.3.0)    
• cpp11       (0.5.2)       • listenv      (0.10.0)  • tinytex     (0.58)     
• crayon      (1.5.3)       • litedown     (0.9)     • utf8        (1.2.6)    
• curl        (7.0.0)       • lubridate    (1.9.4)   • V8          (8.0.1)    
• data.table  (1.18.0)      • magick       (2.9.0)   • vctrs       (0.6.5)    
• digest      (0.6.39)      • magrittr     (2.0.4)   • viridisLite (0.4.2)    
• dplyr       (1.1.4)       • markdown     (2.0)     • withr       (3.0.2)    
• evaluate    (1.0.5)       • memoise      (2.0.1)   • xfun        (0.55)     
• farver      (2.1.2)       • mime         (0.13)    • xgboost     (3.1.2.1)  
• fastmap     (1.2.0)       • openssl      (2.3.4)   • xml2        (1.5.1)    
• fastrmodels (2.0.0.9000)  • parallelly   (1.45.0)  • yaml        (2.3.12)   
• fontawesome (0.5.3)       • pillar       (1.11.1)  • codetools   (0.2-20)   
• fs          (1.6.6)       • pkgconfig    (2.0.3)   • compiler    (4.5.2)    
• furrr       (0.3.1)       • progressr    (0.18.0)  • graphics    (4.5.2)    
• future      (1.68.0)      • proto        (1.0.0)   • grDevices   (4.5.2)    
• generics    (0.1.4)       • purrr        (1.0.4)   • grid        (4.5.2)    
• ggpath      (1.1.1)       • R6           (2.6.1)   • lattice     (0.22-7)   
• ggplot2     (4.0.1)       • rappdirs     (0.3.3)   • Matrix      (1.7-4)    
• globals     (0.18.0)      • RColorBrewer (1.1-3)   • methods     (4.5.2)    
• glue        (1.8.0)       • Rcpp         (1.1.0)   • mgcv        (1.9-3)    
• gsubfn      (0.7)         • reactable    (0.4.5)   • nlme        (3.1-168)  
• gt          (1.2.0)       • reactR       (0.6.1)   • parallel    (4.5.2)    
• gtable      (0.3.6)       • rlang        (1.1.6)   • splines     (4.5.2)    
• highr       (0.11)        • rmarkdown    (2.30)    • stats       (4.5.2)    
• hms         (1.1.4)       • rstudioapi   (0.17.1)  • tools       (4.5.2)    
• htmltools   (0.5.9)       • S7           (0.2.1)   • utils       (4.5.2)    
• htmlwidgets (1.6.4)       • sass         (0.4.10)    
───────────────────────────────────────────────────────────────────────────────────────────────────

Screenshots

Additional context

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    Offseason to-doSomething to add when season is over

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions