source("fast3PRanking.R") source("fastELO.R") source("eigenvalueRanking.R") source("formattedOutput.R") db_games <- readRDS("db_data.Rda") # Seasons s201516_start <- as.Date("2015-08-24") s201516_end <- as.Date("2016-05-14") s201617_start <- as.Date("2016-08-26") s201617_end <- as.Date("2017-05-20") s201718_start <- as.Date("2017-08-18") s201718_end <- as.Date("2018-05-12") s201819_start <- as.Date("2018-08-24") s201819_end <- as.Date("2019-05-18") s201920_start <- as.Date("2019-08-16") s201920_1half <- as.Date("2019-12-22") db_201516 <- subset(db_games, Date >= s201516_start & Date <= s201516_end & League == "Bundesliga") db_201617 <- subset(db_games, Date >= s201617_start & Date <= s201617_end & League == "Bundesliga") db_201718 <- subset(db_games, Date >= s201718_start & Date <= s201718_end & League == "Bundesliga") db_201819 <- subset(db_games, Date >= s201819_start & Date <= s201819_end & League == "Bundesliga") db_201920_1half <- subset(db_games, Date >= s201920_start & Date <= s201920_1half & League == "Bundesliga") training_games <- db_201516 twoP <- fast3PRanking(training_games, 2)[[2]] #cat("\n Two Point Ranking:\n") #printStandings(twoP) threeP <- fast3PRanking(training_games)[[2]] #cat("\n Three Point Ranking:\n") #printStandings(threeP) elo5k <- fastELO(training_games, 5) #cat("\n ELO (k=5):\n") #printStandings(elo5k) elo10k <- fastELO(training_games, 10) #cat("\n ELO (k=10):\n") #printStandings(elo10k) elo30k <- fastELO(training_games, 30) #cat("\n ELO (k=30):\n") #printStandings(elo30k) elo50k <- fastELO(training_games, 50) #cat("\n ELO (k=50):\n") #printStandings(elo50k) elo100k <- fastELO(training_games, 100) #cat("\n ELO (k=100):\n") #printStandings(elo100k) elo500k <- fastELO(training_games, 500) #cat("\n ELO (k=500):\n") #printStandings(elo500k) direct_method <- directMethod(training_games) #cat("\n Direct method:\n") #printStandings(direct_method) inverse_power <- invPowerMethod(training_games) #cat("\n Inverse power method:\n") #printStandings(inverse_power) games <- subset(db_games, Date >= s201617_start & Date <= s201920_1half & League == "Bundesliga") games <- na.omit(games) games <- games[order(games$Date),] error2P <- 0 error3P <- 0 errorELO5k <- 0 errorELO10k <- 0 errorELO30k <- 0 errorELO50k <- 0 errorELO100k <- 0 errorELO500k <- 0 errorDM <- 0 errorIPM <- 0 error05P <- 0 games_evaluated <- 0 all_games <- training_games for (i in 1:nrow(games)) # loop over all rows (games) { date <- games$Date homeTeam <- games$HomeTeam[i] awayTeam <- games$AwayTeam[i] if ((homeTeam %in% names(threeP)) && (awayTeam %in% names(threeP))) { # forecast points games_evaluated <- games_evaluated + 1 gd <- games$FTHG[i] - games$FTAG[i] res_home <- 0.5 if (gd > 0) { res_home <- 1 } else if (gd < 0) { res_home <- 0 } exp_2P <- twoP[homeTeam]/(twoP[homeTeam]+twoP[awayTeam]) error2P <- error2P + (exp_2P - res_home)^2 exp_3P <- threeP[homeTeam]/(threeP[homeTeam]+threeP[awayTeam]) error3P <- error3P + (exp_3P - res_home)^2 exp_elo5k <- 1/(1+10^((elo5k[awayTeam]-elo5k[homeTeam])/400)) errorELO5k <- errorELO5k + (exp_elo5k - res_home)^2 exp_elo10k <- 1/(1+10^((elo10k[awayTeam]-elo10k[homeTeam])/400)) errorELO10k <- errorELO10k + (exp_elo10k - res_home)^2 exp_elo30k <- 1/(1+10^((elo30k[awayTeam]-elo30k[homeTeam])/400)) errorELO30k <- errorELO30k + (exp_elo30k - res_home)^2 exp_elo50k <- 1/(1+10^((elo50k[awayTeam]-elo50k[homeTeam])/400)) errorELO50k <- errorELO50k + (exp_elo50k - res_home)^2 exp_elo100k <- 1/(1+10^((elo100k[awayTeam]-elo100k[homeTeam])/400)) errorELO100k <- errorELO100k + (exp_elo100k - res_home)^2 exp_elo500k <- 1/(1+10^((elo500k[awayTeam]-elo500k[homeTeam])/400)) errorELO500k <- errorELO500k + (exp_elo500k - res_home)^2 exp_DM <- direct_method[homeTeam]/(direct_method[homeTeam]+direct_method[awayTeam]) errorDM <- errorDM + (exp_DM - res_home)^2 exp_IPM <- inverse_power[homeTeam]/(inverse_power[homeTeam]+inverse_power[awayTeam]) errorIPM <- errorIPM + (exp_IPM - res_home)^2 error05P <- error05P + (0.5 - res_home)^2 # update rankings twoP <- update3PRanking(games[i,], twoP, 2) threeP <- update3PRanking(games[i,], threeP) elo5k <- fastELO(games[i,], 5, elos = elo5k) elo10k <- fastELO(games[i,], 10, elos = elo10k) elo30k <- fastELO(games[i,], 30, elos = elo30k) elo50k <- fastELO(games[i,], 50, elos = elo50k) elo100k <- fastELO(games[i,], 100, elos = elo100k) elo500k <- fastELO(games[i,], 500, elos = elo500k) all_games <- rbind(all_games, games[i,]) direct_method <- directMethod(all_games) inverse_power <- invPowerMethod(all_games) #print(i) } } cat("\n Two Point Ranking:\n") printStandings(twoP) cat("\n Three Point Ranking:\n") printStandings(threeP) cat("\n ELO (k=5):\n") printStandings(elo5k) cat("\n ELO (k=10):\n") printStandings(elo10k) cat("\n ELO (k=30):\n") printStandings(elo30k) cat("\n ELO (k=50):\n") printStandings(elo50k) cat("\n ELO (k=100):\n") printStandings(elo100k) cat("\n ELO (k=500):\n") printStandings(elo500k) cat("\n Direct method:\n") printStandings(direct_method) cat("\n Inverse power method:\n") printStandings(inverse_power) cat("\n") print(paste0("Games evaluated: ", games_evaluated)) print(paste0("Brier score 2P-Ranking: ", round(error2P/games_evaluated,3))) print(paste0("Brier score 3P-Ranking: ", round(error3P/games_evaluated,3))) print(paste0("Brier score ELO (k=5): ", round(errorELO5k/games_evaluated,3))) print(paste0("Brier score ELO (k=10): ", round(errorELO10k/games_evaluated,3))) print(paste0("Brier score ELO (k=30): ", round(errorELO30k/games_evaluated,3))) print(paste0("Brier score ELO (k=50): ", round(errorELO50k/games_evaluated,3))) print(paste0("Brier score ELO (k=100): ", round(errorELO100k/games_evaluated,3))) print(paste0("Brier score ELO (k=500): ", round(errorELO500k/games_evaluated,3))) print(paste0("Brier score direct method: ", round(errorDM/games_evaluated,3))) print(paste0("Brier score inverse power method: ", round(errorIPM/games_evaluated,3))) print(paste0("Brier score always draw: ", round(error05P/games_evaluated,3))) cat("\n") twoP <- numeric(0) threeP <- numeric(0) elo5k <- numeric(0) elo10k <- numeric(0) elo30k <- numeric(0) elo50k <- numeric(0) elo100k <- numeric(0) elo500k <- numeric(0) games <- db_games games <- na.omit(games) games <- games[order(games$Date),] error2P <- 0 error3P <- 0 errorELO5k <- 0 errorELO10k <- 0 errorELO30k <- 0 errorELO50k <- 0 errorELO100k <- 0 errorELO500k <- 0 error05P <- 0 games_evaluated <- 0 for (i in 1:nrow(games)) # loop over all rows (games) { date <- games$Date homeTeam <- games$HomeTeam[i] awayTeam <- games$AwayTeam[i] # forecast points games_evaluated <- games_evaluated + 1 gd <- games$FTHG[i] - games$FTAG[i] res_home <- 0.5 if (gd > 0) { res_home <- 1 } else if (gd < 0) { res_home <- 0 } if ((homeTeam %in% names(threeP)) && (awayTeam %in% names(threeP))) { if ((twoP[homeTeam]+twoP[awayTeam])>0) { exp_2P <- twoP[homeTeam]/(twoP[homeTeam]+twoP[awayTeam]) error2P <- error2P + (exp_2P - res_home)^2 exp_3P <- threeP[homeTeam]/(threeP[homeTeam]+threeP[awayTeam]) error3P <- error3P + (exp_3P - res_home)^2 } exp_elo5k <- 1/(1+10^((elo5k[awayTeam]-elo5k[homeTeam])/400)) errorELO5k <- errorELO5k + (exp_elo5k - res_home)^2 exp_elo10k <- 1/(1+10^((elo10k[awayTeam]-elo10k[homeTeam])/400)) errorELO10k <- errorELO10k + (exp_elo10k - res_home)^2 exp_elo30k <- 1/(1+10^((elo30k[awayTeam]-elo30k[homeTeam])/400)) errorELO30k <- errorELO30k + (exp_elo30k - res_home)^2 exp_elo50k <- 1/(1+10^((elo50k[awayTeam]-elo50k[homeTeam])/400)) errorELO50k <- errorELO50k + (exp_elo50k - res_home)^2 exp_elo100k <- 1/(1+10^((elo100k[awayTeam]-elo100k[homeTeam])/400)) errorELO100k <- errorELO100k + (exp_elo100k - res_home)^2 exp_elo500k <- 1/(1+10^((elo500k[awayTeam]-elo500k[homeTeam])/400)) errorELO500k <- errorELO500k + (exp_elo500k - res_home)^2 exp_DM <- direct_method[homeTeam]/(direct_method[homeTeam]+direct_method[awayTeam]) errorDM <- errorDM + (exp_DM - res_home)^2 exp_IPM <- inverse_power[homeTeam]/(inverse_power[homeTeam]+inverse_power[awayTeam]) errorIPM <- errorIPM + (exp_IPM - res_home)^2 error05P <- error05P + (0.5 - res_home)^2 } # update rankings twoP <- update3PRanking(games[i,], twoP, 2) threeP <- update3PRanking(games[i,], threeP) elo5k <- fastELO(games[i,], 5, elos = elo5k) elo10k <- fastELO(games[i,], 10, elos = elo10k) elo30k <- fastELO(games[i,], 30, elos = elo30k) elo50k <- fastELO(games[i,], 50, elos = elo50k) elo100k <- fastELO(games[i,], 100, elos = elo100k) elo500k <- fastELO(games[i,], 500, elos = elo500k) #print(i) } print(paste0("Games evaluated: ", games_evaluated)) print(paste0("Brier score 2P-Ranking: ", round(error2P/games_evaluated,3))) print(paste0("Brier score 3P-Ranking: ", round(error3P/games_evaluated,3))) print(paste0("Brier score ELO (k=5): ", round(errorELO5k/games_evaluated,3))) print(paste0("Brier score ELO (k=10): ", round(errorELO10k/games_evaluated,3))) print(paste0("Brier score ELO (k=30): ", round(errorELO30k/games_evaluated,3))) print(paste0("Brier score ELO (k=50): ", round(errorELO50k/games_evaluated,3))) print(paste0("Brier score ELO (k=100): ", round(errorELO100k/games_evaluated,3))) print(paste0("Brier score ELO (k=500): ", round(errorELO500k/games_evaluated,3))) print(paste0("Brier score always draw: ", round(error05P/games_evaluated,3)))