Create a correlation matrix

genCorMat(nvars, cors = NULL, rho = NULL, corstr = "cs", nclusters = 1)

Arguments

nvars

number of rows and columns (i.e. number of variables) for correlation matrix. It can be a scalar or vector (see details).

cors

vector of correlations.

rho

Correlation coefficient, -1 <= rho <= 1. Use if corMatrix is not provided. It can be a scalar or vector (see details).

corstr

Correlation structure. Options include "cs" for a compound symmetry structure, "ar1" for an autoregressive structure of order 1, "arx" for an autoregressive structure that has a general decay pattern, and "structured" that imposes a prescribed pattern between observation based on distance (see details).

nclusters

An integer that indicates the number of matrices that will be generated.

Value

A single correlation matrix of size nvars x nvars, or a list of matrices of potentially different sizes with length indicated by nclusters.

Details

This function can generate correlation matrices randomly or deterministically, depending on the combination of arguments provided. A single matrix will be generated when nclusters == 1 (the default), and a list of matrices of matrices will be generated when nclusters > 1.

If the vector `cors` is specified with length `nvars - 1` then `corstr` must be "structured". If `cors` is specified with length `choose(nvars, 2)` then `corstr` should not be specified as "structured". In this case the `cors` vector should be interpreted as the lower triangle of the correlation matrix, and is specified by reading down the columns. For example, if CM is the correlation matrix and nvars = 3, then CM[2,1] = CM[1,2] = cors[1], CM[3,1] = CM[1,3] = cors[2], and CM[3,2] = CM[2,3] = cors[3].

If the vector cors and rho are not specified, random correlation matrices are generated based on the specified corstr. If the structure is "arx", then a random vector of length nvars - 1 is randomly generated and sorted in descending order; the correlation matrix will be generated base on this set of structured correlations. If the structure is not specified as "arx" then a random positive definite of dimensions nvars x nvars with no structural assumptions is generated.

If cors is not specified but rho is specified, then a matrix with either a "cs" or "ar1" structure is generated.

If nclusters > 1, nvars can be of length 1 or nclusters. If it is of length 1, each cluster will have correlation matrices with the same dimension. Likewise, if nclusters > 1, rho can be of length 1 or nclusters. If length of rho is 1, each cluster will have correlation matrices with the same autocorrelation.

Examples

genCorMat(nvars = 3, cors = c(.3, -.2, .1))
#>      [,1] [,2] [,3]
#> [1,]  1.0  0.3 -0.2
#> [2,]  0.3  1.0  0.1
#> [3,] -0.2  0.1  1.0
genCorMat(nvars = 3)
#>             [,1]        [,2]        [,3]
#> [1,]  1.00000000 -0.08843007 -0.19069177
#> [2,] -0.08843007  1.00000000 -0.06935815
#> [3,] -0.19069177 -0.06935815  1.00000000

genCorMat(nvars = 4, c(.3, -.2, .1, .2, .5, .2))
#>      [,1] [,2] [,3] [,4]
#> [1,]  1.0  0.3 -0.2  0.1
#> [2,]  0.3  1.0  0.2  0.5
#> [3,] -0.2  0.2  1.0  0.2
#> [4,]  0.1  0.5  0.2  1.0
genCorMat(4)
#>             [,1]         [,2]        [,3]         [,4]
#> [1,]  1.00000000  0.125438169 -0.09578247  0.236384120
#> [2,]  0.12543817  1.000000000 -0.02890101 -0.005119921
#> [3,] -0.09578247 -0.028901015  1.00000000 -0.108327495
#> [4,]  0.23638412 -0.005119921 -0.10832750  1.000000000

genCorMat(nvars = 4, cors = c(.3, .2, .1), corstr = "structured") 
#>      [,1] [,2] [,3] [,4]
#> [1,]  1.0  0.3  0.2  0.1
#> [2,]  0.3  1.0  0.3  0.2
#> [3,]  0.2  0.3  1.0  0.3
#> [4,]  0.1  0.2  0.3  1.0
genCorMat(nvars = 4, corstr = "arx") 
#>           [,1]      [,2]      [,3]      [,4]
#> [1,] 1.0000000 0.2800697 0.2371498 0.1652609
#> [2,] 0.2800697 1.0000000 0.2800697 0.2371498
#> [3,] 0.2371498 0.2800697 1.0000000 0.2800697
#> [4,] 0.1652609 0.2371498 0.2800697 1.0000000

genCorMat(nvars = 4, rho = .4, corstr = "cs") 
#>      [,1] [,2] [,3] [,4]
#> [1,]  1.0  0.4  0.4  0.4
#> [2,]  0.4  1.0  0.4  0.4
#> [3,]  0.4  0.4  1.0  0.4
#> [4,]  0.4  0.4  0.4  1.0
genCorMat(nvars = 4, rho = .4, corstr = "ar1") 
#>       [,1] [,2] [,3]  [,4]
#> [1,] 1.000 0.40 0.16 0.064
#> [2,] 0.400 1.00 0.40 0.160
#> [3,] 0.160 0.40 1.00 0.400
#> [4,] 0.064 0.16 0.40 1.000

genCorMat(nvars = c(3, 2, 5), rho = c(.4, .8, .7), corstr = "ar1", nclusters = 3) 
#> $`1`
#>      [,1] [,2] [,3]
#> [1,] 1.00  0.4 0.16
#> [2,] 0.40  1.0 0.40
#> [3,] 0.16  0.4 1.00
#> 
#> $`2`
#>      [,1] [,2]
#> [1,]  1.0  0.8
#> [2,]  0.8  1.0
#> 
#> $`3`
#>        [,1]  [,2] [,3]  [,4]   [,5]
#> [1,] 1.0000 0.700 0.49 0.343 0.2401
#> [2,] 0.7000 1.000 0.70 0.490 0.3430
#> [3,] 0.4900 0.700 1.00 0.700 0.4900
#> [4,] 0.3430 0.490 0.70 1.000 0.7000
#> [5,] 0.2401 0.343 0.49 0.700 1.0000
#>