In this post we provide an introductory demo for a graphical tool that exists as an extension of the pk-sfc package available here developed in R. The graphical tools main function is to extract Directed Acylic Graphs (DAGs) from a Stock Flow Consistent Model. The SFC models will be generated using eviews files containing the SFC models from Monetary Economics: An Integrated Approach to Credit, Money, Income Production and Wealth by Marc Lavoie and Wynne Godley. The eviews files are available from here and required files are available for download here.
Step 1: Set-up
If you do not already have R installed please follow this link and install the appropriate version. The code below will then install load some of the prerequisite functions and code.
## Loading required package: expm ## Loading required package: Matrix ## ## Attaching package: 'expm' ## ## The following object is masked from 'package:Matrix': ## ## expm ## ## Loading required package: igraph
## Loading required package: graph ## ## Attaching package: 'graph' ## ## The following objects are masked from 'package:igraph': ## ## degree, edges ## ## Loading required package: grid
Step 2: Load an eviews file
Using the model from chapter 6 (“gl06open.prg”) as demo case, using the following code to parse the eviews file and extract the adjacency matrix for the system.
model <- sfc.model("ch6.txt",modelName="Chapter6_openmodel")
The adjacency matrix for the system can be found by using
Step 3: Your very first DAG
The next segment of codes takes the adjacency matrix and returns a list of igraph objects corresponding to the original graph, the nodes that form cycles and the resulting DAG for the system.
graphs = generate.DAG.collaspe( adjacency = model$matrix )
If instead of using an adjacency matrix, you wanted to use an igraph object, adding the argument
IGRAPH = TRUE will allow the three graphs to be required with no errors.
g = graph.adjacency(adjmatrix = model$matrix,mode = "directed") graphs = generate.DAG.collaspe(g, IGRAPH = TRUE)
Step 4: Generating graphics
Two methods for generating graphical representations of DAGs from the models are presented here, first is the standard
plot function using the igraph package.
par(mfrow = c(1,3)) # first plot the orgainal graph of the system plot( graphs$orginal_graph,vertex.color = V(graphs$orginal_graph)$color,vertex.size = 20,main = "orginal graph" ) # just the nodes that form strongly connected componets plot( graphs$SCC_graph, vertex.color = V(graphs$SCC_graph)$color, vertex.size = 20, main = "scc nodes") # the resulting DAG when we take the condensation of the orginal graph plot( graphs$DAG, vertex.color = unlist(V(graphs$DAG)$color), vertex.size = 20, vertex.label = NA, main = "resulting DAG")
Or using the much nicer but less flexible function based in the Rgraphivz package to generate the plots we can delve into the actual structure of the system.
par(mfrow = c(1,3)) # first plot the orgianl grpah plot_graph_hierarchy( graphs$orginal_graph, main = "orginal graph" ) # plot hte nodes that form the strongly connected compoent plot_graph_hierarchy( graphs$SCC_graph, main = "SCC nodes" ) # plot the result ing DAG when we take the condensation of the graph plot_graph_hierarchy( graphs$DAG, main = "resulting DAG" )
Nodes that do not form a cycle are green while nodes that form a cycle in the system are pink. To following segments of code will produce a vector of the green or pink nodes for inspection.
non_cycle_nodes = V(graphs$orginal_graph)[ V( graphs$orginal_graph )$color == "lightgreen" ]$name cycle_nodes = V(graphs$orginal_graph)[ V(graphs$orginal_graph)$color == "pink" ]$name head( non_cycle_nodes )
##  "im_n" "im_s" "v_n" "v_s" "h_h_n" "h_h_s"
To beauty of using igraph as the back bone for this tool is that it provides a lot of flexibility in how we can construct such graphical representations of SFC models. Models can be created using adjacency matrices, edges list or other graphical objects from other packages can also handled, for the most part, pain free!Some useful reference materials: