在R

2013-04-29 90 views
2

中創建變量之間的指定相關性(通過排列)我正在尋找一種方法來創建2個變量之間的指定相關性,無論它們的分佈如何,只要允許ordening進行更改。動機與貝葉斯統計有關。在R

想象一下變量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

指數代表迭代。

我的問題是如何以更智能的方式進行這種置換,以便更快地找到相關性。

+0

我想補充一點,如何解決這個問題的一般信息可能已經很有用了......如何更好地理解如何改進查找關聯。 – PascalVKooten 2013-04-29 18:25:36

+0

有可能以某種方式使用根查找嗎? – PascalVKooten 2013-04-29 18:31:06

+0

看看http://en.wikipedia.org/wiki/Simulated_annealing。我會拍攝像這樣的東西,每次迭代都會考慮很多隨機排列,並保留最好的(絕對值最接近您的目標)。總的來說,一些比你的高級描述更隨機一些,也許更向量化的建議。 – flodel 2013-04-29 22:27:12

回答

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毫秒。