So I'm not sure how crazy this sounds or if I have the math right, but I figure the folks here can tell me if this idea is way off base. The idea works like this. Take a player who has finished N MTTs with an identical structure (think Stars 4/180s) where N is some number greater than 1. Given this information, can we make an accurate estimate of the player's true skill level? I believe that it may be possible. This is because in MTTs with an identified structure we have known information about the population Mean and SD.
For example, in 4/180s, we know that the population mean result must be -$0.40 with a variance $447.0234.
Let's further say we have the following sample of results from a player who played 20 4/180s.
Code:
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 216.00 0.00 0.00 0.00 0.00 18.72 0.00 0.00 0.00 0.00
Over these 20 MTTs this player average $7.336 with a variance of $2212.588.
From this information we can compute an estimate of this player's true skill as follows:
((popMean / popVAR) + (obsMean / obsVAR)) = Numerator
(1/popVAR + 1/obsVAR) = Denominator
Dividing these two results we get an estimate of the player's true skill. Using the numbers from this data we would have the following:
((-.4 / 447.0234) + (7.336 / 2212.588)) = Numerator
(1/447.0234 + 1/2212.588) = Denominator
This gives us a result of .900255, or about $0.90 per tournament. This is a far cry from the original observed estimate of $7.336 per tournament. If certain assumptions are met (which I am not sure they are) and my math is correct, this number should represent our estimate of this player's true skill (in terms of $ won) in this type of MTT given the results we have seen from him so far.
Further, this estimate has a variance:
1 / [ (1/popVAR) + (1/obsVAR) ]
and of course the square root of this number is the standard deviation of this true skill estimate.
So what do you think? Does this make sense?
For what it is worth, I have already created an R function that computes these numbers in case someone wants to see the math that way.
Code:
MTT.skill <- function(pstruct, BI, prizes, ignore.prob=FALSE) {
if(sum(pstruct < 0) > 0) {stop("pstruct must not be below 0.")}
if(length(prizes) < 2) {stop("Must have more than 1 prize.")}
popProfits <- pstruct - BI
popMean <- mean(popProfits)
popVAR <- sum(popProfits^2 * (1/length(pstruct))) - popMean^2
profits <- prizes - BI
obsMean <- mean(profits)
obsVAR <- sum(profits^2 * (1/length(profits))) - obsMean^2
N <- length(prizes)
skill <- ((popMean / popVAR) + (obsMean / obsVAR)) / ((1/popVAR) + (1/obsVAR))
skillSD <- sqrt(1 / ((1/popVAR) + (1/obsVAR)))
SE <- skillSD / sqrt(N)
outcash <- rbind(obsMean, skill, skillSD, N, SE)
outBI <- rbind(obsMean/BI, skill / BI, skillSD / BI, N, SE / BI)
out <- cbind(outcash, outBI)
rownames(out) <- c("Obs. Mean", "Est. True Mean", "Est. SD", "N", "Est. SE")
colnames(out) <- c("Results $", "Results BI")
return(out)
}
Example:
Code:
Stars4_180.prizestruct <- c(216, 144, 85.68, 57.60, 46.80, 36.00, 25.20, 18.72, 12.24, rep(8.64, 9), rep(0,162))
samp <- sample(Stars4_180.prizestruct, 20, T)
samp
MTT.skill(Stars4_180.prizestruct, 4.40, samp)