f_score_prob_matches <- function( missinggames, matchday30, foot_model, max_goals = 10, N, limit ){
all_final_tables <- data.frame(stringsAsFactors = FALSE)
clubs <- matchday30$club_name
conv <- numeric()
for(i in 1:N){
Goals_team_away <- 0
Goals_team_home <- 0
matchday30 <-
for (m in seq_along(missinggames$club_name_home)){
score_prob <- simulate_score_prob(foot_model = foot_model,
homeTeam = missinggames$club_name_home[m],
awayTeam = missinggames$club_name_away[m],
max_goals = max_goals)
score <- base::sample(x = score_prob, size = 1, prob = score_prob)
Goals_team_home[m] <- which(score_prob == score, arr.ind = T)[1]
Goals_team_away[m] <- which(score_prob == score, arr.ind = T)[2]
}
missinggames <- missinggames %>% mutate(Goals_team_home = Goals_team_home,
Goals_team_away = Goals_team_away,
Goal_diff_home = Goals_team_home - Goals_team_away,
Goal_diff_away = Goals_team_away - Goals_team_home)
missinggames <- map_df(1:nrow(missinggames), ~if(missinggames$Goals_team_home[.x] > missinggames$Goals_team_away[.x])
mutate(missinggames[.x,], points_team_home = 3, points_team_away = 0) else if
(missinggames$Goals_team_home[.x] == missinggames$Goals_team_away[.x])
mutate(missinggames[.x,], points_team_home = 1, points_team_away = 1) else
mutate(missinggames[.x,], points_team_home = 0, points_team_away = 3)
)
final_points <- map(unique(matchday30$club_name), ~ missinggames %>%
filter(club_name_home == .x ) %>%
select(points_team_home) %>%
sum()+ missinggames %>%
filter(club_name_away == .x ) %>%
select(points_team_away) %>%
sum()) %>%
unlist %>%
mutate(matchday30, points_new = .) %>%
mutate(points = points + points_new) %>% select(points)
final_goal_diff <- map(unique(matchday30$club_name), ~ missinggames %>%
filter(club_name_home == .x ) %>%
select(Goal_diff_home) %>%
sum()+ missinggames %>%
filter(club_name_away == .x ) %>%
select(Goal_diff_away) %>%
sum()) %>%
unlist %>%
mutate(matchday30, goal_diff_new = .) %>%
mutate(goal_diff = goal_diff + goal_diff_new ) %>%
select(goal_diff)
final_table <- matchday30 %>%
select(club_name) %>%
mutate(points = final_points$points,
goal_diff = final_goal_diff$goal_diff) %>%
arrange(desc(points), desc(goal_diff)) %>%
mutate(rank = 1:16)%>%
select(rank, everything())
all_final_tables <- bind_rows(all_final_tables,final_table)
average_table <- aggregate(
all_final_tables[1:(length(clubs)*(i-1)),-1],
by = list(all_final_tables$club_name[1:(length(clubs)*(i-1))]),
FUN = "mean"
)
average_table2 <- aggregate(
all_final_tables[,-1],
by = list(all_final_tables$club_name),
FUN = "mean"
)
conv_speed
<- sum
(abs(average_table$score
-average_table2$score
)) conv <- c(conv, conv_speed)
if(i %% 10 == 0){
message("convergence speed: ", round(conv_speed, 3), " run ", i, " out of ", N)
}
if(conv_speed < limit){
message("converged!")
break
}
}
if(conv_speed < limit){
conv_plot <- qplot(x=1:length(conv), y=conv, geom = "jitter",
main = paste0("converged to below ", limit,
" after ", length(conv), " runs"))
} else {
conv_plot <- qplot(x=1:length(conv), y=conv, geom = "jitter",
main = paste0("didn't converge below ", limit,
" after ", N, " runs"))
}
return(list(all_final_tables, conv_plot))
}
Zl9zY29yZV9wcm9iX21hdGNoZXMgPC0gZnVuY3Rpb24oIG1pc3NpbmdnYW1lcywgbWF0Y2hkYXkzMCwgZm9vdF9tb2RlbCwgbWF4X2dvYWxzID0gMTAsIE4sIGxpbWl0ICl7CiAgCiAgYWxsX2ZpbmFsX3RhYmxlcyA8LSBkYXRhLmZyYW1lKHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKICBjbHVicyA8LSBtYXRjaGRheTMwJGNsdWJfbmFtZQogIAogIGNvbnYgPC0gbnVtZXJpYygpCiAgZm9yKGkgaW4gMTpOKXsKICAgIEdvYWxzX3RlYW1fYXdheSA8LSAwCiAgICBHb2Fsc190ZWFtX2hvbWUgPC0gMAogICAgbWF0Y2hkYXkzMCA8LSAKICAgIGZvciAobSBpbiBzZXFfYWxvbmcobWlzc2luZ2dhbWVzJGNsdWJfbmFtZV9ob21lKSl7CiAgc2NvcmVfcHJvYiA8LSBzaW11bGF0ZV9zY29yZV9wcm9iKGZvb3RfbW9kZWwgPSBmb290X21vZGVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob21lVGVhbSA9IG1pc3NpbmdnYW1lcyRjbHViX25hbWVfaG9tZVttXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdheVRlYW0gPSBtaXNzaW5nZ2FtZXMkY2x1Yl9uYW1lX2F3YXlbbV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9nb2FscyA9IG1heF9nb2FscykKICAgIAogICAgc2NvcmUgPC0gYmFzZTo6c2FtcGxlKHggPSBzY29yZV9wcm9iLCBzaXplID0gMSwgcHJvYiA9IHNjb3JlX3Byb2IpCiAgICAKICAgIEdvYWxzX3RlYW1faG9tZVttXSA8LSB3aGljaChzY29yZV9wcm9iID09IHNjb3JlLCBhcnIuaW5kID0gVClbMV0KICAgIAogICAgR29hbHNfdGVhbV9hd2F5W21dIDwtIHdoaWNoKHNjb3JlX3Byb2IgPT0gc2NvcmUsIGFyci5pbmQgPSBUKVsyXQogICAgfQogICAgCiAgICBtaXNzaW5nZ2FtZXMgPC0gbWlzc2luZ2dhbWVzICU+JSBtdXRhdGUoR29hbHNfdGVhbV9ob21lID0gR29hbHNfdGVhbV9ob21lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgR29hbHNfdGVhbV9hd2F5ID0gR29hbHNfdGVhbV9hd2F5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgR29hbF9kaWZmX2hvbWUgPSBHb2Fsc190ZWFtX2hvbWUgLSBHb2Fsc190ZWFtX2F3YXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHb2FsX2RpZmZfYXdheSA9IEdvYWxzX3RlYW1fYXdheSAtIEdvYWxzX3RlYW1faG9tZSkKICAgIAogICAgIG1pc3NpbmdnYW1lcyA8LSAgbWFwX2RmKDE6bnJvdyhtaXNzaW5nZ2FtZXMpLCB+aWYobWlzc2luZ2dhbWVzJEdvYWxzX3RlYW1faG9tZVsueF0gPiBtaXNzaW5nZ2FtZXMkR29hbHNfdGVhbV9hd2F5Wy54XSkKICAgICAgIG11dGF0ZShtaXNzaW5nZ2FtZXNbLngsXSwgcG9pbnRzX3RlYW1faG9tZSA9ICAzLCBwb2ludHNfdGVhbV9hd2F5ID0gMCkgZWxzZSBpZgogICAgICAgKG1pc3NpbmdnYW1lcyRHb2Fsc190ZWFtX2hvbWVbLnhdID09IG1pc3NpbmdnYW1lcyRHb2Fsc190ZWFtX2F3YXlbLnhdKQogICAgICAgICAgIG11dGF0ZShtaXNzaW5nZ2FtZXNbLngsXSwgcG9pbnRzX3RlYW1faG9tZSA9ICAxLCBwb2ludHNfdGVhbV9hd2F5ID0gMSkgZWxzZQogICAgICAgICAgICAgbXV0YXRlKG1pc3NpbmdnYW1lc1sueCxdLCBwb2ludHNfdGVhbV9ob21lID0gIDAsIHBvaW50c190ZWFtX2F3YXkgPSAzKQogICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgCiAgICBmaW5hbF9wb2ludHMgPC0gbWFwKHVuaXF1ZShtYXRjaGRheTMwJGNsdWJfbmFtZSksIH4gbWlzc2luZ2dhbWVzICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihjbHViX25hbWVfaG9tZSA9PSAueCApICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChwb2ludHNfdGVhbV9ob21lKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0oKSsgbWlzc2luZ2dhbWVzICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoY2x1Yl9uYW1lX2F3YXkgPT0gLnggKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QocG9pbnRzX3RlYW1fYXdheSkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSgpKSAlPiUKICAgICAgdW5saXN0ICU+JQogICAgICBtdXRhdGUobWF0Y2hkYXkzMCwgcG9pbnRzX25ldyA9ICAuKSAlPiUKICAgICAgbXV0YXRlKHBvaW50cyA9IHBvaW50cyArIHBvaW50c19uZXcpICU+JSBzZWxlY3QocG9pbnRzKQogICAgCiAgICBmaW5hbF9nb2FsX2RpZmYgPC0gbWFwKHVuaXF1ZShtYXRjaGRheTMwJGNsdWJfbmFtZSksIH4gbWlzc2luZ2dhbWVzICU+JQogICAgICAgICAgICBmaWx0ZXIoY2x1Yl9uYW1lX2hvbWUgPT0gLnggKSAlPiUKICAgICAgICAgICAgc2VsZWN0KEdvYWxfZGlmZl9ob21lKSAlPiUKICAgICAgICAgICAgc3VtKCkrIG1pc3NpbmdnYW1lcyAlPiUgCiAgICAgICAgICAgIGZpbHRlcihjbHViX25hbWVfYXdheSA9PSAueCApICU+JQogICAgICAgICAgICBzZWxlY3QoR29hbF9kaWZmX2F3YXkpICU+JSAKICAgICAgICAgICAgc3VtKCkpICU+JQogICAgICB1bmxpc3QgJT4lCiAgICAgIG11dGF0ZShtYXRjaGRheTMwLCBnb2FsX2RpZmZfbmV3ID0gIC4pICU+JQogICAgICBtdXRhdGUoZ29hbF9kaWZmID0gZ29hbF9kaWZmICsgZ29hbF9kaWZmX25ldyApICU+JQogICAgICBzZWxlY3QoZ29hbF9kaWZmKQogICAgCiAgICBmaW5hbF90YWJsZSA8LSBtYXRjaGRheTMwICU+JQogICAgICBzZWxlY3QoY2x1Yl9uYW1lKSAlPiUKICAgICAgbXV0YXRlKHBvaW50cyA9IGZpbmFsX3BvaW50cyRwb2ludHMsCiAgICAgICAgICAgICBnb2FsX2RpZmYgPSBmaW5hbF9nb2FsX2RpZmYkZ29hbF9kaWZmKSAlPiUKICAgICAgYXJyYW5nZShkZXNjKHBvaW50cyksIGRlc2MoZ29hbF9kaWZmKSkgJT4lCiAgICAgIG11dGF0ZShyYW5rID0gMToxNiklPiUKICAgICAgc2VsZWN0KHJhbmssIGV2ZXJ5dGhpbmcoKSkKICAgICAgCiAgICBhbGxfZmluYWxfdGFibGVzIDwtIGJpbmRfcm93cyhhbGxfZmluYWxfdGFibGVzLGZpbmFsX3RhYmxlKQogICAgYXZlcmFnZV90YWJsZSA8LSBhZ2dyZWdhdGUoCiAgICAgIGFsbF9maW5hbF90YWJsZXNbMToobGVuZ3RoKGNsdWJzKSooaS0xKSksLTFdLAogICAgICBieSA9IGxpc3QoYWxsX2ZpbmFsX3RhYmxlcyRjbHViX25hbWVbMToobGVuZ3RoKGNsdWJzKSooaS0xKSldKSwKICAgICAgRlVOID0gIm1lYW4iCiAgICApCiAgICAgIGF2ZXJhZ2VfdGFibGUyIDwtIGFnZ3JlZ2F0ZSgKICAgICAgICBhbGxfZmluYWxfdGFibGVzWywtMV0sCiAgICAgICAgYnkgPSBsaXN0KGFsbF9maW5hbF90YWJsZXMkY2x1Yl9uYW1lKSwKICAgICAgICBGVU4gPSAibWVhbiIKICAgICAgKQogICAgICBjb252X3NwZWVkIDwtIHN1bShhYnMoYXZlcmFnZV90YWJsZSRzY29yZS1hdmVyYWdlX3RhYmxlMiRzY29yZSkpCiAgICAgIGNvbnYgPC0gYyhjb252LCBjb252X3NwZWVkKQogICAgICBpZihpICUlIDEwID09IDApewogICAgICAgIG1lc3NhZ2UoImNvbnZlcmdlbmNlIHNwZWVkOiAiLCByb3VuZChjb252X3NwZWVkLCAzKSwgIiBydW4gIiwgaSwgIiBvdXQgb2YgIiwgTikKICAgICAgfQogICAgICBpZihjb252X3NwZWVkIDwgbGltaXQpewogICAgICAgIG1lc3NhZ2UoImNvbnZlcmdlZCEiKQogICAgICAgIGJyZWFrCiAgICAgIH0KICB9CiAgaWYoY29udl9zcGVlZCA8IGxpbWl0KXsKICAgIGNvbnZfcGxvdCA8LSBxcGxvdCh4PTE6bGVuZ3RoKGNvbnYpLCB5PWNvbnYsIGdlb20gPSAiaml0dGVyIiwKICAgICAgICAgICAgICAgICAgICAgICBtYWluID0gcGFzdGUwKCJjb252ZXJnZWQgdG8gYmVsb3cgIiwgbGltaXQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBhZnRlciAiLCBsZW5ndGgoY29udiksICIgcnVucyIpKQogIH0gZWxzZSB7CiAgICBjb252X3Bsb3QgPC0gcXBsb3QoeD0xOmxlbmd0aChjb252KSwgeT1jb252LCBnZW9tID0gImppdHRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgbWFpbiA9IHBhc3RlMCgiZGlkbid0IGNvbnZlcmdlIGJlbG93ICIsIGxpbWl0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYWZ0ZXIgIiwgTiwgIiBydW5zIikpCiAgfQogIHJldHVybihsaXN0KGFsbF9maW5hbF90YWJsZXMsIGNvbnZfcGxvdCkpCn0=