# [R] Help : generating correlation matrix with a particular structure

Spencer Graves spencer.graves at pdf.com
Sun Dec 12 17:41:20 CET 2004

```      Extending what Gabor and Peter have already said, the following
should provide a partial solution:

patternCor3 <- function(A=diag(2), a=1:3){
# nk x nk covariance & correlation matrices
# k = length(a); abs(a) <= min(diag(A)
minV.A <- min(diag(A))
warning("abs(a) too large;  can't exceed",
" min(diag(A)) = ", minV.A,
";  forced into that range.")
}
Aa <- kronecker(diag(3), A)
n <- dim(A)
i1 <- n+1:n
i2 <- n+i1
diag(Aa[1:n, i1]) <- a
diag(Aa[i1, 1:n]) <- a
diag(Aa[1:n, i2]) <- a
diag(Aa[i2, 1:n]) <- a
diag(Aa[i1, i2]) <- a
diag(Aa[i2, i1]) <- a
s.A <- sqrt(diag(A))
r.Aa <- (Aa/outer(rep(s.A,3), rep(s.A,3)))
eig.Aa <- eigen(Aa)
list(Aa=Aa, corr.Aa=r.Aa, eigen.Aa=eig.Aa)
}

If this works, all(eigen.Aa\$values>=0).  Thus, you can add a test
for this and have something close to what you want.  You could add an
objective function that includes these eigenvalues with, say, minimum
adjustment of "a" and feed it to "optim" and let "optim" find a solution
that is "closest" in whatever sense you think is useful.

hope this helps.  spencer graves

Gabor Grothendieck wrote:

>Siew Leng TENG <siewlengteng <at> yahoo.com> writes:
>
>:
>: Hi,
>:
>: I would like to generate a correlation matrix with a
>: particular structure. For example, a 3n x 3n matrix :
>: A_(nxn)   aI_(nxn)  bI_(nxn)
>: aI_(nxn)  A_(nxn)   cI_(nxn)
>: aI_(nxn)  cI_(nxn)  A_(nxn)
>:
>: where
>: - A_(nxn) is a *specified* symmetric, positive
>: definite nxn matrix.
>: - I_(nxn) is an identity matrix of order n
>: - a, b, c are (any) real numbers
>:
>: Many attempts have been unsuccessful because a
>: resulting matrix with any a, b, c may not be a
>: positive definite one, and hence cannot qualify as a
>: correlation matrix. Trying to first generate a
>: covariance matrix however, does not guarantee a
>: corresponding correlation matrix with the above
>: structure.
>:
>: My larger purpose is to use this correlation matrix to
>: generate multivariate normal observations from the
>: corresponding covariance matrix (derived via cholesky
>: decomposition of the cor matrix).
>
>This can be formulated a semidefinite programming problem.
>I don't think R has any packages that do that but a google
>some free non-R software which you could consider interfacing
>to R.
>
>______________________________________________
>R-help at stat.math.ethz.ch mailing list
>https://stat.ethz.ch/mailman/listinfo/r-help