generating random covariance matrices (with a uniform distribution of correlations)
On Fri, Jun 03, 2011 at 01:54:33PM -0700, Ned Dochtermann wrote:
Petr,
This is the code I used for your suggestion:
k<-6;kk<-(k*(k-1))/2
x<-matrix(0,5000,kk)
for(i in 1:5000){
A.1<-matrix(0,k,k)
rs<-runif(kk,min=-1,max=1)
A.1[lower.tri(A.1)]<-rs
A.1[upper.tri(A.1)]<-t(A.1)[upper.tri(A.1)]
cors.i<-diag(k)
t<-.001-min(Re(eigen(A.1)$values))
new.cor<-cov2cor(A.1+(t*cors.i))
x[i,]<-new.cor[lower.tri(new.cor)]}
hist(c(x)); max(c(x)); median(c(x))
This, unfortunately, does not maintain the desired distribution of
correlations.
I see. I overlooked that you require correlations and not covariances. The distribution of correlations cannot be chosen arbitrarily, since it is not possible to have k variables, such that each two of them have correlation less than -1/(k-1). For example, it is not possible that all pairs among 3 variables have correlation less than -0.5. The reason is as follows. If X_1, ..., X_k have mean 0, variance 1 and all pairs have correlation at most c, then E (X_1 + ... + X_k)^2 <= k(1 + (k-1)c) If c < -1/(k-1), then the right hand side is negative, which is not possible. Can you relax the requirement on the negative correlations? Petr.