oecd <- as.character(read.csv("oecd.txt",header=FALSE)$V1)
oecd
## [1] "Australia"
## [2] "Austria"
## [3] "Belgium"
## [4] "Canada"
## [5] "Chile"
## [6] "Colombia"
## [7] "Costa Rica"
## [8] "Czech Republic"
## [9] "Denmark"
## [10] "Estonia"
## [11] "Finland"
## [12] "France"
## [13] "Germany"
## [14] "Greece"
## [15] "Hungary"
## [16] "Iceland"
## [17] "Ireland"
## [18] "Israel"
## [19] "Italy"
## [20] "Japan"
## [21] "Democratic People's Republic of Korea"
## [22] "Latvia"
## [23] "Lithuania"
## [24] "Luxembourg"
## [25] "Mexico"
## [26] "Netherlands"
## [27] "New Zealand"
## [28] "Norway"
## [29] "Poland"
## [30] "Portugal"
## [31] "Slovakia"
## [32] "Slovenia"
## [33] "Spain"
## [34] "Sweden"
## [35] "Switzerland"
## [36] "Turkiye"
## [37] "United Kingdom"
## [38] "United States of America"
oecd <- oecd[!(oecd %in% c("Chile", "Democratic People's Republic of Korea", "Turkiye"))]
years <- 2001:2024
jj <- read.table("imo.txt", header=TRUE)
ranks <- list()
for(i in seq_along(years)){
ranks[[i]] <- subset(jj, jj$year == years[[i]])$country
}
names(ranks) <- years
for(i in seq_along(ranks)){
jj <- ranks[[i]]
ranks[[i]] <- jj[jj %in% oecd]
}
uk <- seq_along(ranks)*0
for(i in seq_along(ranks)){
uk[i] <- which(ranks[[i]] == "Australia")
}
uk
## [1] 8 10 10 10 10 12 7 5 8 7 10 8 6 4 2 10 13 3 6 4 9 11 10 16
BT <- function(n,x){
out <- x^(0:(n-1))
if(x != 1){
out <- out*(1-x)/(1-x^n)
} else {
out <- out/n
}
names(out) <- paste0("p",str_pad(1:n,ceiling(log10(n))))
out
}
getprob <- function(n, r, x, N=1e2){
jj <- BT(n, x)
wanted <- paste0("p", str_pad(r ,ceiling(log10(n))))
c(r=r, x=x, setNames(tabulate(replicate(N, which(rrace(jj) == wanted)),nbins=n), paste0("p", 1:n)))
}
n <- length(oecd)
a_try <- seq(from = 0.01, to = 0.99, len = 20)
x_try <- seq(from = 0.2, to = 1, by = 0.05)
multiple_like_fun <- function(n, # n competitors
a_try, x_try, # values to try
N=1e2){ # N is number of trials
p_try <- ceiling(n * a_try)
jj <- as.matrix(expand.grid(p_try, x_try))
t(apply(jj,1,function(v){getprob(n, v[1], v[2], N)}))
}
print(system.time(II <- multiple_like_fun(length(oecd), a_try, x_try, 1e4)))
## user system elapsed
## 909.913 0.025 910.026
head(II)
## r.Var1 x.Var2 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12
## [1,] 1 0.2 7977 1866 152 5 0 0 0 0 0 0 0 0
## [2,] 3 0.2 333 1339 6318 1871 136 3 0 0 0 0 0 0
## [3,] 4 0.2 76 257 1349 6414 1767 133 4 0 0 0 0 0
## [4,] 6 0.2 3 14 48 283 1283 6416 1802 147 4 0 0 0
## [5,] 8 0.2 0 0 4 7 62 241 1335 6470 1729 151 1 0
## [6,] 10 0.2 0 0 0 0 2 4 63 270 1267 6434 1808 150
## p13 p14 p15 p16 p17 p18 p19 p20 p21 p22 p23 p24 p25 p26 p27 p28 p29 p30
## [1,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [2,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [3,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [4,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [5,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [6,] 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## p31 p32 p33 p34 p35
## [1,] 0 0 0 0 0
## [2,] 0 0 0 0 0
## [3,] 0 0 0 0 0
## [4,] 0 0 0 0 0
## [5,] 0 0 0 0 0
## [6,] 0 0 0 0 0
nrow(II)
## [1] 340
length(a_try)
## [1] 20
length(x_try)
## [1] 17
like <- list()
dim(II)
## [1] 340 37
o <- uk # o for observation
o
## [1] 8 10 10 10 10 12 7 5 8 7 10 8 6 4 2 10 13 3 6 4 9 11 10 16
for(i in seq_along(o)){
like[[i]] <- matrix(II[, o[i] + 2], length(a_try), length(x_try))
}
alllike <- Reduce("*",like)
S <- log(alllike)
S <- S-max(S)
S <- pmax(S, -9.999)
jj <- S
jj[jj < -9.99] <- NA
round(jj,2)
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
## [1,] NA NA NA NA NA NA NA NA NA NA NA NA NA
## [2,] NA NA NA NA NA NA NA NA NA NA NA NA NA
## [3,] NA NA NA NA NA NA NA NA NA NA NA NA -6.59
## [4,] NA NA NA NA NA NA NA NA NA NA NA -3.15 -2.05
## [5,] NA NA NA NA NA NA NA NA NA -1.63 -0.51 0.00 -1.80
## [6,] NA NA NA NA NA NA NA -9.24 -6.62 -4.37 -4.08 -4.36 -5.99
## [7,] NA NA NA NA NA NA NA NA NA NA NA NA NA
## [8,] NA NA NA NA NA NA NA NA NA NA NA NA NA
## [9,] NA NA NA NA NA NA NA NA NA NA NA NA NA
## [10,] NA NA NA NA NA NA NA NA NA NA NA NA NA
## [11,] NA NA NA NA NA NA NA NA NA NA NA NA NA
## [12,] NA NA NA NA NA NA NA NA NA NA NA NA NA
## [13,] NA NA NA NA NA NA NA NA NA NA NA NA NA
## [14,] NA NA NA NA NA NA NA NA NA NA NA NA NA
## [15,] NA NA NA NA NA NA NA NA NA NA NA NA NA
## [16,] NA NA NA NA NA NA NA NA NA NA NA NA NA
## [17,] NA NA NA NA NA NA NA NA NA NA NA NA NA
## [18,] NA NA NA NA NA NA NA NA NA NA NA NA NA
## [19,] NA NA NA NA NA NA NA NA NA NA NA NA NA
## [20,] NA NA NA NA NA NA NA NA NA NA NA NA NA
## [,14] [,15] [,16] [,17]
## [1,] NA -6.33 NA NA
## [2,] -5.79 -6.63 NA NA
## [3,] -4.58 -6.34 NA NA
## [4,] -3.78 -7.66 NA NA
## [5,] -5.32 -9.38 NA NA
## [6,] -9.10 NA NA NA
## [7,] NA NA NA NA
## [8,] NA NA NA NA
## [9,] NA NA NA NA
## [10,] NA NA NA NA
## [11,] NA NA NA NA
## [12,] NA NA NA NA
## [13,] NA NA NA NA
## [14,] NA NA NA NA
## [15,] NA NA NA NA
## [16,] NA NA NA NA
## [17,] NA NA NA NA
## [18,] NA NA NA NA
## [19,] NA NA NA NA
## [20,] NA NA NA NA
contour(a_try, x_try, S,
xlab = "BT strength (scaled)", ylab = "x",
levels = -(0:6)*2, lwd=c(1,4,1,1,1,1,1))
dim(S)
## [1] 20 17
contour(a_try[1:8], x_try[6:17], S[1:8, 6:17], levels = -(0:6)*2, lwd=c(1,4,1,1,1,1,1))
filled.contour(S)
like[[1]]
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
## [1,] 0 0 0 0 0 0 0 0 3 19 66 212 445
## [2,] 0 0 0 0 2 3 11 41 105 217 354 605 680
## [3,] 0 0 2 2 19 40 106 211 344 526 695 779 820
## [4,] 147 266 442 653 902 1056 1260 1429 1437 1377 1244 1059 890
## [5,] 6470 5535 4872 4241 3652 3118 2659 2167 1859 1509 1278 986 822
## [6,] 270 404 495 623 702 794 817 822 856 857 743 681 614
## [7,] 8 23 50 83 121 174 226 319 334 376 399 449 454
## [8,] 3 7 20 30 29 81 107 148 186 266 313 347 361
## [9,] 0 0 3 5 4 13 26 37 71 112 163 188 245
## [10,] 0 0 0 1 0 1 7 13 32 51 75 114 158
## [11,] 0 0 0 0 0 0 1 3 9 22 39 63 99
## [12,] 0 0 0 0 0 0 0 2 4 17 12 30 75
## [13,] 0 0 0 0 0 0 0 0 0 4 13 15 53
## [14,] 0 0 0 0 0 0 0 1 1 1 7 17 32
## [15,] 0 0 0 0 0 0 0 0 0 1 2 1 28
## [16,] 0 0 0 0 0 0 0 0 0 0 2 3 16
## [17,] 0 0 0 0 0 0 0 0 0 2 2 4 12
## [18,] 0 0 0 0 0 0 0 0 0 0 1 2 5
## [19,] 0 0 0 0 0 0 0 0 0 0 1 2 5
## [20,] 0 0 0 0 0 0 0 0 0 0 0 0 9
## [,14] [,15] [,16] [,17]
## [1,] 617 593 434 277
## [2,] 643 606 446 233
## [3,] 737 583 442 288
## [4,] 716 562 409 260
## [5,] 658 476 432 282
## [6,] 517 462 365 320
## [7,] 404 416 345 301
## [8,] 341 379 343 275
## [9,] 267 300 279 298
## [10,] 212 263 305 271
## [11,] 148 227 274 261
## [12,] 108 181 247 265
## [13,] 80 133 223 254
## [14,] 57 145 173 256
## [15,] 42 94 185 266
## [16,] 31 85 191 295
## [17,] 33 69 180 253
## [18,] 17 61 135 276
## [19,] 13 64 150 299
## [20,] 15 49 120 298
Above we used OECD countries for Australia to compete against. Here I use all the competitors:
a <- read.table("imo.txt", header = TRUE)
min(a$year)
## [1] 2001
max(a$year)
## [1] 2024
which(subset(a,a$year == 2015)$country == "Australia")
## [1] 6
competitors <- function(year,a){ table(a$year)[as.character(year)] }
competitors(2013, a)
## 2013
## 97
rank <- function(place, y, a){
which(subset(a,a$year == y)$country == place)
}
rank("Australia",2001,a)
## [1] 25
rank("Australia",2002,a)
## [1] 26
rank("Australia",2024,a)
## [1] 39
cbind(place = sapply(2001:2024,function(y){rank("Australia",y,a)}),
competitors = table(a$year)
)
## place competitors
## 2001 25 83
## 2002 26 84
## 2003 26 82
## 2004 27 85
## 2005 25 91
## 2006 26 90
## 2007 22 93
## 2008 19 97
## 2009 23 104
## 2010 15 96
## 2011 25 101
## 2012 27 100
## 2013 15 97
## 2014 11 101
## 2015 6 104
## 2016 25 109
## 2017 34 111
## 2018 11 107
## 2019 18 112
## 2020 8 105
## 2021 18 107
## 2022 29 104
## 2023 23 112
## 2024 39 108
Now try New Zealand:
cbind(place = sapply(2001:2024,function(y){rank("New Zealand",y,a)}),
competitors = table(a$year)
)
## place competitors
## 2001 44 83
## 2002 36 84
## 2003 57 82
## 2004 58 85
## 2005 38 91
## 2006 58 90
## 2007 51 93
## 2008 72 97
## 2009 66 104
## 2010 29 96
## 2011 30 101
## 2012 53 100
## 2013 50 97
## 2014 60 101
## 2015 50 104
## 2016 53 109
## 2017 47 111
## 2018 46 107
## 2019 58 112
## 2020 47 105
## 2021 70 107
## 2022 58 104
## 2023 66 112
## 2024 32 108