ReLoad the saved data from the NB model run, which took 2.9 hours

load("~/DFS/kaggle/slow.RData")
# `WFinalFour` is the teams / ID table
# `nb_model` is the `mvglmmRank` model

Attach libraries

library(dplyr)

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
library(tibble)
library(mvglmmRank)
Loading required package: Matrix
library(knitr)

Utility function for parsing a row of mvglmmRank::game.pred output

.get_number <- function(text)
  as.numeric(sub(pattern = "^.*: ", replacement = "", text))

Make a tibble of the six possible games

predictions <- tibble()
for (irow in 1:3) {
  for (jrow in (irow + 1):4) {
    team1_id <- as.character(WFinalFour$TeamID[irow])
    team2_id <- as.character(WFinalFour$TeamID[jrow])
    game_prediction <- capture.output(game.pred(
      nb_model, team1_id, team2_id, neutral.site = TRUE))
    pred_score_1 <- .get_number(game_prediction[2])
    pred_score_2 <- .get_number(game_prediction[3])
    spread_1 <- pred_score_2 - pred_score_1
    spread_2 <- pred_score_1 - pred_score_2
    over_under <- pred_score_1 + pred_score_2
    win_prob_1 <- .get_number(game_prediction[9])
    win_prob_2 <- 1 - win_prob_1
    
    predictions <- predictions %>% 
      bind_rows(tibble(
        team_1 = WFinalFour$TeamName[irow],
        team_2 = WFinalFour$TeamName[jrow],
        pred_score_1,
        pred_score_2,
        spread_1,
        spread_2,
        over_under,
        win_prob_1,
        win_prob_2
      ))
  }
}

kable(predictions)
team_1 team_2 pred_score_1 pred_score_2 spread_1 spread_2 over_under win_prob_1 win_prob_2
Baylor Connecticut 70.41 68.85 -1.56 1.56 139.26 0.561 0.439
Baylor Notre Dame 74.77 74.77 0.00 0.00 149.54 0.509 0.491
Baylor Oregon 75.61 71.40 -4.21 4.21 147.01 0.660 0.340
Connecticut Notre Dame 76.48 78.04 1.56 -1.56 154.52 0.448 0.552
Connecticut Oregon 77.32 74.68 -2.64 2.64 152.00 0.602 0.398
Notre Dame Oregon 83.24 79.03 -4.21 4.21 162.27 0.652 0.348

Session info

sessionInfo()
R version 3.5.3 (2019-03-11)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: ArcoLinuxD

Matrix products: default
BLAS: /usr/lib/libopenblasp-r0.3.5.so
LAPACK: /usr/lib/liblapack.so.3.8.0

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] knitr_1.22       mvglmmRank_1.2-2 Matrix_1.2-17    tibble_2.1.1    
[5] dplyr_0.8.0.1   

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.1        rstudioapi_0.10   magrittr_1.5      MASS_7.3-51.1    
 [5] tidyselect_0.2.5  lattice_0.20-38   R6_2.4.0          rlang_0.3.3      
 [9] highr_0.8         tools_3.5.3       grid_3.5.3        packrat_0.5.0    
[13] xfun_0.5          htmltools_0.3.6   assertthat_0.2.1  digest_0.6.18    
[17] numDeriv_2016.8-1 crayon_1.3.4      purrr_0.3.2       glue_1.3.1       
[21] evaluate_0.13     rmarkdown_1.12    compiler_3.5.3    pillar_1.3.1     
[25] pkgconfig_2.0.2  
LS0tCnRpdGxlOiAiR29vZ2xlIENsb3VkICYgTkNBQcKuIE1MIENvbXBldGl0aW9uIDIwMTktV29tZW4ncyBGaW5hbCBGb3VyIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIyBSZUxvYWQgdGhlIHNhdmVkIGRhdGEgZnJvbSB0aGUgYE5CYCBtb2RlbCBydW4sIHdoaWNoIHRvb2sgMi45IGhvdXJzCmBgYHtyfQpsb2FkKCJ+L0RGUy9rYWdnbGUvc2xvdy5SRGF0YSIpCiMgYFdGaW5hbEZvdXJgIGlzIHRoZSB0ZWFtcyAvIElEIHRhYmxlCiMgYG5iX21vZGVsYCBpcyB0aGUgYG12Z2xtbVJhbmtgIG1vZGVsCmBgYAoKIyMgQXR0YWNoIGxpYnJhcmllcwpgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWJibGUpCmxpYnJhcnkobXZnbG1tUmFuaykKbGlicmFyeShrbml0cikKYGBgCiMjIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHBhcnNpbmcgYSByb3cgb2YgYG12Z2xtbVJhbms6OmdhbWUucHJlZGAgb3V0cHV0CmBgYHtyfQouZ2V0X251bWJlciA8LSBmdW5jdGlvbih0ZXh0KQogIGFzLm51bWVyaWMoc3ViKHBhdHRlcm4gPSAiXi4qOiAiLCByZXBsYWNlbWVudCA9ICIiLCB0ZXh0KSkKYGBgCgojIyBNYWtlIGEgdGliYmxlIG9mIHRoZSBzaXggcG9zc2libGUgZ2FtZXMKYGBge3J9CnByZWRpY3Rpb25zIDwtIHRpYmJsZSgpCmZvciAoaXJvdyBpbiAxOjMpIHsKICBmb3IgKGpyb3cgaW4gKGlyb3cgKyAxKTo0KSB7CiAgICB0ZWFtMV9pZCA8LSBhcy5jaGFyYWN0ZXIoV0ZpbmFsRm91ciRUZWFtSURbaXJvd10pCiAgICB0ZWFtMl9pZCA8LSBhcy5jaGFyYWN0ZXIoV0ZpbmFsRm91ciRUZWFtSURbanJvd10pCiAgICBnYW1lX3ByZWRpY3Rpb24gPC0gY2FwdHVyZS5vdXRwdXQoZ2FtZS5wcmVkKAogICAgICBuYl9tb2RlbCwgdGVhbTFfaWQsIHRlYW0yX2lkLCBuZXV0cmFsLnNpdGUgPSBUUlVFKSkKICAgIHByZWRfc2NvcmVfMSA8LSAuZ2V0X251bWJlcihnYW1lX3ByZWRpY3Rpb25bMl0pCiAgICBwcmVkX3Njb3JlXzIgPC0gLmdldF9udW1iZXIoZ2FtZV9wcmVkaWN0aW9uWzNdKQogICAgc3ByZWFkXzEgPC0gcHJlZF9zY29yZV8yIC0gcHJlZF9zY29yZV8xCiAgICBzcHJlYWRfMiA8LSBwcmVkX3Njb3JlXzEgLSBwcmVkX3Njb3JlXzIKICAgIG92ZXJfdW5kZXIgPC0gcHJlZF9zY29yZV8xICsgcHJlZF9zY29yZV8yCiAgICB3aW5fcHJvYl8xIDwtIC5nZXRfbnVtYmVyKGdhbWVfcHJlZGljdGlvbls5XSkKICAgIHdpbl9wcm9iXzIgPC0gMSAtIHdpbl9wcm9iXzEKICAgIAogICAgcHJlZGljdGlvbnMgPC0gcHJlZGljdGlvbnMgJT4lIAogICAgICBiaW5kX3Jvd3ModGliYmxlKAogICAgICAgIHRlYW1fMSA9IFdGaW5hbEZvdXIkVGVhbU5hbWVbaXJvd10sCiAgICAgICAgdGVhbV8yID0gV0ZpbmFsRm91ciRUZWFtTmFtZVtqcm93XSwKICAgICAgICBwcmVkX3Njb3JlXzEsCiAgICAgICAgcHJlZF9zY29yZV8yLAogICAgICAgIHNwcmVhZF8xLAogICAgICAgIHNwcmVhZF8yLAogICAgICAgIG92ZXJfdW5kZXIsCiAgICAgICAgd2luX3Byb2JfMSwKICAgICAgICB3aW5fcHJvYl8yCiAgICAgICkpCiAgfQp9CgprYWJsZShwcmVkaWN0aW9ucykKYGBgCgojIyBTZXNzaW9uIGluZm8KYGBge3J9CnNlc3Npb25JbmZvKCkKYGBgCg==