An R wrapper for pysd, using the CRAN reticulate package.
The goal of this package is to allow R users run system dynamicsmodels usingpysd,(designed and developed byJames Houghton). The pysdproject “is a simple library for running System Dynamics models inpython, with the purpose of improving integration of Big Data andMachine Learning into the SD workflow.”
The pysd system must be installed before installing this package:see pysdinstallation instructions
pysd2r has been tested with python3, and the following command wasused to install pysd from source.
python3 setup.py install
Given R’s facility for also providing big data and machine learningsupport, this package opens up the functionality of pysd for R users,and provides an interface to the basic set of methods provided by pysd,including the functions:
The API provide by pysd2r includes the following functions (for listof parameters type ?function_name in R) which call the mappingfunctions in pysd.
You can install pysd2r from github with:
# install.packages("devtools")devtools::install_github("JimDuggan/pysd2r")The following example shows how pysd2r can be used to run asimulation model (Population.mdl which is a one-stock Vensim model ofpopulation growth).
## basic example codelibrary(pysd2r)#> Welcome to package pysd2r.library(ggplot2)target<-system.file("models/vensim","Population.mdl",package ="pysd2r")py<-pysd_connect()py<-read_vensim(py, target)results<-run_model(py)l<-list("Growth Fraction"=0.02)set_components(py,l)out2<-run_model(py)ggplot(data=results)+geom_point(aes(x=TIME,y=Population),colour="blue")+geom_point(data=out2,aes(x=TIME,y=Population),colour="red")
The following example shows how pysd2r can be used to run an ensembleof simulations.
library(pysd2r)library(ggplot2)library(plyr)library(dplyr)#>#> Attaching package: 'dplyr'#> The following objects are masked from 'package:plyr':#>#> arrange, count, desc, failwith, id, mutate, rename, summarise,#> summarize#> The following objects are masked from 'package:stats':#>#> filter, lag#> The following objects are masked from 'package:base':#>#> intersect, setdiff, setequal, uniontarget<-system.file("models/vensim","Population.mdl",package ="pysd2r")gr<-seq(0.01,0.04,by=0.0025)py<-pysd_connect()py<-read_vensim(py, target)ans<-lapply(gr,function (g){ l<-list("Growth Fraction"=g)set_components(py,l) out<-run_model(py) out$Key<-paste0("GR=",g) out<-select(out,TIME,Population,Key)})full<-rbind.fill(ans)ggplot(data=full)+geom_point(aes(x=TIME,y=Population,colour=Key))