This file uses The Prediction Tracker data to create custom offensive and defensive power ratings. Subscribe to my Substack newsletter, Monte Carlo Football Picks, to learn more about the logic behind these calculations.

Load Packages

library(tidyverse)

Against the spread and over/under predictions are downloaded from The Prediction Tracker into csv files for loading into R.

lines <- read_csv("Week 07/inputs/line_pred.csv")
totals <- read_csv("Week 07/inputs/total_pred.csv")
names <- read_csv("Week 07/inputs/names2.csv")

Format data and remove incomplete data

lines2 <- lines %>%
  select(road:lineburd) %>%
  pivot_longer(cols = linekasulis:lineburd, names_to = "system", values_to = "line") %>%
  drop_na()

head(lines2, 10)

Create list of systems and randomly select 10 to be used in the calculations of power ratings

set.seed(12)

systems <- lines2 %>%
  select(system) %>%
  distinct() %>%
  slice_sample(n = 10) %>%
  mutate(include = 1)

systems

Filter lines2 data on randomly selected systems

lines3 <- lines2 %>%
  left_join(systems, by = "system") %>%
  drop_na() %>%
  group_by(road, home) %>%
  summarise(ave_line = mean(line))
`summarise()` has grouped output by 'road'. You can override using the `.groups` argument.
head(lines3, 5)

Repeat process with Totals data

totals2 <- totals %>%
  select(road, home, totmass:totkerns) %>%
  pivot_longer(cols = totmass:totkerns, names_to = "system", values_to = "total") %>%
  drop_na()

set.seed(13)

systems2 <- totals2 %>%
  select(system) %>%
  distinct() %>%
  slice_sample(n = 10) %>%
  mutate(include = 1)

totals3 <- totals2 %>%
  left_join(systems2, by = "system") %>%
  drop_na() %>%
  group_by(road, home) %>%
  summarise(ave_tot = mean(total))
`summarise()` has grouped output by 'road'. You can override using the `.groups` argument.
head(totals3, 5)

Combine lines3 and totals3 data, calculate score (ratings)

summary <- lines3 %>%
  select(road, ave_line) %>%
  left_join(totals3, by = "road") %>%
  mutate(road_pf = (ave_tot/2) - (ave_line/2), 
         home_pf = (ave_tot/2) + (ave_line/2)) %>%
  ungroup()

road <- summary %>%
  mutate(Team = road, off_rating = road_pf, def_rating = home_pf) %>%
  select(Team, off_rating, def_rating)

home <- summary %>%
  mutate(Team = home, off_rating = home_pf, def_rating = road_pf) %>%
  select(Team, off_rating, def_rating)

randexp_ratings <- road %>%
  bind_rows(home) %>%
  left_join(names, by = "Team") %>%
  select(Name, off_rating, def_rating) %>%
  rename("Team" = Name)

write.csv(randexp_ratings, "Week 07/randexp_ratings.csv")

randexp_ratings
LS0tDQp0aXRsZTogIlJhbmRvbSBFeHBlcnQgUmF0aW5nczogMjAyMSBORkwgV2VlayAwNyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCg0KVGhpcyBmaWxlIHVzZXMgW1RoZSBQcmVkaWN0aW9uIFRyYWNrZXJdKGh0dHBzOi8vd3d3LnRoZXByZWRpY3Rpb250cmFja2VyLmNvbS8pIGRhdGEgdG8gY3JlYXRlIGN1c3RvbSBvZmZlbnNpdmUgYW5kIGRlZmVuc2l2ZSBwb3dlciByYXRpbmdzLiBTdWJzY3JpYmUgdG8gbXkgU3Vic3RhY2sgbmV3c2xldHRlciwgW01vbnRlIENhcmxvIEZvb3RiYWxsIFBpY2tzXShodHRwczovL21jZnAuc3Vic3RhY2suY29tLyksIHRvIGxlYXJuIG1vcmUgYWJvdXQgdGhlIGxvZ2ljIGJlaGluZCB0aGVzZSBjYWxjdWxhdGlvbnMuDQoNCg0KDQpMb2FkIFBhY2thZ2VzDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KYGBgDQoNCg0KDQpBZ2FpbnN0IHRoZSBzcHJlYWQgYW5kIG92ZXIvdW5kZXIgcHJlZGljdGlvbnMgYXJlIGRvd25sb2FkZWQgZnJvbSBUaGUgUHJlZGljdGlvbiBUcmFja2VyIGludG8gY3N2IGZpbGVzIGZvciBsb2FkaW5nIGludG8gUi4NCmBgYHtyfQ0KbGluZXMgPC0gcmVhZF9jc3YoIldlZWsgMDcvaW5wdXRzL2xpbmVfcHJlZC5jc3YiKQ0KdG90YWxzIDwtIHJlYWRfY3N2KCJXZWVrIDA3L2lucHV0cy90b3RhbF9wcmVkLmNzdiIpDQpuYW1lcyA8LSByZWFkX2NzdigiV2VlayAwNy9pbnB1dHMvbmFtZXMyLmNzdiIpDQoNCmBgYA0KDQoNCg0KDQpGb3JtYXQgZGF0YSBhbmQgcmVtb3ZlIGluY29tcGxldGUgZGF0YQ0KYGBge3J9DQpsaW5lczIgPC0gbGluZXMgJT4lDQogIHNlbGVjdChyb2FkOmxpbmVidXJkKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBsaW5la2FzdWxpczpsaW5lYnVyZCwgbmFtZXNfdG8gPSAic3lzdGVtIiwgdmFsdWVzX3RvID0gImxpbmUiKSAlPiUNCiAgZHJvcF9uYSgpDQoNCmhlYWQobGluZXMyLCAxMCkNCmBgYA0KDQoNCg0KQ3JlYXRlIGxpc3Qgb2Ygc3lzdGVtcyBhbmQgcmFuZG9tbHkgc2VsZWN0IDEwIHRvIGJlIHVzZWQgaW4gdGhlIGNhbGN1bGF0aW9ucyBvZiBwb3dlciByYXRpbmdzDQpgYGB7cn0NCnNldC5zZWVkKDEyKQ0KDQpzeXN0ZW1zIDwtIGxpbmVzMiAlPiUNCiAgc2VsZWN0KHN5c3RlbSkgJT4lDQogIGRpc3RpbmN0KCkgJT4lDQogIHNsaWNlX3NhbXBsZShuID0gMTApICU+JQ0KICBtdXRhdGUoaW5jbHVkZSA9IDEpDQoNCnN5c3RlbXMNCmBgYA0KDQoNCg0KRmlsdGVyIGxpbmVzMiBkYXRhIG9uIHJhbmRvbWx5IHNlbGVjdGVkIHN5c3RlbXMNCmBgYHtyfQ0KbGluZXMzIDwtIGxpbmVzMiAlPiUNCiAgbGVmdF9qb2luKHN5c3RlbXMsIGJ5ID0gInN5c3RlbSIpICU+JQ0KICBkcm9wX25hKCkgJT4lDQogIGdyb3VwX2J5KHJvYWQsIGhvbWUpICU+JQ0KICBzdW1tYXJpc2UoYXZlX2xpbmUgPSBtZWFuKGxpbmUpKQ0KDQpoZWFkKGxpbmVzMywgNSkNCmBgYA0KDQoNCg0KUmVwZWF0IHByb2Nlc3Mgd2l0aCBUb3RhbHMgZGF0YQ0KYGBge3J9DQp0b3RhbHMyIDwtIHRvdGFscyAlPiUNCiAgc2VsZWN0KHJvYWQsIGhvbWUsIHRvdG1hc3M6dG90a2VybnMpICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IHRvdG1hc3M6dG90a2VybnMsIG5hbWVzX3RvID0gInN5c3RlbSIsIHZhbHVlc190byA9ICJ0b3RhbCIpICU+JQ0KICBkcm9wX25hKCkNCg0Kc2V0LnNlZWQoMTMpDQoNCnN5c3RlbXMyIDwtIHRvdGFsczIgJT4lDQogIHNlbGVjdChzeXN0ZW0pICU+JQ0KICBkaXN0aW5jdCgpICU+JQ0KICBzbGljZV9zYW1wbGUobiA9IDEwKSAlPiUNCiAgbXV0YXRlKGluY2x1ZGUgPSAxKQ0KDQp0b3RhbHMzIDwtIHRvdGFsczIgJT4lDQogIGxlZnRfam9pbihzeXN0ZW1zMiwgYnkgPSAic3lzdGVtIikgJT4lDQogIGRyb3BfbmEoKSAlPiUNCiAgZ3JvdXBfYnkocm9hZCwgaG9tZSkgJT4lDQogIHN1bW1hcmlzZShhdmVfdG90ID0gbWVhbih0b3RhbCkpDQoNCmhlYWQodG90YWxzMywgNSkNCmBgYA0KDQoNCg0KQ29tYmluZSBsaW5lczMgYW5kIHRvdGFsczMgZGF0YSwgY2FsY3VsYXRlIHNjb3JlIChyYXRpbmdzKQ0KDQpgYGB7cn0NCnN1bW1hcnkgPC0gbGluZXMzICU+JQ0KICBzZWxlY3Qocm9hZCwgYXZlX2xpbmUpICU+JQ0KICBsZWZ0X2pvaW4odG90YWxzMywgYnkgPSAicm9hZCIpICU+JQ0KICBtdXRhdGUocm9hZF9wZiA9IChhdmVfdG90LzIpIC0gKGF2ZV9saW5lLzIpLCANCiAgICAgICAgIGhvbWVfcGYgPSAoYXZlX3RvdC8yKSArIChhdmVfbGluZS8yKSkgJT4lDQogIHVuZ3JvdXAoKQ0KDQpyb2FkIDwtIHN1bW1hcnkgJT4lDQogIG11dGF0ZShUZWFtID0gcm9hZCwgb2ZmX3JhdGluZyA9IHJvYWRfcGYsIGRlZl9yYXRpbmcgPSBob21lX3BmKSAlPiUNCiAgc2VsZWN0KFRlYW0sIG9mZl9yYXRpbmcsIGRlZl9yYXRpbmcpDQoNCmhvbWUgPC0gc3VtbWFyeSAlPiUNCiAgbXV0YXRlKFRlYW0gPSBob21lLCBvZmZfcmF0aW5nID0gaG9tZV9wZiwgZGVmX3JhdGluZyA9IHJvYWRfcGYpICU+JQ0KICBzZWxlY3QoVGVhbSwgb2ZmX3JhdGluZywgZGVmX3JhdGluZykNCg0KcmFuZGV4cF9yYXRpbmdzIDwtIHJvYWQgJT4lDQogIGJpbmRfcm93cyhob21lKSAlPiUNCiAgbGVmdF9qb2luKG5hbWVzLCBieSA9ICJUZWFtIikgJT4lDQogIHNlbGVjdChOYW1lLCBvZmZfcmF0aW5nLCBkZWZfcmF0aW5nKSAlPiUNCiAgcmVuYW1lKCJUZWFtIiA9IE5hbWUpDQoNCndyaXRlLmNzdihyYW5kZXhwX3JhdGluZ3MsICJXZWVrIDA3L3JhbmRleHBfcmF0aW5ncy5jc3YiKQ0KDQpyYW5kZXhwX3JhdGluZ3MNCmBgYA0KDQo=