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

Peter Dalgaard p.dalgaard at biostat.ku.dk
Sun Dec 12 14:58:38 CET 2004

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.

Er, a correlation matrix *is* a covariance matrix with 1 down the

You need to sort out the parametrization issues. What you're trying to
achieve is quite hard. Consider the simpler case of two blocks and
n=2; what you're asking for is a covariance matrix of the form

1 r a 0
r 1 0 a
a 0 1 r
0 a r 1

so if this is the correlation matrix of (X1,Y1,X2,Y2) you want

X1 and Y1 correlated 
X2 and Y2 correlated
X1 and X2 correlated
Y1 and Y2 correlated


X1 and Y2 uncorrelated
Y1 and X2 uncorrelated

One approach is to work out the conditional variance of (X2,Y2) given
(X1,Y1) and check for positive semidefiniteness. You do the math...

(Some preliminary experiments suggest that the criterion could be
abs(a)+abs(r) <= 1, but don't take my word for it)

> R-version used :
> ---------------
> Windows version
> R-1.8.1
> Running on Windows XP

You might want to upgrade, but it might not do anything for you in
this respect.

   O__  ---- Peter Dalgaard             Blegdamsvej 3  
  c/ /'_ --- Dept. of Biostatistics     2200 Cph. N   
 (*) \(*) -- University of Copenhagen   Denmark      Ph: (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk)             FAX: (+45) 35327907

More information about the R-help mailing list