This is an experiment to verify a technique for estimating the maximum value of a sample given a gaussian population with sigma sigma and mean mu.

sigma <- 150
mu <- 500

The expected value is the value for which there is a 50% probability of occurring at that value or greater.

Also calculate a 95% confidence interval for the max value.

est.max <- function(sample_size) {
    round(qnorm(c(`Mean`=1 - (0.5/sample_size),
                  `2.5%`=1 - (0.975/sample_size),
                  `97.5%`=1 - (0.025/sample_size)),
                mean=mu, sd=sigma))
}

Define a function to grab a random sample from a population with the given parameters.

Run it 1000 times.

simmax <- function(sample_size) {
    round(max(rnorm(sample_size, mean=mu, sd=sigma)))
}

Run the simulation 10,000 times using a sample size of 500. Accumulate the max values over all the simulations.

N <- 500
sample_maxes <- sapply(1:10000, function(v) { simmax(N) })

How does the average value compare to the expected value?

How does the 95 percent confidence interval of the expected max compare to the actual 95% range of the simulated values?

t <- data.frame(Expected=est.max(N), 
                Simulated=round(quantile(probs=c(0.5, 0.025, 0.975), sample_maxes)))
t$Difference <- t$Expected - t$Simulated
rownames(t) <- c(' Mean', ' 2.5%', '97.5%')
t

This seems to work pretty well. The expected value is close to the simulated value and the confidence intervals line up pretty well.

LS0tCnRpdGxlOiAiRXN0aW1hdGluZyBNYXggVmFsdWUgb2YgYSBQb3B1bGF0aW9uIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpUaGlzIGlzIGFuIGV4cGVyaW1lbnQgdG8gdmVyaWZ5IGEgdGVjaG5pcXVlIGZvciBlc3RpbWF0aW5nIHRoZSBtYXhpbXVtIHZhbHVlIG9mIGEgc2FtcGxlIGdpdmVuIGEgZ2F1c3NpYW4gcG9wdWxhdGlvbiB3aXRoIHNpZ21hIGBzaWdtYWAgYW5kIG1lYW4gYG11YC4KCmBgYHtyfQpzaWdtYSA8LSAxNTAKbXUgPC0gNTAwCmBgYAoKVGhlIGV4cGVjdGVkIHZhbHVlIGlzIHRoZSB2YWx1ZSBmb3Igd2hpY2ggdGhlcmUgaXMgYSA1MCUgcHJvYmFiaWxpdHkgb2Ygb2NjdXJyaW5nIGF0IHRoYXQgdmFsdWUgb3IgZ3JlYXRlci4KCkFsc28gY2FsY3VsYXRlIGEgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgZm9yIHRoZSBtYXggdmFsdWUuCgpgYGB7cn0KZXN0Lm1heCA8LSBmdW5jdGlvbihzYW1wbGVfc2l6ZSkgewogICAgcm91bmQocW5vcm0oYyhgTWVhbmA9MSAtICgwLjUvc2FtcGxlX3NpemUpLAogICAgICAgICAgICAgICAgICBgMi41JWA9MSAtICgwLjk3NS9zYW1wbGVfc2l6ZSksCiAgICAgICAgICAgICAgICAgIGA5Ny41JWA9MSAtICgwLjAyNS9zYW1wbGVfc2l6ZSkpLAogICAgICAgICAgICAgICAgbWVhbj1tdSwgc2Q9c2lnbWEpKQp9CmBgYAoKRGVmaW5lIGEgZnVuY3Rpb24gdG8gZ3JhYiBhIHJhbmRvbSBzYW1wbGUgZnJvbSBhIHBvcHVsYXRpb24gd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4KClJ1biBpdCAxMDAwIHRpbWVzLgoKYGBge3J9CnNpbW1heCA8LSBmdW5jdGlvbihzYW1wbGVfc2l6ZSkgewogICAgcm91bmQobWF4KHJub3JtKHNhbXBsZV9zaXplLCBtZWFuPW11LCBzZD1zaWdtYSkpKQp9CmBgYAoKUnVuIHRoZSBzaW11bGF0aW9uIDEwLDAwMCB0aW1lcyB1c2luZyBhIHNhbXBsZSBzaXplIG9mIDUwMC4gIEFjY3VtdWxhdGUgdGhlIG1heCB2YWx1ZXMgb3ZlciBhbGwgdGhlIHNpbXVsYXRpb25zLgoKYGBge3J9Ck4gPC0gNTAwCnNhbXBsZV9tYXhlcyA8LSBzYXBwbHkoMToxMDAwMCwgZnVuY3Rpb24odikgeyBzaW1tYXgoTikgfSkKYGBgCgpIb3cgZG9lcyB0aGUgYXZlcmFnZSB2YWx1ZSBjb21wYXJlIHRvIHRoZSBleHBlY3RlZCB2YWx1ZT8KCkhvdyBkb2VzIHRoZSA5NSBwZXJjZW50IGNvbmZpZGVuY2UgaW50ZXJ2YWwgb2YgdGhlIGV4cGVjdGVkIG1heCBjb21wYXJlIHRvIHRoZSBhY3R1YWwgOTUlIHJhbmdlIG9mIHRoZSBzaW11bGF0ZWQgdmFsdWVzPwoKYGBge3J9CnQgPC0gZGF0YS5mcmFtZShFeHBlY3RlZD1lc3QubWF4KE4pLCAKICAgICAgICAgICAgICAgIFNpbXVsYXRlZD1yb3VuZChxdWFudGlsZShwcm9icz1jKDAuNSwgMC4wMjUsIDAuOTc1KSwgc2FtcGxlX21heGVzKSkpCnQkRGlmZmVyZW5jZSA8LSB0JEV4cGVjdGVkIC0gdCRTaW11bGF0ZWQKcm93bmFtZXModCkgPC0gYygnIE1lYW4nLCAnIDIuNSUnLCAnOTcuNSUnKQp0CmBgYAoKVGhpcyBzZWVtcyB0byB3b3JrIHByZXR0eSB3ZWxsLiAgVGhlIGV4cGVjdGVkIHZhbHVlIGlzIGNsb3NlIHRvIHRoZSBzaW11bGF0ZWQgdmFsdWUgYW5kIHRoZQpjb25maWRlbmNlIGludGVydmFscyBsaW5lIHVwIHByZXR0eSB3ZWxsLgo=