Thanks Ravi -- with my limited linear algebra skills I was assuming invertible symmetric was sufficient (rather than just necessary) for positive definiteness. So, the open challenge is to generate a pd matrix of dimension 100 with r_ij = 1 if i=j else -1< r_ij< 1, with about 10% of the elements >.9.
I tried for a bit without luck, but I can offer another way to generate a pd matrix: ev <- runif(100) # choose some positive eigenvalues U <- svd(matrix(runif(10000), nc=100))$u # an orthogonal matrix pdM <- U %*% diag(ev) %*% t(U) Kingsford On Fri, Aug 28, 2009 at 9:41 PM, Ravi Varadhan<rvarad...@jhmi.edu> wrote: > Hi Kingsford, > > There is more structure to a correlation matrix than that meets the eye! > Your method will produce a matrix R that looks "like" a correlation matrix, > but beware - it is an impostor! > > You can obtain a valid correlation matrix, Q, from the impostor R by using > the `nearPD' function in the "Matrix" package, which finds the positive > definite matrix Q that is "nearest" to R. However, note that when R is far > from a positive-definite matrix, this step may give a Q that does not have > the desired property. > > require(Matrix) > > R <- matrix(runif(16), ncol=4) > > R <- (R * lower.tri(R)) + t(R * lower.tri(R)) > > diag(R) <- 1 > > eigen(R)$val > > Q <- nearPD(R, posd.tol=1.e-04)$mat > > eigen(Q)$val > > max(abs(Q - R)) # maximum discrepancy between R and Q > > Another easy way to produce a valid correlation matrix is: > > R <- matrix(runif(36), ncol=6) > > RtR <- R %*% t(R) > > Q <- cov2cor(RtR) > > But this does not have the property that the correlations are uniformly > distributed. > > Hope this helps, > Ravi. > > ____________________________________________________________________ > > Ravi Varadhan, Ph.D. > Assistant Professor, > Division of Geriatric Medicine and Gerontology > School of Medicine > Johns Hopkins University > > Ph. (410) 502-2619 > email: rvarad...@jhmi.edu > > > ----- Original Message ----- > From: Kingsford Jones <kingsfordjo...@gmail.com> > Date: Friday, August 28, 2009 10:12 pm > Subject: Re: [R] how to generate a random correlation matrix with > restrictions > To: Ning Ma <pnin...@gmail.com> > Cc: r-help@r-project.org > > >> Ahh -- Mark Leeds just pointed out off-list that it was supposed to be >> a correlation matrix. >> >> Perhaps >> >> R <- matrix(runif(10000), ncol=100) >> R <- (R * lower.tri(R)) + t(R * lower.tri(R)) >> diag(R) <- 1 >> >> These are of course uniformly distributed positive correlations. >> >> Kingsford >> >> >> On Fri, Aug 28, 2009 at 7:36 PM, Kingsford >> Jones<kingsfordjo...@gmail.com> wrote: >> > R <- matrix(runif(10000), ncol=100) >> > >> > hth, >> > >> > Kingsford Jones >> > >> > On Fri, Aug 28, 2009 at 7:26 PM, Ning Ma<pnin...@gmail.com> wrote: >> >> Hi, >> >> >> >> How can I generate a random 100x100 correlation matrix, R={r_ij}, >> >> where about 10% of r_ij are greater than 0.9 >> >> >> >> Thanks in advance. >> >> >> >> ______________________________________________ >> >> R-help@r-project.org mailing list >> >> >> >> PLEASE do read the posting guide >> >> and provide commented, minimal, self-contained, reproducible code. >> >> >> > >> >> ______________________________________________ >> R-help@r-project.org mailing list >> >> PLEASE do read the posting guide >> and provide commented, minimal, self-contained, reproducible code. > ______________________________________________ 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.