0

我正在使用基于用户输入的相关矩阵生成随机数据集的数据模拟技术。一段时间后我注意到,一些随机生成的数据集比其他数据集更接近实际的相关矩阵。我想创建一个函数,1)生成数据集,2)将相关矩阵与原始矩阵进行比较,3)重复直到有足够接近的匹配。不幸的是,我被训练为社会科学家而不是程序员,“如果/那么”计算机逻辑对我来说更难理解。根据我在网上找到的资源,这是我所获得的:

    #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

使用循环的方法很好,问题是你没有循环——你有一个递归调用。您也不需要编写自己的多元法线生成器;mvrnormMASS包中已经这样做了。

试试这个。

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 回答