Created
April 18, 2015 03:56
-
-
Save jalapic/42a981856b24d99b0b36 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| ### NHL PLAYOFF SIM by jalapic | |
| library(dplyr) | |
| library(PlayerRatings) | |
| library(magrittr) | |
| #copy and paste initial ELO ratings from nhlelo shiny app | |
| ratings<- | |
| read.table(text=" | |
| 1 = NYR - 2310 | |
| 2 = STL - 2271 | |
| 3 = ANA - 2268 | |
| 4 = MIN - 2261 | |
| 5 = TBL - 2261 | |
| 6 = OTT - 2249 | |
| 7 = CBJ - 2247 | |
| 8 = WAS - 2246 | |
| 9 = VAN - 2246 | |
| 10 = MON - 2245 | |
| 11 = WIN - 2236 | |
| 12 = DAL - 2233 | |
| 13 = CHI - 2233 | |
| 14 = CGY - 2230 | |
| 15 = COL - 2219 | |
| 16 = NAS - 2210 | |
| 17 = NYI - 2207 | |
| 18 = LAK - 2203 | |
| 19 = DET - 2199 | |
| 20 = BOS - 2198 | |
| 21 = FLA - 2189 | |
| 22 = SJS - 2181 | |
| 23 = PIT - 2175 | |
| 24 = PHI - 2137 | |
| 25 = NJD - 2129 | |
| 26 = CAR - 2125 | |
| 27 = EDM - 2092 | |
| 28 = TOR - 2088 | |
| 29 = BUF - 2057 | |
| 30 = ARZ - 2056 | |
| ", header=F, stringsAsFactors=F) | |
| ratings %<>% select(V3,V5) | |
| colnames(ratings)<-c("team", "initial") | |
| bracket <- data.frame( | |
| team=c("MON", "OTT", "TBL", "DET", "NYR", "PIT", "WAS", "NYI", "STL","MIN", "NAS", "CHI", "ANA", "WIN", "VAN", "CGY"), | |
| r1 = rep(LETTERS[1:8], each=2), | |
| r2 = rep(LETTERS[1:4], each=4), | |
| r3 = rep(LETTERS[1:2], each=8), | |
| r4 = rep(LETTERS[1:1], each=16), | |
| stringsAsFactors=F | |
| ) | |
| bracket <- merge(bracket, ratings, by="team") %>% arrange(r1,r2,r3,r4) | |
| simresults<-NULL | |
| for(j in 1:5000){ | |
| ### round 1 | |
| r1sim <- bracket %$% split(., r1) | |
| round1<-NULL | |
| for(i in 1:length(r1sim)){ | |
| df0 <- r1sim[[i]] %>% select(Player=team, Rating=initial) %>% mutate(Games=0, Win=0, Draw=0, Loss=0, Lag=0) | |
| df1 <- getelo(df0) | |
| df2 <- getelo(df1$ratings) | |
| df3 <- getelo(df2$ratings) | |
| df4 <- getelo(df3$ratings) | |
| df5 <- getelo(df4$ratings) | |
| df6 <- getelo(df5$ratings) | |
| df7 <- getelo(df6$ratings) | |
| res <- rbind(df1$ratings, df2$ratings, df3$ratings, df4$ratings, df5$ratings, df6$ratings, df7$ratings) | |
| round1[[i]] <- res %>% filter(Win==4) %>% slice(which.min(Games)) | |
| } | |
| ### round 2 | |
| bracket2 <- do.call("rbind", round1) | |
| temp <- bracket %>% filter(team %in% bracket2$Player) | |
| temp$initial <- bracket2$Rating | |
| bracket2 <- temp | |
| r2sim <- bracket2 %$% split(., r2) | |
| round2 <- NULL | |
| for(i in 1:length(r2sim)){ | |
| df0 <- r2sim[[i]] %>% select(Player=team, Rating=initial) %>% mutate(Games=0, Win=0, Draw=0, Loss=0, Lag=0) | |
| df1 <- getelo(df0) | |
| df2 <- getelo(df1$ratings) | |
| df3 <- getelo(df2$ratings) | |
| df4 <- getelo(df3$ratings) | |
| df5 <- getelo(df4$ratings) | |
| df6 <- getelo(df5$ratings) | |
| df7 <- getelo(df6$ratings) | |
| res <- rbind(df1$ratings, df2$ratings, df3$ratings, df4$ratings, df5$ratings, df6$ratings, df7$ratings) | |
| round2[[i]] <- res %>% filter(Win==4) %>% slice(which.min(Games)) | |
| } | |
| ### round3 | |
| bracket3 <- do.call("rbind", round2) | |
| temp <- bracket %>% filter(team %in% bracket3$Player) | |
| temp$initial <- bracket3$Rating | |
| bracket3 <- temp | |
| r3sim <- bracket3 %$% split(., r3) | |
| round3 <- NULL | |
| for(i in 1:length(r3sim)){ | |
| df0 <- r3sim[[i]] %>% select(Player=team, Rating=initial) %>% mutate(Games=0, Win=0, Draw=0, Loss=0, Lag=0) | |
| df1 <- getelo(df0) | |
| df2 <- getelo(df1$ratings) | |
| df3 <- getelo(df2$ratings) | |
| df4 <- getelo(df3$ratings) | |
| df5 <- getelo(df4$ratings) | |
| df6 <- getelo(df5$ratings) | |
| df7 <- getelo(df6$ratings) | |
| res <- rbind(df1$ratings, df2$ratings, df3$ratings, df4$ratings, df5$ratings, df6$ratings, df7$ratings) | |
| round3[[i]] <- res %>% filter(Win==4) %>% slice(which.min(Games)) | |
| } | |
| ### round4 | |
| bracket4 <- do.call("rbind", round3) | |
| temp <- bracket %>% filter(team %in% bracket4$Player) | |
| temp$initial <- bracket4$Rating | |
| bracket4 <- temp | |
| r4sim <- bracket4 %$% split(., r4) | |
| round4 <- NULL | |
| for(i in 1:length(r4sim)){ | |
| df0 <- r4sim[[i]] %>% select(Player=team, Rating=initial) %>% mutate(Games=0, Win=0, Draw=0, Loss=0, Lag=0) | |
| df1 <- getelo(df0) | |
| df2 <- getelo(df1$ratings) | |
| df3 <- getelo(df2$ratings) | |
| df4 <- getelo(df3$ratings) | |
| df5 <- getelo(df4$ratings) | |
| df6 <- getelo(df5$ratings) | |
| df7 <- getelo(df6$ratings) | |
| res <- rbind(df1$ratings, df2$ratings, df3$ratings, df4$ratings, df5$ratings, df6$ratings, df7$ratings) | |
| round4[[i]] <- res %>% filter(Win==4) %>% slice(which.min(Games)) | |
| } | |
| results <- | |
| rbind( | |
| do.call("rbind", round1), | |
| do.call("rbind", round2), | |
| do.call("rbind", round3), | |
| do.call("rbind", round4) | |
| ) %>% | |
| mutate(round = c(rep(1,8), rep(2,4), rep(3,2), 4)) | |
| simresults[[j]] <- results | |
| } | |
| #### END... | |
| ### Results | |
| simresults | |
| ### Functions | |
| winpct <- function(r1,r2){ 1 / ( 1 + 10^( (r1-r2) / 400 ) )} | |
| getelo<-function(df){ | |
| winpcts <- winpct(df[1,2], df[2,2]) | |
| teams <- c(df[1,1], df[2,1]) | |
| winner<-sample(teams, 1, prob=c(1-winpcts, winpcts)) | |
| loser<-setdiff(teams,winner) | |
| elodf <- data.frame(event=1, winner,loser,score=1, stringsAsFactors=F) | |
| newdf<-elo(elodf, kfac=15, status=df) | |
| return(newdf) | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment