Warm tip: This article is reproduced from stackoverflow.com, please click

发布于 2020-03-27 15:43:36

I am trying to make a random matrix correlation over 183 variables to calculate a Cholesky decomposition and correlate 183 random normals. For the creation of the correlation matrix the following reproducible code is the one I am using:

First I set the seed

```
set.seed(2)
```

Then I generate random numbers between 0.6 and 0.8

```
corr <- matrix(runif(183*183, min = 0.6, max = 0.8), 183, 183)
```

The next step is turning the diagonal into ones

```
for (i in 1:183) {
for (j in 1:183) {
if (i == j) {
corr[i,j] <- 1
}
}
}
```

Last step is making it symmetric

```
for (i in 1:183) {
for (j in 1:183) {
if (i < j) {
corr[i,j] <- corr[j,i]
}
}
}
```

The problem I run into arise when I try to make the cholesky decomposition

```
cholesky <- chol(corr)
```

I get the following error:

Error in chol.default(corr) : the leading minor of order 14 is not positive definite

How could I make my correlation matrix semi definite positive?

Questioner

Mauro

Viewed

68

Maybe you can try the code below to generate semi-definite positive matrix

```
set.seed(2)
v <- runif(183,0.6,0.8)
corr <- `diag<-`(tcrossprod(v),1)
```

chinsoon122020-01-31 17:38:46upvoted. maybe can improve on the answer by referring to literature on numerical stability of covariance matrices. and why using t(X) %*% X helps to generate a stable one