特定の相関関係を持つ乱数のペアを生成したいと思います。ただし、2つの正規変数の線形結合を使用する通常のアプローチは、ここでは有効ではありません。これは、均一変数の線形結合はもはや均一分布変数ではないためです。2つの変数が均一である必要があります。
特定の相関関係を持つ均一変数のペアを生成する方法に関するアイデアはありますか?
特定の相関関係を持つ乱数のペアを生成したいと思います。ただし、2つの正規変数の線形結合を使用する通常のアプローチは、ここでは有効ではありません。これは、均一変数の線形結合はもはや均一分布変数ではないためです。2つの変数が均一である必要があります。
特定の相関関係を持つ均一変数のペアを生成する方法に関するアイデアはありますか?
回答:
私は、与えられた周辺分布を持つ相関ランダム変数を生成する普遍的な方法を知りません。そこで、特定の(ピアソン)相関を持つ均一に分布したランダム変数のペアを生成するアドホックな方法を提案します。一般性を失うことなく、Iは所望の周辺分布は、標準均一であると仮定する(すなわち、支持体は、)。
提案されたアプローチは、以下に依存している。
)標準一様確率変数の場合及びU 2それぞれの分布関数でF 1及びF 2、我々はF I(U 、I)= U Iをするため、私は= 1 、2。従って、定義によりスピアマンのrhoがある
 ρ S(U 1、U 2)= C O R R(Fは
したがって、スピアマンのローとピアソンの相関係数は等しくなります(ただし、サンプルバージョンは異なる場合があります)。
場合B)連続的なマージンとを有するランダム変数であるガウス・コピュラ(ピアソン)相関係数でρは、スピアマンのrhoは ρ S(X 1、X 2)= 6 これにより、スピアマンのρの所望の値を持つランダム変数を簡単に生成できます。
アプローチは、スピアマンのrhoが均一なランダム変数の望ましい相関に対応するように、適切な相関係数持つガウスコピュラからデータを生成することです。
シミュレーションアルゴリズム
 
のlet 相関の所望のレベルを示し、nはペアの数が生成されます。アルゴリズムは次のとおりです。
例
 
次のコードは、ターゲット相関およびn = 500のペアでRを使用したこのアルゴリズムの実装例です。
## Initialization and parameters 
set.seed(123)
r <- 0.6                            # Target (Spearman) correlation
n <- 500                            # Number of samples
## Functions
gen.gauss.cop <- function(r, n){
    rho <- 2 * sin(r * pi/6)        # Pearson correlation
    P <- toeplitz(c(1, rho))        # Correlation matrix
    d <- nrow(P)                    # Dimension
    ## Generate sample
    U <- pnorm(matrix(rnorm(n*d), ncol = d) %*% chol(P))
    return(U)
}
## Data generation and visualization
U <- gen.gauss.cop(r = r, n = n)
pairs(U, diag.panel = function(x){
          h <- hist(x, plot = FALSE)
          rect(head(h$breaks, -1), 0, tail(h$breaks, -1), h$counts/max(h$counts))})
以下の図では、対角線のプロットは変数とU 2のヒストグラムを示し、非対角線のプロットはU 1とU 2の散布図を示しています。 

構築により、ランダム変数は均一なマージンと相関係数(に近い)持ちます。ただし、サンプリングの影響により、シミュレートされたデータの相関係数はrと正確には等しくありません。
cor(U)[1, 2]
# [1] 0.5337697
gen.gauss.cop関数は、より大きな相関行列を指定するだけで、3つ以上の変数で機能することに注意してください。
## Simulation
set.seed(921)
r <- 0.6                                                # Target correlation
n <- c(10, 50, 100, 500, 1000, 5000); names(n) <- n     # Number of samples
S <- 1000                                               # Number of simulations
res <- sapply(n,
              function(n, r, S){
                   replicate(S, cor(gen.gauss.cop(r, n))[1, 2])
               }, 
               r = r, S = S)
boxplot(res, xlab = "Sample size", ylab = "Correlation")
abline(h = r, col = "red")
 
 

gen.gauss.cop関数が(些細な)微調整で3つ以上の変数に対して機能することを指摘する文を追加する自由を取りました      。追加が気に入らない場合や、別の方法で配置したい場合は、必要に応じて元に戻すか変更してください。