1

次の R コードでは、正規分布の半分しか得られません。残りの半分を取得するには、コードに何を変更すればよいですか?

halfnormal <- function(n){
    vector <- rep(0,n)
    for(i in 1:n){
        uni_random <- runif(2) 
        y <- -log(uni_random)
        while(y[2] < (y[1]-1)^2/2){
            uni_random <- runif(2)
            y <- -log(uni_random)
        }
        vector[i] <- y[1]
    }
    vector
}

output <- halfnormal(1000)
hist(output)
4

2 に答える 2

7

そのコードを使用して標準法線を生成することを主張する場合 (rnormはるかに高速で正確であるため、お勧めしません)、そのベクトル全体を、ランダムな(-1, +1)値で構成される等しい長さのベクトルでドット積するだけです。

ちなみに、半正規分布は、カイ分布(自由度 1) とも呼ばれます。

于 2013-03-01T06:24:41.440 に答える
1

これはマルサリアの修正を加えたジッグラト アルゴリズムに少し似ていますが、少し違いますか? Rで保証された乱数ジェネレーターを使用したくない場合は、おそらくこれが機能します。

   halfnormal <- function(n){
        vector <- rep(0,n)
        for(i in 1:n){
            uni_random <- runif(2) 
            y <- -log(uni_random)
            while(y[2] < (y[1]-1)^2/2){
                uni_random <- runif(2)
                y <- -log(uni_random)
            }
            vector[i] <- sample(c(-1,1),size=1)*y[1] #randomly select the tail
        }
        vector
    }

    output <- halfnormal(1000)
    hist(output)
于 2013-03-01T06:21:00.643 に答える