簡體   English   中英

使用它們之間給定的相關性生成隨機變量:

[英]Generating Random Variables with given correlations between pairs of them:

我想生成2個連續隨機變量Q1Q2 (數量特征,每個都是正常的)和2個二元隨機變量Z1Z2 (二元特征),它們之間具有給定的成對相關性。

(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM