在R中创建变量之间的指定相关性(通过置换)

时间:2013-04-29 14:50:54

标签: r statistics permutation

我正在寻找一种方法来创建2个变量之间的指定关联,无论它们的分布如何,只要允许更改ordening。动机与贝叶斯统计数据有关。

想象变量a,其中包含100个随机正常数字,而 变量b保存数字1 ... 100.

可能存在100 factorial个排列,并且大多数时间-0.95和0.95之间的相关性将存在于变量b的所有可能排列中。

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

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

  • 如果相关性太低,它将使用属于随机索引的数字更低来切换属于索引的数字。

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

  • 然后检查新相关性是否优于旧相关性,并保持最接近所需相关性的相关性。

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

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

Note that index here is actually iteration

图片中的索引代表迭代。

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

1 个答案:

答案 0 :(得分: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毫秒。