structure.graph {psych} | R Documentation |
Graphic presentations of structural equation models are a very useful way to conceptualize sem and confirmatory factor models. Given a measurement model on x (xmodel) and on y (ymodel) as well as a path model connecting x and y (phi), draw the graph. If ymodel is not specified, just draw the measurement model (xmodel + phi).
Perhaps even more usefully, the function returns a model appropriate for running directly in the sem package written by John Fox.
Input can be specified as matrices or the output from factanal, factor.pa, or a rotation package such as GPArotation.
For symbolic graphs, the input matrices can be character strings or mixtures of character strings and numeric vectors.
As an option, for those without Rgraphviz installed, structure.sem will just create the sem model and skip the graph.
structure.diagram will draw the diagram without using Rgraphviz and is probably the preferred option. structure.graph will be removed eventually.
structure.diagram(fx, Phi=NULL,fy=NULL,labels=NULL,cut=.3,errors=FALSE,simple=TRUE,regression=FALSE,digits=1,e.size=.1,main="Structural model", ...) structure.graph(fx, Phi = NULL,fy = NULL, out.file = NULL, labels = NULL, cut = 0.3, errors=TRUE, simple=TRUE,regression=FALSE, size = c(8, 6), node.font = c("Helvetica", 14), edge.font = c("Helvetica", 10), rank.direction = c("RL", "TB", "LR", "BT"), digits = 1, title = "Structural model", ...) structure.sem(fx, Phi = NULL, fy = NULL,out.file = NULL, labels = NULL, cut = 0.3, errors=TRUE, simple=TRUE,regression=FALSE)
fx |
a factor model on the x variables. |
Phi |
A matrix of directed relationships. Lower diagonal values are drawn. If the upper diagonal values match the lower diagonal, two headed arrows are drawn. For a single, directed path, just the value may be specified. |
fy |
a factor model on the y variables (can be empty) |
out.file |
name a file to send dot language instructions. |
labels |
variable labels if not specified as colnames for the matrices |
cut |
Draw paths for values > cut |
errors |
draw an error term for observerd variables |
simple |
Just draw one path per x or y variable |
regression |
Draw a regression diagram (observed variables cause Y) |
e.size |
size of the ellipses in structure.diagram |
main |
main title of diagram |
size |
page size of graphic |
node.font |
font type for graph |
edge.font |
font type for graph |
rank.direction |
Which direction should the graph be oriented |
digits |
Number of digits to draw |
title |
Title of graphic |
... |
other options to pass to Rgraphviz |
The recommended function is structure.diagram which does not use Rgraphviz but which does not produce dot code either.
All three function return a matrix of commands suitable for using in the sem package.
The structure.graph output can be directed to an output file for post processing using the dot graphic language but requires that Rgraphviz is installed.
sem |
a model matrix (partially) ready for input to John Fox's sem package. It is of class ``mod" for prettier output. |
dotfile |
If out.file is specified, a dot language file suitable for using in a dot graphics program such as graphviz or Omnigraffle. |
A graphic structural diagram in the graphics window
William Revelle
fa.graph
, omega.graph
, sim.structural
fx <- matrix(c(.9,.8,.6,rep(0,4),.6,.8,-.7),ncol=2) fy <- matrix(c(.6,.5,.4),ncol=1) Phi <- matrix(c(1,0,0,0,1,0,.7,.7,1),ncol=3,byrow=TRUE) f1 <- structure.diagram(fx,Phi,fy,main="A structural path diagram") #symbolic input X2 <- matrix(c("a",0,0,"b","e1",0,0,"e2"),ncol=4) colnames(X2) <- c("X1","X2","E1","E2") phi2 <- diag(1,4,4) phi2[2,1] <- phi2[1,2] <- "r" f2 <- structure.diagram(X2,Phi=phi2,errors=FALSE,main="A symbolic model") #symbolic input with error X2 <- matrix(c("a",0,0,"b"),ncol=2) colnames(X2) <- c("X1","X2") phi2 <- diag(1,2,2) phi2[2,1] <- phi2[1,2] <- "r" f3 <- structure.diagram(X2,Phi=phi2,main="an alternative representation") #and yet another one X6 <- matrix(c("a","b","c",rep(0,6),"d","e","f"),nrow=6) colnames(X6) <- c("L1","L2") rownames(X6) <- c("x1","x2","x3","x4","x5","x6") Y3 <- matrix(c("u","w","z"),ncol=1) colnames(Y3) <- "Y" rownames(Y3) <- c("y1","y2","y3") phi21 <- matrix(c(1,0,"r1",0,1,"r2",0,0,1),ncol=3) colnames(phi21) <- rownames(phi21) <- c("L1","L2","Y") f4 <- structure.diagram(X6,phi21,Y3) # and finally, a regression model X7 <- matrix(c("a","b","c","d","e","f"),nrow=6) f5 <- structure.diagram(X7,regression=TRUE) #and a really messy regession model x8 <- c("b1","b2","b3") r8 <- matrix(c(1,"r12","r13","r12",1,"r23","r13","r23",1),ncol=3) f6<- structure.diagram(x8,Phi=r8,regression=TRUE)