2

我正在寻找一种方法来在 2 个变量之间创建指定的相关性,而不管它们的分布如何,因为允许更改顺序。动机与贝叶斯统计有关。

想象一下a包含 100 个随机正常数字的变量,而变量b包含数字 1...100。

将有可能100 factorial的排列,并且在 variable 的所有可能排列中,大部分时间都存在 -0.95 和 0.95 之间的相关性b

我在 R 中编写了一个小脚本,试图以迭代的方式找到相关性。

  • 遍历所有索引,检查先前的相关性是否低于或高于所寻求的相关性。

  • 如果相关性太低,它会将属于索引的数字与属于随机索引的数字切换。

  • 如果相关性太高,它会将属于索引的数字与属于随机索引的数字切换得更高。

  • 然后它将检查新的相关性是否优于旧的相关性,并保持最接近想要的相关性。

  • 它将继续按顺序(从 1 到 100)遍历所有索引,并在每次迭代之后检查它是否在所需的相关性 +/- 容差内并返回置换变量。

通常在大约 2000 次迭代中,将通过 0.0005 的容差找到指定的相关性。

注意这里的索引实际上是迭代

图片中的索引代表迭代。

我的问题是如何以更智能的方式进行这种排列,以便更快地找到相关性。

4

1 回答 1

0

根据flodel的想法,在每次迭代中,提出几个候选者。在这里,它实际上测试了所有候选人;虽然这对我的长度为 100 的变量来说很好,但对于更多情况,以后应该首选一个样本。

AnnealCor <- function(x, y, corpop, tol) {  
    while(abs(cor(x,y) - corpop) > tol) {       
        for (i in 1:length(y)) {
            numbers <- 1:length(y)
            correlation <- 1:length(y)
            for (j in numbers) {
                switcher <- y
                switcher[c(i,j)] <- y[c(j,i)]
                correlation[j] <- cor(x, switcher) 
            }
        tokeep <- which(abs(correlation - corpop) ==  min(abs(correlation - corpop)))[1]
        y[c(i, tokeep)] <- y[c(tokeep,i)]
        if (abs(cor(x,y) - corpop) < tol) {break}
        }
    }
    return(y)
}

基于 100 次重复的基准测试时间的中位数为 200 毫秒。

于 2013-04-30T08:37:12.607 回答