Title: | Path Diagrams and Visual Analysis of Various SEM Packages' Output |
---|---|
Description: | Path diagrams and visual analysis of various SEM packages' output. |
Authors: | Sacha Epskamp [aut, cre], Simon Stuber [ctb], Jason Nak [ctb], Myrthe Veenman [ctb], Terrence D. Jorgensen [ctb] |
Maintainer: | Sacha Epskamp <[email protected]> |
License: | GPL-2 |
Version: | 1.1.5 |
Built: | 2024-11-14 04:00:02 UTC |
Source: | https://github.com/sachaepskamp/semplot |
Path diagrams and visual analysis of various SEM packages' output. Path diagrams including visualizations of the parameter estimates can be plotted with semPaths
and visualizations of the implied and observed correlation structures can be plotted using semCors
. Finally, SEM syntax can be generated usingsemSyntax
.
For plotting the graphs the qgraph
package is used.
Sacha Epskamp ([email protected])
Maintainer: Sacha Epskamp <[email protected]>
github.com/SachaEpskamp/semPlot
The package regsem (Jacobucci, 2017) is designed for a specific type of SEM called regularized structural equation modelling (RegSEM). For more information about RegSEM and the implementation in R we refer to the manual written by Jacobucci (2017).This function creates a bridge between the regsem and semplot packages, making it possible to use output from the regsem() and cv_regsem() functions to create models in sempaths.
## S3 method for class 'cvregsem' semPlotModel(object,model,...)
## S3 method for class 'cvregsem' semPlotModel(object,model,...)
object |
The regsem output |
model |
The cfa output used as input for the cv_regsem function |
... |
Arguments sent to 'lisrelModel', not used in other methods. |
A 'semPlotModel' object.
Sacha Epskamp <[email protected]> Jason Nak <[email protected]> Myrthe Veenman <[email protected]>
Jacobucci, R. (2017). regsem: Regularized Structural Equation Modeling. arXiv preprint arXiv:1703.08489.
## Example of fitting and plotting a cv_regsem model in semPaths #library(psych) #library(lavaan) #library(regsem) # use a subset of the BFI #bfi2 <- bfi[1:250,c(1:5,18,22)] #bfi2[,1] <- reverse.code(-1,bfi2[,1]) # specify a SEM model #mod <- " #f1 =~ NA*A1+A2+A3+A4+A5+O2+N3 #f1~~1*f1 #" # fit the model #fit <- cfa(mod, bfi2) #out.reg <- cv_regsem(fit, type="lasso", pars_pen=c(1:7), n.lambda=23, jump =.05) # plot the model #semPaths(semPlotModel.cvregsemplot(object = out.reg, model = fit))
## Example of fitting and plotting a cv_regsem model in semPaths #library(psych) #library(lavaan) #library(regsem) # use a subset of the BFI #bfi2 <- bfi[1:250,c(1:5,18,22)] #bfi2[,1] <- reverse.code(-1,bfi2[,1]) # specify a SEM model #mod <- " #f1 =~ NA*A1+A2+A3+A4+A5+O2+N3 #f1~~1*f1 #" # fit the model #fit <- cfa(mod, bfi2) #out.reg <- cv_regsem(fit, type="lasso", pars_pen=c(1:7), n.lambda=23, jump =.05) # plot the model #semPaths(semPlotModel.cvregsemplot(object = out.reg, model = fit))
This function can be used to more easilly compute I - X or (I - X)^(-1), which are common in SEM models.
Imin(x, inverse = FALSE)
Imin(x, inverse = FALSE)
x |
A matrix |
inverse |
Logical, should the inverse be taken? |
Sacha Epskamp <[email protected]>
This function creates a 'semPlotModel' object using matrices of the extended LISREL model (Joreskog & Sorbom, 1996). This function has two main purposes. First, it can be used to easilly create path diagrams of arbitrary SEM models without having to run an actual analysis. And second, it is specifically designed to work with the output of the 'lisrelToR' package (using do.call(lisrelModel,output$matrices)
). Using semPaths
or semPlotModel
on the file path of a LISREL output file will automatically first run readLisrel
and then this function.
lisrelModel(LY, PS, BE, TE, TY, AL, manNamesEndo, latNamesEndo, LX, PH, GA, TD, TX, KA, manNamesExo, latNamesExo, ObsCovs, ImpCovs, setExo, modelLabels = FALSE, reduce)
lisrelModel(LY, PS, BE, TE, TY, AL, manNamesEndo, latNamesEndo, LX, PH, GA, TD, TX, KA, manNamesExo, latNamesExo, ObsCovs, ImpCovs, setExo, modelLabels = FALSE, reduce)
LY |
Specification of the Lambda-Y matrix. See details. |
PS |
Specification of the Psi matrix. See details. |
BE |
Specification of the Beta matrix. See details. |
TE |
Specification of the Theta-Epsilon matrix. See details. |
TY |
Specification of the Tau-Y matrix. See details. |
AL |
Specification of the Alpha matrix. See details. |
manNamesEndo |
Character vector of names for the endogenous manifests. |
latNamesEndo |
Character vector of names for the endogenous latents. |
LX |
Specification of the Lambda-X matrix. See details. |
PH |
Specification of the Phi matrix. See details. |
GA |
Specification of the Gamma matrix. See details. |
TD |
Specification of the Theta-Delta matrix. See details. |
TX |
Specification of the Tau-X matrix. See details. |
KA |
Kappa |
manNamesExo |
Character vector of names for the exogenous manifests. |
latNamesExo |
Character vector of names for the exogenous latents. |
ObsCovs |
The observed covariance matrix, or a list of such matrices for each group. |
ImpCovs |
The implied covariance matrix, or a list of such matrices for each group. |
setExo |
Logical. If TRUE the 'exogenous' variable in the Variables data frame is specified. This forces |
modelLabels |
Logical. If TRUE all labels are set to the LISREL model matrix terms, as expressions. When plotted with |
reduce |
Logical indicating if the variable number should be reduced if multiple variables are named exactly the same. If TRUE (default) directed edges between nodes that are named the same are removed and the manifest node is kept, as this usually indicates a way to include manifest variables in regressions. |
The LISREL matrices can be assigned in various ways, depending on the amount of information that should be stored in the resulting model.
First, the a single matrix can be used. The values of this matrix correspond to the parameter estimates in the 'semPlotModel'. For multiple groups, a list of such matrices can be used.
to store more information, a named list of multiple matrices of the same dimensions can be used. Included in this list can be the following (but only estimates is nessesary):
est
Parameter estimates
std
standardized parameter estimates
par
Parameter numbers. 0 indicating fixed variables and parameters with the same parameter number are constrained to be equal.
fixed
Logical matrix indicating if the parameter is fixed.
If std
is missing the function tries to compute standardized solutions (not yet working for intercepts). If fixed
is missing it is computed from the par
matrix. For multiple groups, a list containing such lists can be used.
The number of variables is extracted from the assigned matrices. Matrices that are not assigned are assumed to be empty matrices of the appropriate dimensions. e.g., Lambda-Y is assumed to be a 0 by 0 matrix if there are no endogenous variables.
A 'semPlotModel' object.
Sacha Epskamp <[email protected]>
Joreskog, K. G., & Sorbom, D. (1996). LISREL 8 user's reference guide. Scientific Software.
https://github.com/SachaEpskamp/lisrelToR
semPlotModel
semCors
semPaths
ramModel
## Example of a Full LISREL model path diagram with the same number of exgenous ## and endogenous variables: # Lambda matrices: Loadings <- rbind(diag(1,2,2),diag(1,2,2),diag(1,2,2)) # Phi and Psi matrices: LatVar <- diag(1,2,2) # Beta matrix: Beta <- matrix(0,2,2) Beta[1,2] <- 1 # Theta matrices: ManVar <- diag(1,nrow(Loadings),nrow(Loadings)) # Gamma matrix: Gamma <- diag(1,2,2) # Tau matrices: ManInts <- rep(1,6) # Alpha and Kappa matrices: LatInts <- rep(1,2) # Combine model: mod <- lisrelModel(LY=Loadings,PS=LatVar,BE=Beta,TE=ManVar, LX=Loadings,PH=LatVar,GA=Gamma,TD=ManVar, TY=ManInts,TX=ManInts,AL=LatInts,KA=LatInts) # Plot path diagram: semPaths(mod, as.expression=c("nodes","edges"), sizeMan = 3, sizeInt = 1, sizeLat = 4) # Plot path diagram with more graphical options: semPaths(mod, as.expression=c("nodes","edges"), sizeMan = 3, sizeInt = 1, sizeLat = 4, label.prop=0.5, curve=0.5, bg="black", groups="latents", intercepts=FALSE, borders=FALSE, label.norm="O")
## Example of a Full LISREL model path diagram with the same number of exgenous ## and endogenous variables: # Lambda matrices: Loadings <- rbind(diag(1,2,2),diag(1,2,2),diag(1,2,2)) # Phi and Psi matrices: LatVar <- diag(1,2,2) # Beta matrix: Beta <- matrix(0,2,2) Beta[1,2] <- 1 # Theta matrices: ManVar <- diag(1,nrow(Loadings),nrow(Loadings)) # Gamma matrix: Gamma <- diag(1,2,2) # Tau matrices: ManInts <- rep(1,6) # Alpha and Kappa matrices: LatInts <- rep(1,2) # Combine model: mod <- lisrelModel(LY=Loadings,PS=LatVar,BE=Beta,TE=ManVar, LX=Loadings,PH=LatVar,GA=Gamma,TD=ManVar, TY=ManInts,TX=ManInts,AL=LatInts,KA=LatInts) # Plot path diagram: semPaths(mod, as.expression=c("nodes","edges"), sizeMan = 3, sizeInt = 1, sizeLat = 4) # Plot path diagram with more graphical options: semPaths(mod, as.expression=c("nodes","edges"), sizeMan = 3, sizeInt = 1, sizeLat = 4, label.prop=0.5, curve=0.5, bg="black", groups="latents", intercepts=FALSE, borders=FALSE, label.norm="O")
Create a "semMatriModel"
object. Use semMatrixAlgebra
to extract or compute with these models. The structure of "semMatriModel"
objects is chosen such that they can be used to create a semPlotModel-class
object using do.call
in combination with ramModel
, lisrelModel
or mplusModel
(not yet implemented). See details.
modelMatrices(object, model = "ram", endoOnly = FALSE)
modelMatrices(object, model = "ram", endoOnly = FALSE)
object |
A |
model |
Model to be used, |
endoOnly |
Only needed when the model is |
The "lisrel"
model uses the following matrix names: LY
, TE
, PS
, BE
, LX
, TD
, PH
, GA
, TY
, TX
, AL
and KA
. Regressions on manifest variables will cause dummy latents to be included in the model.
The "mplus"
model uses the following matrix names: Lambda
, Nu
, Theta
, Kappa
, Alpha
, Beta
, Gamma
and Psi
.
The "ram"
model uses the following matrix names: F
, A
and S
.
a "semMatriModel"
object
Sacha Epskamp <[email protected]>
semPlotModel
semPlotModel-class
semMatrixAlgebra
lisrelModel
ramModel
## Mplus user guide SEM example: outfile <- tempfile(fileext=".out") tryres <- try({ download.file("http://www.statmodel.com/usersguide/chap5/ex5.11.html",outfile) }) if (!is(tryres,"try-error")){ # Plot model: semPaths(outfile, intercepts = FALSE) # Extract RAM: RAM <- modelMatrices(outfile, "ram") semPaths(do.call(ramModel, RAM), as.expression = "edges", intercepts = FALSE) # Extract LISREL: LISREL <- modelMatrices(outfile, "lisrel") semPaths(do.call(lisrelModel, LISREL), as.expression = "edges", intercepts = FALSE) }
## Mplus user guide SEM example: outfile <- tempfile(fileext=".out") tryres <- try({ download.file("http://www.statmodel.com/usersguide/chap5/ex5.11.html",outfile) }) if (!is(tryres,"try-error")){ # Plot model: semPaths(outfile, intercepts = FALSE) # Extract RAM: RAM <- modelMatrices(outfile, "ram") semPaths(do.call(ramModel, RAM), as.expression = "edges", intercepts = FALSE) # Extract LISREL: LISREL <- modelMatrices(outfile, "lisrel") semPaths(do.call(lisrelModel, LISREL), as.expression = "edges", intercepts = FALSE) }
This function creates a 'semPlotModel' object using matrices of the RAM model (McArdle & McDonald, 1984).
ramModel(A, S, F, M, manNames, latNames, Names, ObsCovs, ImpCovs, modelLabels = FALSE)
ramModel(A, S, F, M, manNames, latNames, Names, ObsCovs, ImpCovs, modelLabels = FALSE)
A |
Specification of the assymmetric (A) matrix, see details. |
S |
Specification of the symmetric (S) matrix, see details. |
F |
Specification of the filter (F) matrix, see details. |
M |
Specification of the means (M) vector, see details. |
manNames |
Character vector of the manifest names. |
latNames |
Character vector of the latent names. |
Names |
Character vector containing all names. Defaults to |
ObsCovs |
Observed covariancem matrix. |
ImpCovs |
Implied covariancem matrix. |
modelLabels |
Logical. If |
The matrices can be assigned in various ways, depending on the amount of information that should be stored in the resulting model.
First, the a single matrix can be used. The values of this matrix correspond to the parameter estimates in the 'semPlotModel'. For multiple groups, a list of such matrices can be used.
to store more information, a named list of multiple matrices of the same dimensions can be used. Included in this list can be the following (but only estimates is nessesary):
est
Parameter estimates
std
standardized parameter estimates
par
Parameter numbers. 0 indicating fixed variables and parameters with the same parameter number are constrained to be equal.
fixed
Logical matrix indicating if the parameter is fixed.
If std
is missing the function tries to compute standardized solutions (not yet working for intercepts). If fixed
is missing it is computed from the par
matrix. For multiple groups, a list containing such lists can be used.
The number of variables is extracted from the assigned matrices.
A 'semPlotModel' object.
Sacha Epskamp <[email protected]>
McArdle, J. J., & McDonald, R. P. (1984). Some algebraic properties of the reticular action model for moment structures. British Journal of Mathematical and Statistical Psychology, 37(2), 234-251.
semPlotModel
semCors
semPaths
lisrelModel
The package regsem (Jacobucci, 2017) is designed for a specific type of SEM called regularized structural equation modelling (RegSEM). For more information about RegSEM and the implementation in R we refer to the manual written by Jacobucci (2017).This function creates a bridge between the regsem and semplot packages, making it possible to use output from the regsem() and cv_regsem() functions to create models in sempaths.
## S3 method for class 'regsem' semPlotModel(object,...)
## S3 method for class 'regsem' semPlotModel(object,...)
object |
The regsem output |
... |
Arguments sent to 'lisrelModel', not used in other methods. |
A 'semPlotModel' object.
Sacha Epskamp <[email protected]> Myrthe Veenman <[email protected]> Jason Nak <[email protected]>
Jacobucci, R. (2017). regsem: Regularized Structural Equation Modeling. arXiv preprint arXiv:1703.08489.
## Not run: ## Example of fitting and plotting a regsem model in semPaths library(psych) library(lavaan) library(regsem) # use a subset of the BFI bfi2 <- bfi[1:250,c(1:5,18,22)] bfi2[,1] <- reverse.code(-1,bfi2[,1]) # specify a SEM model mod <- " f1 =~ NA*A1+A2+A3+A4+A5+O2+N3 f1~~1*f1 " # fit the model fit <- cfa(mod, bfi2) out.reg <- regsem(fit, type="lasso", pars_pen=c(1:7)) # plot the model semPaths(semPlotModel.regsem(object = out.reg)) ## End(Not run)
## Not run: ## Example of fitting and plotting a regsem model in semPaths library(psych) library(lavaan) library(regsem) # use a subset of the BFI bfi2 <- bfi[1:250,c(1:5,18,22)] bfi2[,1] <- reverse.code(-1,bfi2[,1]) # specify a SEM model mod <- " f1 =~ NA*A1+A2+A3+A4+A5+O2+N3 f1~~1*f1 " # fit the model fit <- cfa(mod, bfi2) out.reg <- regsem(fit, type="lasso", pars_pen=c(1:7)) # plot the model semPaths(semPlotModel.regsem(object = out.reg)) ## End(Not run)
This function is still in devellopment.
semCors(object, include, vertical = TRUE, titles = FALSE, layout, maximum, ...)
semCors(object, include, vertical = TRUE, titles = FALSE, layout, maximum, ...)
object |
A |
include |
What to include? Can be |
vertical |
Should the layout be vertical or horizontal? |
titles |
Logical, should titles indicating the group and observed/implied correlations be plotted? |
layout |
An optional layout matrix send to |
maximum |
The maximum values as used in |
... |
Arguments sent to |
Sacha Epskamp <[email protected]>
This function can be used to extract or calculate with model matrices given a "semMatriModel"
object (from modelMatrices
) or a "semPlotModel"
object or any of the input types that can be used in semPlotModel
directly.
If the model is not specified it is attempted to be identified by the given algebra.
semMatrixAlgebra(object, algebra, group, simplify = TRUE, model, endoOnly = FALSE)
semMatrixAlgebra(object, algebra, group, simplify = TRUE, model, endoOnly = FALSE)
object |
A |
algebra |
An R expression to use. |
group |
Groups the algebra should be used on. If more than one a list is returned with the result for each group. |
simplify |
If TRUE and only one group is used, return output as is instead of in a list. |
model |
Model to be used in |
endoOnly |
Only needed when the model is |
The "lisrel"
model uses the following matrix names: LY
, TE
, PS
, BE
, LX
, TD
, PH
, GA
, TY
, TX
, AL
and KA
.
The "mplus"
model uses the following matrix names: Lambda
, Nu
, Theta
, Kappa
, Alpha
, Beta
, Gamma
and Psi
.
The "ram"
model uses the following matrix names: F
, A
and S
.
A list containing output per group
Sacha Epskamp <[email protected]>
semPlotModel
semPlotModel-class
modelMatrices
lisrelModel
ramModel
## Mplus user guide SEM example: outfile <- tempfile(fileext=".out") tryres <- try({ download.file("http://www.statmodel.com/usersguide/chap5/ex5.11.html",outfile) }) if (!is(tryres,"try-error")){ # Plot model: semPaths(outfile,intercepts=FALSE) # Obtain latent regressions (mplus) semMatrixAlgebra(outfile, Beta) # mplus model implied covariance: mat1 <- semMatrixAlgebra(outfile, Lambda %*% Imin(Beta, TRUE) %*% Psi %*% t(Imin(Beta, TRUE)) %*% t(Lambda) + Theta) # Lisrel model implied covariance: mat2 <- semMatrixAlgebra(outfile, LY %*% Imin(BE, TRUE) %*% PS %*% t(Imin(BE, TRUE)) %*% t(LY) + TE, endoOnly = TRUE) # RAM model implied covariance: mat3 <- semMatrixAlgebra(outfile, F %*% Imin(A,TRUE) %*% S %*% t(Imin(A, TRUE)) %*% t(F)) ## Not run: # Plot: library("qgraph") pdf("Models.pdf",width=15,height=5) layout(t(1:3)) qgraph(round(cov2cor(mat1),5), maximum=1, edge.labels=TRUE, layout = "spring", cut = 0.4, minimum = 0.1) title("Mplus model") qgraph(round(cov2cor(mat2),5), maximum=1, edge.labels=TRUE, layout = "spring", cut = 0.4, minimum = 0.1) title("LISREL model") qgraph(round(cov2cor(mat3),5), maximum=1, edge.labels=TRUE, layout = "spring", cut = 0.4, minimum = 0.1) title("RAM model") dev.off() ## End(Not run) # They are the same. }
## Mplus user guide SEM example: outfile <- tempfile(fileext=".out") tryres <- try({ download.file("http://www.statmodel.com/usersguide/chap5/ex5.11.html",outfile) }) if (!is(tryres,"try-error")){ # Plot model: semPaths(outfile,intercepts=FALSE) # Obtain latent regressions (mplus) semMatrixAlgebra(outfile, Beta) # mplus model implied covariance: mat1 <- semMatrixAlgebra(outfile, Lambda %*% Imin(Beta, TRUE) %*% Psi %*% t(Imin(Beta, TRUE)) %*% t(Lambda) + Theta) # Lisrel model implied covariance: mat2 <- semMatrixAlgebra(outfile, LY %*% Imin(BE, TRUE) %*% PS %*% t(Imin(BE, TRUE)) %*% t(LY) + TE, endoOnly = TRUE) # RAM model implied covariance: mat3 <- semMatrixAlgebra(outfile, F %*% Imin(A,TRUE) %*% S %*% t(Imin(A, TRUE)) %*% t(F)) ## Not run: # Plot: library("qgraph") pdf("Models.pdf",width=15,height=5) layout(t(1:3)) qgraph(round(cov2cor(mat1),5), maximum=1, edge.labels=TRUE, layout = "spring", cut = 0.4, minimum = 0.1) title("Mplus model") qgraph(round(cov2cor(mat2),5), maximum=1, edge.labels=TRUE, layout = "spring", cut = 0.4, minimum = 0.1) title("LISREL model") qgraph(round(cov2cor(mat3),5), maximum=1, edge.labels=TRUE, layout = "spring", cut = 0.4, minimum = 0.1) title("RAM model") dev.off() ## End(Not run) # They are the same. }
This function creates a path diagram of a SEM model (or general linear model), which is then plotted using qgraph
. Currently many different SEM programs and packages are supported. Please see my website (www.sachaepskamp.com) for more details on which packages are supported and what is supported for each package.
semPaths(object, what = "paths", whatLabels, style, layout = "tree", intercepts = TRUE, residuals = TRUE, thresholds = TRUE, intStyle = "multi", rotation = 1, curve, curvature = 1, nCharNodes = 3, nCharEdges = 3, sizeMan = 5, sizeLat = 8, sizeInt = 2, sizeMan2, sizeLat2, sizeInt2, shapeMan, shapeLat, shapeInt = "triangle", ask, mar, title, title.color = "black", title.adj = 0.1, title.line = -1, title.cex = 0.8, include, combineGroups = FALSE, manifests, latents, groups, color, residScale, gui = FALSE, allVars = FALSE, edge.color, reorder = TRUE, structural = FALSE, ThreshAtSide = FALSE, thresholdColor, thresholdSize = 0.5, fixedStyle = 2, freeStyle = 1, as.expression = character(0), optimizeLatRes = FALSE, inheritColor = TRUE, levels, nodeLabels, edgeLabels, pastel = FALSE, rainbowStart = 0, intAtSide, springLevels = FALSE, nDigits = 2, exoVar, exoCov = TRUE, centerLevels = TRUE, panelGroups = FALSE, layoutSplit = FALSE, measurementLayout = "tree", subScale, subScale2, subRes = 4, subLinks, modelOpts = list(mplusStd = "std"), curveAdjacent = '<->', edge.label.cex = 0.6, cardinal = "none", equalizeManifests = FALSE, covAtResiduals = TRUE, bifactor, optimPoints = 1:8 * (pi/4), ...)
semPaths(object, what = "paths", whatLabels, style, layout = "tree", intercepts = TRUE, residuals = TRUE, thresholds = TRUE, intStyle = "multi", rotation = 1, curve, curvature = 1, nCharNodes = 3, nCharEdges = 3, sizeMan = 5, sizeLat = 8, sizeInt = 2, sizeMan2, sizeLat2, sizeInt2, shapeMan, shapeLat, shapeInt = "triangle", ask, mar, title, title.color = "black", title.adj = 0.1, title.line = -1, title.cex = 0.8, include, combineGroups = FALSE, manifests, latents, groups, color, residScale, gui = FALSE, allVars = FALSE, edge.color, reorder = TRUE, structural = FALSE, ThreshAtSide = FALSE, thresholdColor, thresholdSize = 0.5, fixedStyle = 2, freeStyle = 1, as.expression = character(0), optimizeLatRes = FALSE, inheritColor = TRUE, levels, nodeLabels, edgeLabels, pastel = FALSE, rainbowStart = 0, intAtSide, springLevels = FALSE, nDigits = 2, exoVar, exoCov = TRUE, centerLevels = TRUE, panelGroups = FALSE, layoutSplit = FALSE, measurementLayout = "tree", subScale, subScale2, subRes = 4, subLinks, modelOpts = list(mplusStd = "std"), curveAdjacent = '<->', edge.label.cex = 0.6, cardinal = "none", equalizeManifests = FALSE, covAtResiduals = TRUE, bifactor, optimPoints = 1:8 * (pi/4), ...)
object |
A |
what |
What should the edges indicate in the path diagram? This function uses
|
whatLabels |
What should the edge labels indicate in the path diagram? This function uses
|
style |
The style to use. Currently only indicates what the (residual) variances look like. Use |
layout |
A string indicating how the nodes should be placed. Similar to the 'layout' argument in
|
intercepts |
Logical, should intercepts be included in the path diagram? |
residuals |
Logical, should residuals (and variances) be included in the path diagram? |
thresholds |
Logical, should thresholds be included in the path diagram? |
intStyle |
Style of the intercepts. |
rotation |
An integer indicating the rotation of the layout when "tree" or "tree2" layout is used. 1, 2, 3 and 4 indicate that exogenous variables are placed at the top, left side, bottom and right side respectively. |
curve |
The curvature of the edges. In tree layouts this argument only curves the edges that are between nodes on the same level. e.g., correlations between exogenous manifest variables. |
curvature |
Sets the strength of scaling in curvature for curved edges at the same horizontal level in tree layouts. The curve will be set to |
nCharNodes |
Number of characters to abbreviate node labels to (using |
nCharEdges |
Number of characters to abbreviate edge labels to (using |
sizeMan |
Width of the manifest nodes, sent to the 'vsize' argument in |
sizeLat |
Width of the latent nodes, sent to the 'vsize' argument in |
sizeInt |
Width of the unit vector nodes, sent to the 'vsize' argument in |
sizeMan2 |
Height of the manifest nodes, sent to the 'vsize2' argument in |
sizeLat2 |
Height of the latent nodes, sent to the 'vsize2' argument in |
sizeInt2 |
Height of the unit vector nodes, sent to the 'vsize2' argument in |
shapeMan |
Shape of the manifest nodes, sent to the 'shape' argument in |
shapeLat |
Shape of the latent nodes, sent to the 'shape' argument in |
shapeInt |
Shape of the constant nodes, sent to the 'shape' argument in |
ask |
Specifies the 'ask' parameter in |
mar |
Same as the 'mar' argument in |
title |
Logical, should titles be plotted of the group names above each plot? |
title.color |
Color of the titles. |
title.adj |
Adjustment of title as used by |
title.line |
Line of title as used by |
title.cex |
Size of title as used by |
include |
Integer vector indicating which groups should be included in the output. e.g., to only plot a diagram for the first group use |
combineGroups |
Logical. If TRUE all groups are combined in the same path diagram. |
manifests |
A character vector in which every element is the name of a manifest variable in the model. This argument can be used to overwrite the order in which nodes are plotted in the graph if |
latents |
A character vector in which every element is the name of a latent variable in the model. This argument can be used to overwrite the order in which nodes are plotted in the graph if |
groups |
Groups nodes that should be colored the same, similar to the 'groups' argument in In addition, this argument can be assigned a single character: "manifests", "latents" or "both" to make a single group for each manifest, latent or both manifest and latent variables. e.g., |
color |
Controls the color of nodes. Similar to 'color' in
|
residScale |
The size of residual edges if |
gui |
Not yet implemented. |
allVars |
Logical. If TRUE all variables are plotted in the path diagrams for each group. If FALSE only variables are plotted that are used in the group. |
edge.color |
A value indicating the color of all edges or a vector indicating the color of each edge. Useful for manually overwriting edge colors. |
reorder |
Logical. Should manifest variables be reordered to be near latent factors they are most connected to in the "tree" layout? If FALSE manifest variables are placed in the order they appear in the Pars. |
structural |
Logical. Set this to TRUE to only show the structural model (omit all manifest variables.) |
ThreshAtSide |
Logical. If TRUE, thresholds are plotted as small lines at the side of manifest nodes, otherwise they are plotted as lines inside the nodes. |
thresholdColor |
Color of the threshold lines. Defaults to "black" |
thresholdSize |
Size of threshold bars relative to the size of the node. |
fixedStyle |
A vector of length one or two specifying the color and line type (same as 'lty' in For example, |
freeStyle |
Same as 'fixedStyle' but for free parameters instead. |
as.expression |
A character vector indicating which labels should be treated as an |
optimizeLatRes |
Logical. If this is TRUE, the angle of the incoming residuals on latent variables is attempted to be optimally chosen so its position conflicts with the least amount of connected edges. |
inheritColor |
Logical, should uncolored nodes obtain a mix of connected colored nodes? Defaults to |
levels |
A numeric vector usually of length 4. Controls the relative vertical position of variable levels (exogenous and endogenous latents and manifests) under default rotation in tree and circle layouts. This can be used to control the spacing between these levels. e.g., |
nodeLabels |
A vector or list to manually overwrite the node labels. Can include expressions. |
edgeLabels |
A vector or list to manually overwrite the edge labels. Can include expressions. |
pastel |
Logical, should default colors (for groups or edge equality constraints) be chosen from pastel colors? If TRUE then |
rainbowStart |
A number between 0 and 1 indicating the offset used in rainbow functions for default node coloring. |
exoVar |
Should variances of truely exogenous variables (no incomming directed edge) be plotted? Defaults to |
intAtSide |
Logical to control if intercepts should be plotted to the side of manifest nodes or at the bottom/top. Defaults only to FALSE if 'residuals=FALSE'. |
springLevels |
Logical indicating if the placement on horizontal levels with |
nDigits |
Number of digits to round numeric values to. |
exoCov |
Should covariances between truely exogenous variables (no incomming directed edge) be plotted? Defaults to |
centerLevels |
Only used if |
panelGroups |
Logical to automatically create a panel plot of multiple group models. Defaults to FALSE. |
layoutSplit |
Logical that can be used to split computing of layout between structural and measurment models. This is very useful in more complicated models where the structural part is best shown by using a spring layout. |
measurementLayout |
Logical indicating the layout algorithm to use for measurement models if |
subScale |
Width of submodels (measurment models) if |
subScale2 |
Height of submodels (measurment models) if |
subRes |
Integer indicating the resolution of which measurment models can be rotated around their corresponding latent variable. The default, 4, indicates that they can be placed only to polar coordinates. Set to 360 to allow every angle of rotation. |
subLinks |
Vector of variables to link to. Currently not well supported so avoid using this argument. |
modelOpts |
A lists containing arguments sent to |
curveAdjacent |
What edges between adjacent horizontal nodes be curved? Can be |
edge.label.cex |
Controls the font size of the edge labels. Same as in |
cardinal |
Should edges in a tree layout connect to the four cardinal points of one of the borders of the node rather than point to the center of the node? Can be set to |
equalizeManifests |
Logical. Should the distances between manifest nodes in the |
covAtResiduals |
Logical, should covariances be drawn at the start of residuals when |
bifactor |
A string vector containing the name(s) of the general bifactor(s). This will automatically create a bifactor plot. |
optimPoints |
A vector of radians residuals can optimize to if |
... |
Arguments sent to the
|
The default "tree"
layout under default rotation places the nodes in one of four horizontal levels. At the top the exogenous manifest variables, under that the exogenous latent variables, under that the endogenous latent variables and at the bottom the endogenous manifest variables. If one of these kinds of variables does not exist its level is omitted. Afterwards, the rotation
argument will rotate the graph and the "circle"
layout will make the layout circular using these levels as nested circles.
If not manually set (see semPlotModel-edit
), semPath
will automatically try to set the endogenous and exogenous variables, such that the resulting layout looks good. A latent variable is identified as exogenous if it is not on the right hand side of a directed edge (->
or ~>
) with another latent variable as node of origin. A manifest variable is set as exogenous if it is only connected, in any way, to exogenous latent variables and if it is not the right hand side (dependent variable) of a regression edge (~>
). If all variables are set to exogenous this way, they are all set to endogenous for consistency in the layouts. Afterwards, manifest variables only used in formative measurement models (only outgoing directed edges to latents) are set to exogenous again so that MIMIC models are displayed properly.
Intercepts are placed on the same level as the variable, either on the left or right side of the node (pointing outward from the center). Residuals for manifest variables are placed at the top or bottom (for exogenous and endogenous manifests respectively). Residuals of latents are placed at the bottom or top respectively for exogenous and endogenous variables, but is switched if the latent is not connected to a manifest. Residuals for the leftmost and rightmost latent are placed at the left and right side respectively, or diagonal if the latent is connected to an intercept.
The "tree2"
and "circle2"
layouts call the layout.reingold.tilford
function from the igraph
package. As roots are used the first available variables of the following list:
Intercepts of exogenous manifests
Exogenous manifest
Intercepts of exogenous latents
Exogenous latents
Interceots of endogenous latents
Endogenous latents
Intercepts of endogenous manifests
The endogenous manifest with the most outgoing edges (this should not be possible by default, but can be manually set)
The most connected endogenous manigest.
To compute an optimal layout layout.reingold.tilford
is run on a slightly altered version of the path diagram. In this version, the direction of edges from all intercepts that are not roots is reversed, the direction of all edges leading to exogenous manifests is reversed and all bidirectional edges are removed.
A "qgraph"
object as returned by qgraph
. This object can be used to alter the graph (such as manually redefining the layout) and to plot the graph again with different arguments.
If there are multiple groups a list is returned with a "qgraph" object for each path diagram that has been produced.
Sacha Epskamp <[email protected]>
Fruchterman, T. & Reingold, E. (1991). Graph drawing by force-directed placement. Software - Pract. Exp. 21, 1129-1164.
Reingold, E and Tilford, J (1981). Tidier drawing of trees. IEEE Trans. on Softw. Eng., SE-7(2):223-228.
Csardi G, Nepusz T (2006). The igraph software package for complex network research, InterJournal, Complex Systems 1695. http://igraph.sf.net
qgraph
semPlotModel
semPlotModel-class
semCors
lisrelModel
semSyntax
# Regression analysis with interaction effects ---------------------------- # A silly dataset: X <- rnorm(100) Y <- rnorm(100) Z <- rnorm(1)*X + rnorm(1)*Y + rnorm(1)*X*Y DF <- data.frame(X,Y,Z) # Regression including interaction: res <- lm(Z ~ X*Y, data = DF) # Path diagram: semPaths(res, intAtSide=TRUE) # Standardized estimates: semPaths(res,"std","hide", intAtSide=TRUE) # Simple CFA ------------------------------------------- library("lavaan") example(cfa) semPaths(fit, 'std', 'est', curveAdjacent = TRUE, style = "lisrel") # MIMIC model ---------------------------------------------------- ## Lavaan ## Not run: library("lavaan") # Example 5.8 from mplus user guide: Data <- read.table("http://www.statmodel.com/usersguide/chap5/ex5.8.dat") names(Data) <- c(paste("y", 1:6, sep=""), paste("x", 1:3, sep="")) # Model: model.Lavaan <- 'f1 =~ y1 + y2 + y3 f2 =~ y4 + y5 + y6 f1 + f2 ~ x1 + x2 + x3 ' # Run Lavaan: library("lavaan") fit <- lavaan:::cfa(model.Lavaan, data=Data, std.lv=TRUE) # Plot path diagram: semPaths(fit,title=FALSE) # Omit exogenous covariances: semPaths(fit,title=FALSE, exoVar = FALSE, exoCov = FALSE) # Standardized parameters: semPaths(fit,"std", edge.label.cex = 0.5, exoVar = FALSE, exoCov = FALSE) ## Mplus # Same model, now using mplus output: outfile <- tempfile(fileext=".out") download.file("http://www.statmodel.com/usersguide/chap5/ex5.8.html",outfile) # Plot model: semPaths(outfile,intercepts=FALSE) # Note that mplus did not report the fixed variances of the exogenous variables. # Thresholds ----------------------------------------------------- ## Lavaan # Example 5.8 from mplus user guide: Data <- read.table("http://www.statmodel.com/usersguide/chap5/ex5.2.dat") names(Data) <- c("u1","u2","u3","u4","u5","u6") Data <- as.data.frame(lapply(Data, ordered)) # Lavaan model: model <- ' f1 =~ u1 + u2 + u3; f2 =~ u4 + u5 + u6 ' # Run Lavaan: fit <- lavaan::cfa(model, data=Data) # Plot path diagram: semPaths(fit,intercepts=FALSE) ## Mplus # Same model, now using mplus output: outfile <- tempfile(fileext=".out") download.file("http://www.statmodel.com/usersguide/chap5/ex5.2.html",outfile) # Plot model: semPaths(outfile) # OpenMx ---------------------------------------------------------- # To install OpenMx see: # http://openmx.psyc.virginia.edu/ library("OpenMx") # Example from mxRun help page: # Create and run the 1-factor CFA on the openmx.psyc.virginia.edu front page data(demoOneFactor) # load the demoOneFactor dataframe manifests <- names(demoOneFactor) # set the manifest to the 5 demo variables latents <- c("G") # define 1 latent variable model <- mxModel("One Factor", type="RAM", manifestVars = manifests, latentVars = latents, mxPath(from=latents , to=manifests), mxPath(from=manifests, arrows=2), mxPath(from=latents , arrows=2, free=FALSE, values=1.0), mxData(cov(demoOneFactor), type="cov", numObs=500) ) model <- mxRun(model) #run model, returning the result # Plot with colors from OpenMx front page: semPaths(model, color = list( lat = rgb(245, 253, 118, maxColorValue = 255), man = rgb(155, 253, 175, maxColorValue = 255)), mar = c(10, 5, 10, 5)) ## Factor Analysis: source("http://openmx.ssri.psu.edu/docs/OpenMx/latest/_static/demo/TwoFactorModel_PathCov.R") semPaths(twoFactorFit, layout = "tree2") # Multi-group analysis ------------------------------------------- ## LISREL: # Download measurment invariance example: modFile <- tempfile(fileext=".OUT") download.file("http://sachaepskamp.com/files/mi1.OUT",modFile) layout(t(1:2)) semPaths(modFile,"eq",ask=FALSE, intAtSide = TRUE, mar = c(8, 1, 5, 1)) # Color indicates equality constraints. ## End(Not run)
# Regression analysis with interaction effects ---------------------------- # A silly dataset: X <- rnorm(100) Y <- rnorm(100) Z <- rnorm(1)*X + rnorm(1)*Y + rnorm(1)*X*Y DF <- data.frame(X,Y,Z) # Regression including interaction: res <- lm(Z ~ X*Y, data = DF) # Path diagram: semPaths(res, intAtSide=TRUE) # Standardized estimates: semPaths(res,"std","hide", intAtSide=TRUE) # Simple CFA ------------------------------------------- library("lavaan") example(cfa) semPaths(fit, 'std', 'est', curveAdjacent = TRUE, style = "lisrel") # MIMIC model ---------------------------------------------------- ## Lavaan ## Not run: library("lavaan") # Example 5.8 from mplus user guide: Data <- read.table("http://www.statmodel.com/usersguide/chap5/ex5.8.dat") names(Data) <- c(paste("y", 1:6, sep=""), paste("x", 1:3, sep="")) # Model: model.Lavaan <- 'f1 =~ y1 + y2 + y3 f2 =~ y4 + y5 + y6 f1 + f2 ~ x1 + x2 + x3 ' # Run Lavaan: library("lavaan") fit <- lavaan:::cfa(model.Lavaan, data=Data, std.lv=TRUE) # Plot path diagram: semPaths(fit,title=FALSE) # Omit exogenous covariances: semPaths(fit,title=FALSE, exoVar = FALSE, exoCov = FALSE) # Standardized parameters: semPaths(fit,"std", edge.label.cex = 0.5, exoVar = FALSE, exoCov = FALSE) ## Mplus # Same model, now using mplus output: outfile <- tempfile(fileext=".out") download.file("http://www.statmodel.com/usersguide/chap5/ex5.8.html",outfile) # Plot model: semPaths(outfile,intercepts=FALSE) # Note that mplus did not report the fixed variances of the exogenous variables. # Thresholds ----------------------------------------------------- ## Lavaan # Example 5.8 from mplus user guide: Data <- read.table("http://www.statmodel.com/usersguide/chap5/ex5.2.dat") names(Data) <- c("u1","u2","u3","u4","u5","u6") Data <- as.data.frame(lapply(Data, ordered)) # Lavaan model: model <- ' f1 =~ u1 + u2 + u3; f2 =~ u4 + u5 + u6 ' # Run Lavaan: fit <- lavaan::cfa(model, data=Data) # Plot path diagram: semPaths(fit,intercepts=FALSE) ## Mplus # Same model, now using mplus output: outfile <- tempfile(fileext=".out") download.file("http://www.statmodel.com/usersguide/chap5/ex5.2.html",outfile) # Plot model: semPaths(outfile) # OpenMx ---------------------------------------------------------- # To install OpenMx see: # http://openmx.psyc.virginia.edu/ library("OpenMx") # Example from mxRun help page: # Create and run the 1-factor CFA on the openmx.psyc.virginia.edu front page data(demoOneFactor) # load the demoOneFactor dataframe manifests <- names(demoOneFactor) # set the manifest to the 5 demo variables latents <- c("G") # define 1 latent variable model <- mxModel("One Factor", type="RAM", manifestVars = manifests, latentVars = latents, mxPath(from=latents , to=manifests), mxPath(from=manifests, arrows=2), mxPath(from=latents , arrows=2, free=FALSE, values=1.0), mxData(cov(demoOneFactor), type="cov", numObs=500) ) model <- mxRun(model) #run model, returning the result # Plot with colors from OpenMx front page: semPaths(model, color = list( lat = rgb(245, 253, 118, maxColorValue = 255), man = rgb(155, 253, 175, maxColorValue = 255)), mar = c(10, 5, 10, 5)) ## Factor Analysis: source("http://openmx.ssri.psu.edu/docs/OpenMx/latest/_static/demo/TwoFactorModel_PathCov.R") semPaths(twoFactorFit, layout = "tree2") # Multi-group analysis ------------------------------------------- ## LISREL: # Download measurment invariance example: modFile <- tempfile(fileext=".OUT") download.file("http://sachaepskamp.com/files/mi1.OUT",modFile) layout(t(1:2)) semPaths(modFile,"eq",ask=FALSE, intAtSide = TRUE, mar = c(8, 1, 5, 1)) # Color indicates equality constraints. ## End(Not run)
Use a list contaning several SEM objects (from any source) to plot them as the same model. Also, the '+' operator can be used to combine two models, including in calls in semPaths
and semPlotModel
. See examples.
## S3 method for class 'semPlotModel' x + y ## S3 method for class 'list' semPlotModel(object, ...)
## S3 method for class 'semPlotModel' x + y ## S3 method for class 'list' semPlotModel(object, ...)
x |
A |
y |
A |
object |
An object contaning the result of a SEM or GLM analysis, or a string contaning the file path to the output file of a sEM program. |
... |
Not used. |
Sacha Epskamp <[email protected]>
# A silly dataset: A <- rnorm(100) B <- A + rnorm(100) C <- B + rnorm(100) DF <- data.frame(A,B,C) # Two regressions: res1 <- lm(B ~ C, data = DF) res2 <- lm(A ~ B + C, data = DF) # Plot both in the same path diagram in two ways: semPaths(res1 + res2, "model", "est", intercepts=FALSE) semPaths(list(res1,res2), "model", "est", intercepts=FALSE)
# A silly dataset: A <- rnorm(100) B <- A + rnorm(100) C <- B + rnorm(100) DF <- data.frame(A,B,C) # Two regressions: res1 <- lm(B ~ C, data = DF) res2 <- lm(A ~ B + C, data = DF) # Plot both in the same path diagram in two ways: semPaths(res1 + res2, "model", "est", intercepts=FALSE) semPaths(list(res1,res2), "model", "est", intercepts=FALSE)
Methods to read a SEM object and return a semPlotModel-class
object.
## Default S3 method: semPlotModel(object, ...) ## S3 method for class 'lm' semPlotModel(object, ...) ## S3 method for class 'principal' semPlotModel(object, ...) ## S3 method for class 'princomp' semPlotModel(object, ...) ## S3 method for class 'loadings' semPlotModel(object, ...) ## S3 method for class 'factanal' semPlotModel(object, ...) ## S3 method for class 'lisrel' semPlotModel(object, ...) ## S3 method for class 'mplus.model' semPlotModel(object, mplusStd = c("std", "stdy", "stdyx"), ...) ## S3 method for class 'sem' semPlotModel(object, ...) ## S3 method for class 'msem' semPlotModel(object, ...) ## S3 method for class 'msemObjectiveML' semPlotModel(object, ...) semPlotModel_Amos(object) semPlotModel_Onyx(object) semPlotModel_lavaanModel(object, ...)
## Default S3 method: semPlotModel(object, ...) ## S3 method for class 'lm' semPlotModel(object, ...) ## S3 method for class 'principal' semPlotModel(object, ...) ## S3 method for class 'princomp' semPlotModel(object, ...) ## S3 method for class 'loadings' semPlotModel(object, ...) ## S3 method for class 'factanal' semPlotModel(object, ...) ## S3 method for class 'lisrel' semPlotModel(object, ...) ## S3 method for class 'mplus.model' semPlotModel(object, mplusStd = c("std", "stdy", "stdyx"), ...) ## S3 method for class 'sem' semPlotModel(object, ...) ## S3 method for class 'msem' semPlotModel(object, ...) ## S3 method for class 'msemObjectiveML' semPlotModel(object, ...) semPlotModel_Amos(object) semPlotModel_Onyx(object) semPlotModel_lavaanModel(object, ...)
object |
An object contaning the result of a SEM or GLM analysis, or a string contaning the file path to the output file of a SEM program. Or a Lavaan model. |
mplusStd |
What standardization to use in Mplus models? |
model |
The original sem model (used in cvregsem) |
... |
Arguments sent to 'lisrelModel', not used in other methods. |
A detailed overview of which packages are supported and what is supported for each of them will soon be on my website.
A "semPlotModel"
object. See link{semPlotModel-class}
Sacha Epskamp <[email protected]>
semPaths
semCors
semPlotModel-class
S4 generic used only for the lavaan-class
class. See semPlotModel
for more information and semPlotModel-class
for the resulting object.
signature(object = "lavaan")
A lavaan-class
object.
"semPlotModel"
Representation of SEM models, can be used by semPaths
, semCors
and semSyntax.
See semPlotModel-edit
for utility functions on how to edit this model.
Objects can be created by calls of the form new("semPlotModel", ...)
.
Pars
:Object of class "data.frame"
indicating the parameters used in the SEM model. this must contain the following elements, in order:
label
The name of the parameter, used as edge label in the graph.
lhs
Name of the variable on the left hand side of the path.
edge
String as indicator of the edge. This can be one of the following:
->
Factor loading
~>
Regression. The same as '->'
in that it results in a directed edge from the left hand side to the right hand side, but '~>'
differs in that if the right hand side is manifest and the left hand side is an exogenous latent the right hand side is interpreted as an endogenous variable rather than an exogenous variable.
<->
(co)variance
int
intercept, The left hand side should be "" and the right hand side indicates the variable to which the intercept belongs.
--
Undirected edge. Only used as dummy encoding and in cases the parameter can not be interpreted (usually this indicates something that is not yet supported)
rhs
Name of the variable on the left hand side of the path.
est
Parameter estimate.
est
Standardized parameter estimate.
group
Character of the name of the group the parameter belongs to.
fixed
Logical indicating if the parameter is fixed.
par
Parameter number. 0 indicates the parameter is fixed and parameters with the same parameter number are constrained to be equal.
knot
Knot number. 0 indicates the edge is not knotted and edges with the same knot number are knotted together. Only used to indicate interactions in 'lm' models and can be omitted.
Vars
:Object of class "data.frame"
indicating the variables used in the SEM model. Must have the following elements:
Name of the variable
Logical indicating if the variable is manifest
Logical indicating if the variable is exogenous. If NA
(the default) semPaths
will attempt to detect which variables are exogenous.
Thresholds
:Object of class "data.frame"
indicating the thresholds in the SEM model. It is the same as Pars
except it does not have the elements 'edge'
and 'rhs'
.
Computed
:Object of class "logical"
indicating if the SEM model was computed or if the object only indicates a structure.
ObsCovs
:Object of class "list"
containing observed covariance matrices for each group. If available.
ImpCovs
:Object of class "list"
containing implied covariance matrices for each group. If available.
Original
:Object of class "list"
containing the original object used as input (or multiple objects if the '+'
operator was used to combine objects.)
No methods defined with class "semPlotModel" in the signature.
Sacha Epskamp <[email protected]>
semPlotModel
semPaths
semCors
semSyntax
semPlotModel-edit
showClass("semPlotModel")
showClass("semPlotModel")
These functions can be used to easilly call and edit parts of a semPlotModel-class
object. Currently only manifest/latent and endgenous/exogenous node properties can be set.
exo(x) endo(x) man(x) lat(x)
exo(x) endo(x) man(x) lat(x)
x |
A |
Sacha Epskamp <[email protected]>
This function produces a model object or model syntax for SEM software based on a semPlotModel-class
object. If the input is not a "semPlotModel"
object the semPlotModel
function is run on the input. This allows to create model syntax for one program based on the output of another program.
Currently only the R packages 'lavaan' (Rosseel, 2012) and 'sem' (Fox, Nie & Byrnes, 2012) are supported.
semSyntax(object, syntax = "lavaan", allFixed = FALSE, file)
semSyntax(object, syntax = "lavaan", allFixed = FALSE, file)
object |
A "semPlotModel" object or any of the input possibilities for |
syntax |
A string indicating which syntax to be used for the output. Currently supported are |
allFixed |
Logical, should all parameters be fixed to their estimate. Useful for simulating data. |
file |
Path of a file the model should be written to. |
A string containing the lavaan
model syntax or a "semmod"
object for the sem
package.
Sacha Epskamp <[email protected]>
Yves Rosseel (2012). lavaan: An R Package for Structural Equation Modeling. Journal of Statistical Software, 48(2), 1-36. URL http://www.jstatsoft.org/v48/i02/.
John Fox, Zhenghua Nie and Jarrett Byrnes (2012). sem: Structural Equation Models. R package version 3.0-0. http://CRAN.R-project.org/package=sem
semPlotModel
semPlotModel-class
semPaths
# MIMIC model, example 5.8 from mplus user guide: tryres <- try({ Data <- read.table("http://www.statmodel.com/usersguide/chap5/ex5.8.dat") }) if (!is(tryres,"try-error")){ names(Data) <- c(paste("y", 1:6, sep=""), paste("x", 1:3, sep="")) # Data <- Data[,c(7:9,1:6)] # Model: model.Lavaan <- 'f1 =~ y1 + y2 + y3 f2 =~ y4 + y5 + y6 f1 + f2 ~ x1 + x2 + x3 ' # Run Lavaan: library("lavaan") fit.Lavaan <- lavaan:::cfa(model.Lavaan, data=Data, std.lv=TRUE) # Obtain Lavaan syntax: model.Lavaan2 <- semSyntax(fit.Lavaan, "lavaan") # Run Lavaan again: fit.Lavaan2 <- lavaan:::lavaan(model.Lavaan2, data=Data) # Compare models: layout(t(1:2)) semPaths(fit.Lavaan,"std",title=FALSE) title("Lavaan model 1",line=3) semPaths(fit.Lavaan2, "std",title=FALSE) title("Lavaan model 2",line=3) # Convert to sem model: model.sem <- semSyntax(fit.Lavaan, "sem") # Run sem: library("sem") fit.sem <- sem:::sem(model.sem, data = Data) # Compare models: layout(t(1:2)) semPaths(fit.Lavaan,"std",title=FALSE) title("Lavaan",line=3) semPaths(fit.sem, "std",title=FALSE) title("sem",line=3) }
# MIMIC model, example 5.8 from mplus user guide: tryres <- try({ Data <- read.table("http://www.statmodel.com/usersguide/chap5/ex5.8.dat") }) if (!is(tryres,"try-error")){ names(Data) <- c(paste("y", 1:6, sep=""), paste("x", 1:3, sep="")) # Data <- Data[,c(7:9,1:6)] # Model: model.Lavaan <- 'f1 =~ y1 + y2 + y3 f2 =~ y4 + y5 + y6 f1 + f2 ~ x1 + x2 + x3 ' # Run Lavaan: library("lavaan") fit.Lavaan <- lavaan:::cfa(model.Lavaan, data=Data, std.lv=TRUE) # Obtain Lavaan syntax: model.Lavaan2 <- semSyntax(fit.Lavaan, "lavaan") # Run Lavaan again: fit.Lavaan2 <- lavaan:::lavaan(model.Lavaan2, data=Data) # Compare models: layout(t(1:2)) semPaths(fit.Lavaan,"std",title=FALSE) title("Lavaan model 1",line=3) semPaths(fit.Lavaan2, "std",title=FALSE) title("Lavaan model 2",line=3) # Convert to sem model: model.sem <- semSyntax(fit.Lavaan, "sem") # Run sem: library("sem") fit.sem <- sem:::sem(model.sem, data = Data) # Compare models: layout(t(1:2)) semPaths(fit.Lavaan,"std",title=FALSE) title("Lavaan",line=3) semPaths(fit.sem, "std",title=FALSE) title("sem",line=3) }