# Re: [R] constructing arbitrary (positive definite) covariance matrix

From: Gabor Grothendieck <ggrothendieck_at_gmail.com>
Date: Thu, 26 Jun 2008 18:48:25 -0400

Not sure if this is sufficient but nearcor in the sfsmisc package will find the nearest correlation matrix to a given matrix.

On Thu, Jun 26, 2008 at 12:11 PM, Mizanur Khondoker <Mizanur.Khondoker_at_ed.ac.uk> wrote:
> Dear list,
>
> I am trying to use the 'mvrnorm' function from the MASS package for
> simulating multivariate Gaussian data with given covariance matrix.
> The diagonal elements of my covariance matrix should be the same,
> i.e., all variables have the same marginal variance. Also all
> correlations between all pair of variables should be identical, but
> could be any value in [-1,1]. The problem I am having is that the
> matrix I create is not always positive definite (and hence mvrnorm
> fails).
>
> Is there any simple way of constructing covariance matrix of the above
> structure (equal variance, same pairwise correlation from [-1, 1])
> that will always be positive definite?
> I have noticed that covraince matrices created using the following COV
> function are positive definite for -0.5 < r <1. However, for r <
> -0.5, the matrix is not positive definite.
> Does anyone have any idea why this is the case? For my simualtion, I
> need to generate multivariate data for the whole range of r, [-1, 1]
> for a give value of sd.
>
> Any help/ suggestion would be greatly appreciated.
>
> Examples
> ########
> COV<-function (p = 3, sd = 1, r= 0.5){
> cov <- diag(sd^2, ncol=p, nrow=p)
> for (i in 1:p) {
> for (j in 1:p) {
> if (i != j) {
> cov[i, j] <- r * sd*sd
> }
> }
> }
> cov
> }
>
>> library(MASS)
>> ### Simualte multivarite gaussin data (works OK)
>> Sigma<-COV(p = 3, sd = 2, r= 0.5)
>> mu<-1:3
>> mvrnorm(5, mu=mu, Sigma=Sigma)
> [,1] [,2] [,3]
> [1,] 1.2979984 1.843248 4.460891
> [2,] 2.1061054 1.457201 3.774833
> [3,] 2.1578538 2.761939 4.589977
> [4,] 0.8775056 4.240710 2.203712
> [5,] 0.2698180 2.075759 2.869573
>>
>> ### Simualte multivarite gaussin data ( gives Error)
>> Sigma<-COV(p = 3, sd = 2, r= -0.6)
>> mu<-1:3
>> mvrnorm(5, mu=mu, Sigma=Sigma)
> Error in mvrnorm(5, mu = mu, Sigma = Sigma) :
> 'Sigma' is not positive definite
>
> --
> Mizanur Khondoker
> Division of Pathway Medicine (DPM)
> The University of Edinburgh Medical School
> The Chancellor's Building
> 49 Little France Crescent
> Edinburgh EH16 4SB
> United Kingdom
>
> Tel: +44 (0) 131 242 6287
> Fax: +44 (0) 131 242 6244
> http://www.pathwaymedicine.ed.ac.uk/
>
> ______________________________________________
> R-help_at_r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help