R/lav_syntax_independence.R

Defines functions lav_syntax_independence

# generate syntax for an independence model
lav_syntax_independence <- function(ov.names=character(0),
                                    ov.names.x=character(0),
                                    sample.cov=NULL) {

    ov.names.nox <- ov.names[!ov.names %in% ov.names.x]
    nvar <- length(ov.names.nox)
    lv.names <- paste("f", 1:nvar, sep="")

    # check sample.cov
    if(!is.null(sample.cov)) {
        if(is.list(sample.cov)) {
            ngroups <- length(sample.cov)
        } else {
            ngroups <- 1L
            sample.cov <- list(sample.cov)
        }
        stopifnot(is.matrix(sample.cov[[1]]))
        #stopifnot(length(ov.names) == nrow(sample.cov[[1]]))
        # FIXME: check rownames and reorder...
    }

    # construct lavaan syntax for an independence model
    txt <- "# independence model\n"

    # =~ lines (each observed variables has its own latent variable)
    # excepct for ov's that are in ov.names.x
    txt <- paste(txt, paste(lv.names, " =~ 1*", ov.names.nox,
                            "\n", sep="", collapse=""), sep="")

    # residual ov variances fixed to zero
    txt <- paste(txt, paste(ov.names.nox, " ~~ 0*", ov.names.nox,
                            "\n", sep="", collapse=""), sep="")

    # latent variances
    if(is.null(sample.cov)) {
        txt <- paste(txt, paste(lv.names, " ~~ ", lv.names,
                            "\n", sep="", collapse=""), sep="")
    } else {
        # fill in sample values
        ov.idx <- match(ov.names.nox, ov.names)

        start.txt <- paste("start(c(",
            apply(matrix(unlist(lapply(sample.cov, function(x) {
                                       diag(x)[ov.idx] })),
                  ncol=ngroups), 1,paste,collapse=","), "))", sep="")
        txt <- paste(txt, paste(lv.names, " ~~ ", start.txt, " * ",
                                lv.names,
                                "\n", sep="", collapse=""), sep="")
    }

    # latent *covariances* fixed to zero (= independence!)
    if(length(lv.names) > 1L) {
        tmp <- utils::combn(lv.names, 2)
        txt <- paste(txt, paste(tmp[1,], " ~~ 0*", tmp[2,], "\n", sep="",
                                collapse=""), sep="")
    }

    # if 'independent x' variables, add an 'empty' regression
    if((nx <- length(ov.names.x)) > 0) {
        # dummy regression line
        txt <- paste(txt, paste("f1 ~ 0*", ov.names.x,
                                "\n", sep="", collapse=""), sep="")
    }

    # Note: no need to pass starting values here, lavaanStart will
    # use the sample statistics anyway....

    txt
}

Try the lavaan package in your browser

Any scripts or data that you put into this service are public.

lavaan documentation built on July 26, 2023, 5:08 p.m.