0

ユーザーが入力した相関行列に基づいてランダムなデータ セットを生成するデータ シミュレーション技術を使用しています。しばらくして気付いたのは、ランダムに生成されたデータセットの中には、他のデータセットよりも実際の相関行列にはるかに近いものがあるということでした。1) データ セットを生成し、2) 相関行列を元の行列と比較し、3) 十分に一致するまで繰り返す関数を作成したいと考えました。残念ながら、私はプログラマーではなく社会科学者として訓練を受けており、「if/then」のコンピューター ロジックを理解するのは難しいです。これは、Web全体で見つけたリソースに基づいて得た限りです。

    #Input Correlation Matrix
    sigma <- matrix(c(1.00, -0.03, 0.39, -0.05, -0.08,
                      -0.03, 1.00, 0.07, -0.23, -0.16,
                      0.39, 0.07, 1.00, -0.13, -0.29,
                      -0.05, -0.23, -0.13, 1.00, 0.34,
                      -0.08, -0.16 ,-0.29, 0.34, 1.00), nr=5, byrow=TRUE)
    rownames(sigma) <-c("Exercise", "Hardiness", "Fitness", "Stress", "Illness")
    colnames(sigma) <-c("Exercise", "Hardiness", "Fitness", "Stress", "Illness")

    #The Choleski Decomposition Random Data Generator
    N <- 373
    generate <-function(sigma) {
        L = chol(sigma)
        nvars = dim(L)[1]
        r = t(L) %*% matrix(rnorm(nvars*N), nrow=nvars, ncol=N)
        r = t(r)
        sample <- as.data.frame(r)}

    sample <- generate(sigma)

    # check if the empirical correlation is close to the theoretical sigma:
    correction <- function(sample) {
        zigma <- cor(sample)
        check <- all.equal(zigma, sigma, tolerance = .0025)
        if(check != "TRUE") {
        sample <- generate(sigma)
        correction(sample)
        }
        else
            return(check)
    }

そして、「修正(サンプル)」を実行すると表示されるエラーメッセージは次のとおりです。

    Error: evaluation nested too deeply: infinite recursion / options(expressions=)?

if/else ループの何が問題だと思いますか? ループ ロジックとは別の観点からこの問題を検討する必要がありますか?

皆さんの知識と専門知識を喜んで共有していただき、ありがとうございます。

4

1 に答える 1

2

ループを使用するアプローチは問題ありません。問題は、ループがないことです。つまり、再帰呼び出しがあります。また、独自の多変量法線ジェネレーターを作成する必要もありません。パッケージmvrnorm内でこれはすでに行われています。MASS

これを試して。

library(MASS) # for mvrnorm
m <- rep(0, nrow(sigma))
repeat {
    samp <- mvrnorm(N, m, sigma) 
    z <- cor(samp)
    close_enough <- isTRUE(all.equal(z, sigma, tolerance=.0025))
    if (close_enough) break
}
于 2013-06-18T02:30:11.543 に答える