2017-01-30 3 views
2

안녕하세요 저는 60 개의 변수에 대해 상관 된 이진 데이터 (0/1)를 한 번에 생성하고 싶습니다. bindatamvrnorm과 같은 패키지를 사용해 보았습니다.하지만 저는 보통 임의의 상관 행렬을 제공하는 것이 옳지 않습니다. (나는 잘린 정규 분포에서 그것을 만들려고했다.)공분산 행렬의 사양과 상관 데이터의 시뮬레이션

필자가 원하는 것은 내 변수들 사이의 평균 상관 관계를 0.7과 같이 지정하고 몇 가지 음의 상관 관계도 지정하는 것이다. 그게 가능하니? 감사합니다

편집 : 내 스크립트

set.seed(1) 
mymatrix <- matrix(rnorm(25, mean=0.7, sd=0.2), ncol=5) # random matrix mean 0.7 
mymatrix[lower.tri(mymatrix)] = t(mymatrix)[lower.tri(mymatrix)] # make it symmetric 
mymatrix[mymatrix>1]<-0.7 # make numbers between 0 and 1 
mymatrix[mymatrix<0]<-0.7 
library(bindata) 
res=rmvbin(1000, margprob=diag(mymatrix), bincorr = mymatrix) 
#### Error in commonprob2sigma(commonprob, simulvals) : 
#### Matrix commonprob not admissible. 
+1

으로 할 수 있습니다. 장난감 예제를 제공하고 "임의의 상관 관계 행렬을 제공하는 것이 맞지 않다"는 정확한 텍스트를 제공해야 할 것입니다. – lmo

+0

@lmo 감사합니다. 편집을 참조하십시오 .. 답변을 주셔서 감사합니다. – agenis

답변

1

귀하의 매트릭스 (스 니펫에서 myMatrix라는)은 명확한 긍정적되지이며, 유효한 공분산 행렬의 대각선 항목으로 유효한 상관 행렬되고 혼자 내버려 둘 수 없어 1이 아닙니다. 랜덤 행렬에 전치를 곱하여 무작위 공분산 행렬을 만들어 적어도 양의 값을 가지도록하십시오. 상관 행렬을 생성하려면 그에 따라 공분산 행렬을 다시 스케일링해야합니다. 예로, 특정 상관 관계 구조 베르누이 변수 벡터를 생성하는 원래의 문제에 관해서

rmat <- matrix(rnorm(25),5,5) 
cov_mat <- rmat%*%t(rmat) 
corr_mat <- cov_mat/sqrt(diag(cov_mat)%*%t(diag(cov_mat))) 

다음 article 참조. 기본적으로 Gaussian copula를 사용해야합니다. Bernoulli의 경우 각 변수 쌍에 대해 상대적으로 간단한 대수입니다. 나는 위에서 언급 한 패키지들이 당신을 위해서 그런 것 같아요.

[편집] 베르누이 벡터의 경우 모든 상관 행렬을 사용할 수있는 것은 아닙니다. 한계 확률이 각각 0.5 인 간단한 세 가지 변수를 생각해보십시오. 간단한 대수학을하면 (X_i, X_j)의 상관 관계가 4E [X_i X_j] -1이됩니다. 그들은 각 쌍에 대해 [-1,1]의 범위 내에 있습니다. 모든 i, j에 대해 (X_i, X_j)의 상관 관계가 -0.5가되기를 원한다고 가정하십시오. 모든 i, j가 같지 않으면 E [X_i X_j] = 1/8이 필요합니다. 각각의 서브 세트가 샘플 공간의 절반을 덮고 각각의 쌍이 샘플 공간의 1/8 밖에 겹치지 않는 샘플 공간의 3 개 서브 세트의 Venn 도표를 그릴 경우, 이것이 논리적으로 불가능하다는 것을 쉽게 알 수 있습니다.

따라서 결론은 함수에 대해 논리적으로 가능한 2 진 상관 행렬을 제공해야한다는 것입니다. 유효한 상관 행렬이 될 수 없습니다. 특정 상관 계수에 대해 신경 쓰지 않는다면 유효한 상관 매트릭스와 함께 Gaussian copula를 사용하십시오. 관심있는 패키지는

rmvbin(1000,margprob=rep(0.5,5),sigma=corr_mat) 
+0

첫 번째 단락을 이해하지만 언급 한 기사는 너무 복잡하여 수학 지식이 너무 복잡합니다 .... 수정 코드로 내 코드를 재실행하려했지만 : "경고 : 결과 공분산 행렬이 양의 값이 아닙니다."반환 된 모든 값은 NA입니다. – agenis

+0

위의 EDIT를 참조하십시오. – Julius

+0

맞습니다. 나는 그 포스트를 편집 할 것이다. 감사! – Julius

관련 문제