Correlation
生成均勻分佈和相關的隨機數對
我想生成具有一定相關性的隨機數對。然而,使用兩個正態變量的線性組合的常用方法在這裡無效,因為均勻變量的線性組合不再是均勻分佈的變量。我需要這兩個變量是統一的。
關於如何生成具有給定相關性的成對統一變量的任何想法?
我不知道生成具有任何給定邊際分佈的相關隨機變量的通用方法。因此,我將提出一種特殊方法來生成具有給定(皮爾遜)相關性的均勻分佈的隨機變量對。不失一般性,我假設期望的邊際分佈是標準均勻的(即支持是)。
建議的方法依賴於以下內容:
a) 對於標準的均勻隨機變量和具有各自的分佈函數和, 我們有, 為了. 因此,根據定義,Spearman 的 rho是
因此,Spearman 的 rho 和 Pearson 的相關係數相等(但樣本版本可能不同)。 b) 如果是具有連續邊距的隨機變量和具有 (Pearson) 相關係數的高斯 copula, 那麼斯皮爾曼的 rho 是
這使得生成具有所需 Spearman rho 值的隨機變量變得容易。
該方法是從具有適當相關係數的高斯 copula 生成數據這樣 Spearman 的 rho 對應於均勻隨機變量的所需相關性。
模擬算法
Let表示所需的相關水平,並且要生成的對數。算法是:
- 計算.
- 從高斯 copula 生成一對隨機變量(例如,使用這種方法)
- 重複步驟 2次。
示例
以下代碼是使用具有目標相關性的 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))})
在下圖中,對角線圖顯示了變量的直方圖和, 和非對角線圖顯示散點圖和.
通過構造,隨機變量具有統一的邊距和相關係數(接近). 但由於抽樣的影響,模擬數據的相關係數並不完全等於.
cor(U)[1, 2] # [1] 0.5337697
請注意,該
gen.gauss.cop
函數應僅通過指定更大的相關矩陣來處理兩個以上的變量。模擬研究
針對目標相關性重複以下模擬研究表明相關係數的分佈隨著樣本量收斂到所需的相關性增加。
## 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")