ユーザーが入力した相関行列に基づいてランダムなデータ セットを生成するデータ シミュレーション技術を使用しています。しばらくして気付いたのは、ランダムに生成されたデータセットの中には、他のデータセットよりも実際の相関行列にはるかに近いものがあるということでした。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 ループの何が問題だと思いますか? ループ ロジックとは別の観点からこの問題を検討する必要がありますか?
皆さんの知識と専門知識を喜んで共有していただき、ありがとうございます。