2

順序付けの変更が許可されている場合、分布に関係なく、2 つの変数間に指定された相関関係を作成する方法を探しています。動機は、ベイジアン統計に関係しています。

a100 個のランダムな正規数を保持する変数を想像してください。変数bは 1 ~ 100 の数値を保持します。

可能な順列があり100 factorial、ほとんどの場合、-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 に答える