Overview

The previous tutorials/vignettes showed several example models as way to illustrate how to use flowdiagramr.

This vignette is a (growing) list of additional model examples, which might be helpful to illustrate further ways of using the package. It shows both additional examples, and also illustrates several tricks and approaches to get things looking decently, even if flowdiagramr is not fully cooperating.

DSAIRM Models

The following set of models and diagrams comes from our DSAIRM package, which is used to teach within-host modeling for immunology. We do not discuss the meaning of the models and equations here. If you want to see that, please check out the DSAIRM package. We only show some of the model diagrams here as further examples.

Virus model

This is a model for a basic virus infection.

variables = c("U","I","V")
flows = list(U_flows = c("n","-dU*U","-b*U*V"),
             I_flows = c("b*U*V","-dI*I"),
             # V_flows = c("p*I", "-dV*V")
            V_flows = c("p*I", "-dV*V","-g*b*U*V") #original
)
model <- list(variables = variables, flows = flows)
layout = list(varlocations = matrix(c("U","I","V"),
                                    nrow = 1, byrow = TRUE),
              varspace_x_size = 1
)
dlist <- prepare_diagram(model,layout)
diag <- make_diagram(dlist)
plot(diag)

Example 1

Currently not working, is here to remind us to extend to more then 2 variables.

This is a model that describes the infection or vaccination dynamics of an acute viral infection in a simplified manner. The model tracks virus/antigen (H), and a few immune response components. These are the differential equations for the model.

\[ \begin{aligned} \textrm{Antigen} \qquad \dot{H} & = - kAH - c H \\ \textrm{Interferon} \qquad \dot{F} & = p - m F + q (F_{max} - F) \frac{H}{H + n} \\ \textrm{CD4 T-cells} \qquad \dot{T} & = \frac{FHT}{FH + h_T} + g_TT \\ \textrm{B-cells} \qquad \dot{B} & = g B(\frac{r_H HF }{s_1 + HF} + \frac{r_T TF}{s_2 + TF}) \\ \textrm{Antibodies} \qquad \dot{A} & = r B - kAH - d A \\ \end{aligned} \]

This is the same information formatted as a structure that can be used as input for prepare_diagram.

PREPARE_DIAGRAM CURRENTLY ERRORS OUT ON THIS. IT SHOULD THEORETICALLY WORK, I THINK THE MODEL AND FLOWS ARE PROPERLY SPECIFIED. BUT THE FLOWS MIGHT BE TOO COMPLEX TO PARSE?

variables = c("H","F","T","B","A")
flows = list(H_flows = c("-kA*A*H", "-dH*H"),
             F_flows = c("pF" ,"-dF*F", "H/H + hH) * gF * (fmax - F)"),
             T_flows = c("F*H*T/(F*H + hT)" ,"+ gT*T"),
             B_flows = c("gB * B * rH*F*H/(s1+F*H)",  "gB * B *rT*F*T/(s2+F*T)" ),
             A_flows = c("rA*B",  "- dA*A", "- kA*A*H") 
             )
model_list = list(variables = variables, flows = flows)
#diagram_list <- prepare_diagram(model_list)
#varnames = c("Antigen","Interferon","T-cells","B-cells","Antibody")

Example 2

This is the simple predator-prey model, with some styling applied.

First, we specify the model again. We did a bit of renaming here, what we called pathogen before is now called bacteria and labeled B and the Immune response is abbreviated as I. Parameter names have been adjusted accordingly, but otherwise it is the same model you already saw.

# specify the model
variables = c("B","I")
flows = list(B_flows = c("+g*B*(1-B/bmax)", "-dB*B", "-k*B*I"),
             I_flows = c("+r*B*I", "-dI*I"))
ppmodel = list(variables = variables, flows = flows)

Next, we prepare the input list of data frames

# prepare inputs 
pp_diagram_list <- prepare_diagram(ppmodel)

Now we apply some styling:

# get element names
update_diagram(pp_diagram_list)
#> No settings were provided; returning names of elements in diagram_list dataframes.
#> Variables: B, I
#> Flows: m_gB1Bbmax, m_rBI, e_dII, e_dBB, e_kBI, i_kBI, i_rBI

# define adjusted settings for layout
diagram_settings1 = list(
    var_fill_color = c(B = "#6aa4c8", I = "#eb5600"),
    var_label_color = c(all = "gray"),
    var_label_size = c(all = 12),
    flow_label_color = c(main = "blue"),
    flow_label_size = c(main = 6),
    flow_line_color = c(main = "grey50", interaction = "grey25"),
    flow_line_type = c(main = "solid", interaction = "dashed"),
    flow_line_size = c(main = 1.2, interaction = 0.8)
)

pp_diag_list2 <- update_diagram(pp_diagram_list, diagram_settings1)

# make diagram with adjusted settings
diag2 <- make_diagram(pp_diag_list2)
plot(diag2)

For the next diagram, we are turning off the interactions and only show the main flows, that means processes that actually move some entity (here bacteria and immune response) from one state to the next. Any settings pertaining to the styling of the not shown components are ignored.

# specify custom settings for the diagram layout
diagram_settings2 <- list(
    flow_show_arrow = c(interaction = FALSE),  
    flow_show_label = c(external = FALSE)
)

pp_diag_list3 <- update_diagram(pp_diag_list2, diagram_settings2)
diag3 <- make_diagram(pp_diag_list3)
plot(diag3)

As you can see, not showing the interactions or not labeling some of the flows doesn’t produce a very useful diagram. In general, as long as it is decently readable, you should show and label all components of your model.

Here is another example, the model shown with vertical alignment

THIS LOOKS PRETTY BAD AT THE MOMENT

varlocations <-  matrix(data = c("B", "I"),
                        nrow = 2, byrow = TRUE)
mysettings <- list(varlocations = varlocations)
diag_list <- prepare_diagram(ppmodel, mysettings)
diagram_settings = list(var_label_text = c(B = "Bacteria", I = "Immune Response"),
                                               var_label_size = c(all = 4)
                        )
diag_list2 <- update_diagram(diag_list, diagram_settings)

mydiag <- make_diagram(diag_list2)
plot(mydiag)