2015-05-09 47 views
1

假設我有兩個分類變量AB,並且都有三個級別,1, 2, 30.2,0.30.5對於每個級別。我怎樣才能生成一個定義相關度爲0.3的A和B的隨機雙變量數據列表?我知道一個單變量A或B,我們可以做如何使用已定義的相關性生成雙變量分類變量?

A=sample(1:3, 100, T, prob=c(0.2,0.3,0.5)) 
B=sample(1:3, 100, T, prob=c(0.2,0.3,0.5)) 

我的問題是如何採樣cbind(A,B)cor(A,B)=0.3

+0

你要正確對待A和B作爲連續計算相關性時?或者你想用什麼樣的相關度量來處理離散/分類數據?你是否假設序數據? – MrFlick

+0

只是假設皮爾遜的相關性。 –

+1

只需自己定義聯合概率矩陣即可。從那裏,抽樣非常簡單。 – Frank

回答

3

下面是一個例子概率矩陣。 (你自己將取決於您選擇的型號。)

# describe probabilities over the space by a matrix 
set.seed(1) 
nA <- 3 
nB <- 3 
probmat <- matrix({r<-runif(nA*nB);r/sum(r)},ncol=nB) 
#   [,1]  [,2]  [,3] 
# [1,] 0.04868724 0.16654119 0.1732284 
# [2,] 0.06823764 0.03698311 0.1211728 
# [3,] 0.10504609 0.16474081 0.1153628 

下面是從中得出樣品的一種方法:

# rearrange 
probs <- c(probmat) 
events <- as.matrix(expand.grid(A=1:nA,B=1:nB)) 

# draw samples 
nSamp <- 100 
samp <- events[sample.int(nA*nB,nSamp,prob=probs,replace=TRUE),] 
2

下面的代碼是this artical的等效R代碼,用matlab實例。您可以使用應用pnorm()cut()到列得到相關的離散隨機變量

# parameters 
nrows <- 10 

# The desired correlation matrix 
(M <- matrix(c(1.0,0.6,0.3, 
        0.6,1.0,0.5, 
        0.3,0.5,1.0),byrow=T,ncol=3)) 


#>  [,1] [,2] [,3] 
#> [1,] 1.0 0.6 0.3 
#> [2,] 0.6 1.0 0.5 
#> [3,] 0.3 0.5 1.0 

(U = chol(M)) 
#>  [,1] [,2]  [,3] 
#> [1,] 1 0.6 0.3000000 
#> [2,] 0 0.8 0.4000000 
#> [3,] 0 0.0 0.8660254 

# generate a random matrix where columns have the desired correlatoin structure 
matrix(rnorm(nrows*ncol(M)),ncol=ncol(M))%*%U 

#> -0.4326 -0.4089 0.0505 
#> -1.6656 -0.4187 -1.3665 
#> 0.1253 -0.3955 0.4209 
#> 0.2877 1.9192 2.3656 
#> -1.1465 -0.7970 -0.9976 
#> 1.1909 0.8057 1.1459 
#> 1.1892 1.5669 1.8695 
#> -0.0376 0.0248 -1.3678 
#> 0.3273 0.1199 -1.1880 
#> 0.1746 -0.5611 0.2141 


# check that this works 
cor(matrix(rnorm(1000000*ncol(M)),ncol=ncol(M))%*%U) 

#>   [,1]  [,2]  [,3] 
#> [1,] 1.0000000 0.5988445 0.2987633 
#> [2,] 0.5988445 1.0000000 0.4992603 
#> [3,] 0.2987633 0.4992603 1.0000000 
+0

謝謝,@Jthorpe!但是我想這些變量是分類或序數。一些解決方案呢? –