-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcomputeRanking.R
68 lines (62 loc) · 3.47 KB
/
computeRanking.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
computeRkWR <- function(scoreA, scoreB, rankingA, rankingB, weight) {
if (abs(rankingA - rankingB) < 10) {
swap <- (as.numeric(scoreB > scoreA)
- as.numeric(scoreA > scoreB)
+ (rankingA - rankingB)*0.1)
} else {
swap <- 2*(as.numeric(scoreB > scoreA)*as.numeric(rankingA > rankingB)
- as.numeric(scoreA > scoreB)*as.numeric(rankingB > rankingA))
+ as.numeric(scoreA == scoreB)*sign(rankingA - rankingB)
}
if (abs(scoreA - scoreB > 15))
weight <- weight*1.5
rankingA <- rankingA - swap*weight
rankingB <- rankingB + swap*weight
return(list(rankingA = rankingA, rankingB = rankingB))
}
computeRkWR_alt <- function(scoreA, scoreB, rankingA, rankingB, weight) {
swap <- (as.numeric(scoreB > scoreA)
- as.numeric(scoreA > scoreB)
+ (rankingA - rankingB)*0.1)
if (abs(scoreA - scoreB > 15))
weight <- weight*1.5
rankingA <- rankingA - swap*weight
rankingB <- rankingB + swap*weight
return(list(rankingA = rankingA, rankingB = rankingB))
}
computeRkELO <- function(scoreA, scoreB, rankingA, rankingB, K) {
D <- rankingA - rankingB
pDA <- 1/(1+10**(-D/20))
outcome <- as.numeric(scoreA > scoreB) + 0.5*as.numeric(scoreA == scoreB)
swap <- K*(outcome - pDA)
rankingA <- rankingA + swap
rankingB <- rankingB - swap
return(list(rankingA = rankingA, rankingB = rankingB))
}
computeRkELOd <- function(scoreA, scoreB, rankingA, rankingB, K) {
D <- rankingA - rankingB
pDA <- 1/(1+10**(-D/20))
outcome <- ifelse(scoreA == 0 & scoreB == 0, 0.5, scoreA/(scoreA + scoreB))
swap <- K*(outcome - pDA)
rankingA <- rankingA + swap
rankingB <- rankingB - swap
return(list(rankingA = rankingA, rankingB = rankingB))
}
computeRanking <- function(match, type = c("WR","ELO","WRa","ELOd"), bonusReceiver = TRUE) {
teamA <- match@teamA
teamB <- match@teamB
if (type == "WR")
newRanking <- computeRkWR(match@scoreA, match@scoreB, teamA@ranking + as.numeric(bonusReceiver)*3,
teamB@ranking, match@weight) else if (type == "ELO")
newRanking <- computeRkELO(match@scoreA, match@scoreB, teamA@ranking+ as.numeric(bonusReceiver)*3,
teamB@ranking, 10) else if (type == "WRa")
newRanking <- computeRkWR_alt(match@scoreA, match@scoreB,
teamA@ranking + as.numeric(bonusReceiver)*3,
teamB@ranking, match@weight) else newRanking <- computeRkELOd(match@scoreA,
match@scoreB,
teamA@ranking+ as.numeric(bonusReceiver)*3,
teamB@ranking, 10)
teamA <- updateRanking(teamA, newRanking$rankingA - as.numeric(bonusReceiver)*3, as.POSIXct(match@date, format = "%Y-%m-%d"))
teamB <- updateRanking(teamB, newRanking$rankingB, as.POSIXct(match@date, format = "%Y-%m-%d"))
return(list(teamA = teamA, teamB = teamB))
}