我正在寻找一种方法来创建2个变量之间的指定关联,无论它们的分布如何,只要允许更改ordening。动机与贝叶斯统计数据有关。
想象变量a
,其中包含100个随机正常数字,而
变量b
保存数字1 ... 100.
可能存在100 factorial
个排列,并且大多数时间-0.95和0.95之间的相关性将存在于变量b
的所有可能排列中。
我在R中写了一个小脚本,试图以迭代的方式找到相关性。
遍历所有索引,检查先前的相关性是否为 低于或高于所寻求的相关性。
如果相关性太低,它将使用属于随机索引的数字更低来切换属于索引的数字。
如果相关性太高,它会将属于索引的数字切换为属于随机索引的数字更高。
然后检查新相关性是否优于旧相关性,并保持最接近所需相关性的相关性。
它会按顺序继续遍历所有索引(从1到100),然后在每次迭代后检查它是否在所需的相关性+/-容差范围内并返回置换变量。
通常在大约2000次迭代中,通过公差0.0005找到指定的相关性。
图片中的索引代表迭代。
我的问题是如何以更智能的方式进行排列,以便更快地找到相关性。
答案 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毫秒。