R: проблема с симуляцией МонтеКарло и нормальным распределением - PullRequest
1 голос
/ 18 апреля 2020

Я пытаюсь выполнить следующее упражнение:

Пусть Z_n - максимум из n стандартных нормальных наблюдений. Оцените, что n должно быть таким, чтобы P (Z_n> 4) = 0,25

Я попробовал следующий код, и я знаю, что ответ о n = 9000, потому что он возвращает приблизительно 0,25. Я должен изменить свой код так, чтобы n было выходом, а не входом.

n=9000
x1 <- sapply(1:n, function(i){max(rnorm(n=n,0,1))})
length(x1[x1>4])/length(x1)

Как я могу это сделать?

Спасибо за помощь!

1 Ответ

0 голосов
/ 19 апреля 2020

Ну, вы можете выбрать подходящий диапазон и просто выполнить бинарный поиск. Просто помните, что результат будет зависеть от количества образцов и семян RNG.

Zn <- function(n) {
    max(rnorm(n))
}

Sample <- function(N, n) {
    set.seed(312345) # sample same sequence of numbers
    x <- replicate(N, Zn(n))
    sum( x > 4.0 )/N
}

P <- 0.25

BinarySearch <- function(n_start, n_end, N) {
    lo <- n_start
    hi <- n_end

    s_lo <- Sample(N, lo)
    s_hi <- Sample(N, hi)

    if (s_lo > P)
        return(list(-1, 0.0, 0.0)) # wrong low end of interval
    if (s_hi < P)
        return(list(-2, 0.0, 0.0)) # wrong high end of interval

    while (hi-lo > 1) {
        me <- (hi+lo) %/% 2
        s_me <- Sample(N, me)
        if (s_me >= P)
            hi <- me
        else
            lo <- me

        cat("hi = ", hi, "lo = ", lo, "S = ", s_me, "\n")
    }
    list(hi, Sample(N, hi-1), Sample(N, hi)) 
}    

q <- BinarySearch(9000, 10000, 100000) # range [9000...10000] with 100K points sampled

print(q[1]) # n at which we have P(Zn(n)>4)>=0.25
print(q[2]) # P(Zn(n-1)>4)
print(q[3]) # P(Zn(n)>4)

В результате у меня получится

9089
0.24984
0.25015

, что выглядит разумно. Это довольно медленно, хотя ...

...