R: Generate data via the Kaiser-Dickman (1962) algorithm.

kd {semTools} | R Documentation

## Generate data via the Kaiser-Dickman (1962) algorithm.

### Description

Given a covariance matrix and sample size, generate raw data that correspond to the covariance matrix. Data can be generated to match the covariance matrix exactly, or to be a sample from the population covariance matrix.

### Usage

    kd(covmat, n, type = c("exact", "sample"))

### Arguments

`covmat` | a symmetric, positive definite covariance matrix
`n` | the sample size for the data that will be generated
`type` | type of data generation. `exact` generates data that exactly correspond to `covmat`. `sample` treats `covmat` as a poulation covariance matrix, generating a sample of size `n`.

### Details

By default, R's `cov()` function divides by `n`-1. The data generated by this algorithm result in a covariance matrix that matches `covmat`, but you must divide by `n` instead of `n`-1.

### Value

`kd` returns a data matrix of dimension `n` by `nrow(covmat)`.

### Author(s)

Ed Merkle (University of Missouri; merklee@missouri.edu)

### References

Kaiser, H. F. and Dickman, K. (1962). Sample and population score matrices and sample correlation matrices from an arbitrary population correlation matrix. Psychometrika, 27(2), 179–182. doi:10.1007/BF02289635

### Examples

    #### First Example

    ## Get data
    dat <- HolzingerSwineford1939[ , 7:15]
    hs.n <- nrow(dat)

    ## Covariance matrix divided by n
    hscov <- ((hs.n-1)/hs.n) * cov(dat)

    ## Generate new, raw data corresponding to hscov
    newdat <- kd(hscov, hs.n)

    ## Difference between new covariance matrix and hscov is minimal
    newcov <- (hs.n-1)/hs.n * cov(newdat)
    summary(as.numeric(hscov - newcov))

    ## Generate sample data, treating hscov as population matrix
    newdat2 <- kd(hscov, hs.n, type = "sample")

    #### Another example

    ## Define a covariance matrix
    covmat <- matrix(0, 3, 3)
    diag(covmat) <- 1.5
    covmat[2:3,1] <- c(1.3, 1.7)
    covmat[3,2] <- 2.1
    covmat <- covmat + t(covmat)

    ## Generate data of size 300 that have this covariance matrix
    rawdat <- kd(covmat, 300)

    ## Covariances are exact if we compute sample covariance matrix by
    ## dividing by n (vs by n - 1)
    summary(as.numeric((299/300)*cov(rawdat) - covmat))

    ## Generate data of size 300 where covmat is the population covariance matrix
    rawdat2 <- kd(covmat, 300)

[Package semTools version 0.5-0 Index]