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. ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.