[英]Generating Random Variables with given correlations between pairs of them:
我想生成2個連續隨機變量Q1
, Q2
(數量特征,每個都是正常的)和2個二元隨機變量Z1
, Z2
(二元特征),它們之間具有給定的成對相關性。 說
(Q1,Q2):0.23
(Q1,Z1):0.55
(Q1,Z2):0.45
(Q2,Z1):0.4
(Q2,Z2):0.5
(Z1,Z2):0.47
請幫我在R中生成這樣的數據
這很粗糙,但可能會讓你開始朝着正確的方向前進。
library(copula)
options(digits=3)
probs <- c(0.5,0.5)
corrs <- c(0.23,0.55,0.45,0.4,0.5,0.47) ## lower triangle
模擬相關值(前兩個定量,后兩個轉換為二進制)
sim <- function(n,probs,corrs) {
tmp <- normalCopula( corrs, dim=4 , "un")
getSigma(tmp) ## test
x <- rCopula(1000, tmp)
x2 <- x
x2[,3:4] <- qbinom(x[,3:4],size=1,prob=rep(probs,each=nrow(x)))
x2
}
測試觀察到的和目標相關性之間的SSQ距離:
objfun <- function(corrs,targetcorrs,probs,n=1000) {
cc <- try(cor(sim(n,probs,corrs)),silent=TRUE)
if (is(cc,"try-error")) return(NA)
sum((cc[lower.tri(cc)]-targetcorrs)^2)
}
看看輸入corrs = target時有多糟糕:
cc0 <- cor(sim(1000,probs=probs,corrs=corrs))
cc0[lower.tri(cc0)]
corrs
objfun(corrs,corrs,probs=probs) ## 0.112
現在嘗試優化。
opt1 <- optim(fn=objfun,
par=corrs,
targetcorrs=corrs,probs=c(0.5,0.5))
opt1$value ## 0.0208
在“超過最大迭代次數”的501次迭代后停止。 這將永遠不會很好,因為我們試圖在隨機目標函數上使用確定性爬山算法......
cc1 <- cor(sim(1000,probs=c(0.5,0.5),corrs=opt1$par))
cc1[lower.tri(cc1)]
corrs
也許嘗試模擬退火?
opt2 <- optim(fn=objfun,
par=corrs,
targetcorrs=corrs,probs=c(0.5,0.5),
method="SANN")
它似乎沒有比以前的值好多少。 兩個可能的問題(留給讀者的練習)(1)我們已經指定了一組與我們選擇的邊際分布不可行的相關性,或者(2)目標函數表面中的誤差是在方式 - 為了做得更好,我們必須平均更多的重復(即增加n
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.