[R] generating random covariance matrices (with a uniform distribution of correlations)

Petr Savicky savicky at praha1.ff.cuni.cz
Fri Jun 3 09:01:07 CEST 2011


On Thu, Jun 02, 2011 at 04:42:59PM -0700, Ned Dochtermann wrote:
> List members,
> 
> Via searches I've seen similar discussion of this topic but have not seen
> resolution of the particular issue I am experiencing. If my search on this
> topic failed, I apologize for the redundancy. I am attempting to generate
> random covariance matrices but would like the corresponding correlations to
> be uniformly distributed between -1 and 1. 
> 
> The approach I have been using is:
> 
> 	> st.dev<-.5 #this and k are aspects I would like to vary
> 	> k<-6 #number of... things
> 	> y1<-matrix(rnorm(k^2,mean=0,sd=st.dev),k)
> 	> y1<-t(y1)%*%y1
> 
> This produces positive definite symmetrical matrices, which is what I want.
> However, the following:
> 
> 	> k<-6; kk<-(k*(k-1))/2; st.dev<-.5
> 	> x<-matrix(0,5000,kk)
> 	> for(i in 1:5000){
> 	> y1<-matrix(rnorm(k^2,mean=0,sd=st.dev),k)
> 	> y1<-t(y1)%*%y1
> 	> y1<-y1/k #this keeps the variances similar across different k's 
> 	> y1<-cov2cor(y1)
> 	> x[i,]<- y1[lower.tri(y1)]
> 	> }
> 	> hist(c(x))
> 
> demonstrates that the distribution of corresponding correlations is not
> uniformly distributed between -1 and 1 (of course there is no reason to
> suspect that it would be). I have tried using both rcorrmatrix and
> genPositiveDefMat in the "clusterGeneration" package but even when picking
> the "unifcorrmat" option and setting "alphad" to 1, the distribution of
> correlations is not uniform.
> 
> Any recommendations on how to generate the desired covariance matrices would
> be appreciated.

Hello.

Let me suggest the following procedure.

1. Generate a symmetric matrix A with the desired distribution of the
   non-diagonal elements and with zeros on the diagonal.
2. Compute the smallest eigenvalue lambda_1 of A.
3. Replace A by A + t I, where I is the identity matrix and t is a
   number such that t + lambda_1 > 0.

The resulting matrix will have the same non-diagonal elements as A,
but will be positive definite.

Petr Savicky.



More information about the R-help mailing list