This vignette is an example of modelling a decision tree using the
`rdecision`

package, with probabilistic sensitivity analysis
(PSA). It is based on the model reported by Jenks *et al*^{1} in which a transparent dressing
used to secure vascular catheters (Tegaderm CHG) was compared with a
standard dressing.

Thirteen source variables were used in the model. The choice of
variables, their distributions and their parameters are taken from Table
3 of Jenks *et al*^{1},
with the following additional information:

- For variables with lognormal uncertainty, the company synthesized a
log normal distribution as \(\exp(\mu + \sigma
r())\) where \(r()\) is a random
draw from a standard normal distribution. This is equivalent to the
`LN1`

parametrization of the`LogNormModVar`

provided in`rdecision`

. - The values for \(\mu\) and \(\sigma\) for the hazard ratio for CRBSI and LSI were -0.911 and -0.393 respectively, and 1.482 and 0.490 for the relative risk of dermatitis. The point estimates in the company’s model were taken at \(\exp(-0.911)\) (0.402) and \(\exp(1.482)\) (4.40), the expected value of the uncertainty distributions on the log scale, rather than at the expected values on the linear scale (0.434 and 4.963). In this vignette the latter are used for consistency between base case and PSA.
- The probabilities of CRBSI and LSI for standard dressings (\(p\)) were modified by the hazard ratio for Tegaderm using the form \((1-(1-p)^r)\) where \(r\) is the hazard ratio. Relative risks were applied as multipliers.
- The point estimate cost of CRBSI was £9900, not £9990, although the parameters (198,50) are quoted correctly.

The model variables were constructed as follows:

```
# clinical variables
<- NormModVar$new(
r.CRBSI "Baseline CRBSI rate", "/1000 catheter days", mu = 1.48, sigma = 0.074
)<- LogNormModVar$new(
hr.CRBSI "Tegaderm CRBSI HR", "HR", p1 = -0.911, p2 = 0.393
)<- LogNormModVar$new(
hr.LSI "Tegaderm LSI HR", "HR", p1 = -0.911, p2 = 0.393
)<- NormModVar$new(
r.Dermatitis "Baseline dermatitis risk", "/catheter", mu = 0.0026, sigma = 0.00026
)<- LogNormModVar$new(
rr.Dermatitis "Tegaderm Dermatitis RR", "RR", p1 = 1.482, p2 = 0.490
)# cost variables
<- GammaModVar$new(
c.CRBSI "CRBSI cost", "GBP", shape = 198.0, scale = 50.0
)<- GammaModVar$new(
c.Dermatitis "Dermatitis cost", "GBP", shape = 30.0, scale = 5.0
)<- GammaModVar$new(
c.LSI "LSI cost", "GBP", shape = 50.0, scale = 5.0
)<- NormModVar$new(
n.catheters "No. catheters", "catheters", mu = 3.0, sigma = 0.3
)<- ExprModVar$new(
c.Tegaderm "Tegaderm CHG cost", "GBP", rlang::quo(6.21 * n.catheters)
)<- ExprModVar$new(
c.Standard "Standard dressing cost", "GBP", rlang::quo(1.34*n.catheters)
)<- NormModVar$new(
n.cathdays "No. days with catheter", "days", mu = 10.0, sigma = 2.0
)
```

Variables in the model may be included in the decision tree via mathematical expressions, which involve model variables and are themselves model variables. Forms of expression involving R functions and multiple model variables are supported, provided they conform to R syntax. The following code creates the model variable expressions to be used as values in the decision tree edges. For probabilities, the convention \(q = 1-p\) is used to ensure that the sum of probabilities leaving each chance node is one.

```
# probabilities
<- ExprModVar$new(
p.Dermatitis.S "P(dermatitis | standard dressing)", "P",
::quo(r.Dermatitis * n.catheters)
rlang
)<- ExprModVar$new(
q.Dermatitis.S "Q(dermatitis | standard dressing)", "1 - P",
::quo(1.0 - p.Dermatitis.S)
rlang
)<- ExprModVar$new(
p.Dermatitis.T "P(dermatitis | Tegaderm)", "P",
::quo(r.Dermatitis * rr.Dermatitis * n.catheters)
rlang
)<- ExprModVar$new(
q.Dermatitis.T "Q(dermatitis | Tegaderm)", "1 - P",
::quo(1.0 - p.Dermatitis.T)
rlang
)
<- NormModVar$new(
p.LSI.S "P(LSI | Standard)", "/patient", mu = 0.1, sigma = 0.01
)<- ExprModVar$new(
q.LSI.S "Q(LSI | Standard)", "1 - P", rlang::quo(1.0 - p.LSI.S)
)<- ExprModVar$new(
p.LSI.T "P(LSI | Tegaderm)", "P", rlang::quo(1.0 - (1.0 - p.LSI.S) ^ hr.LSI)
)<- ExprModVar$new(
q.LSI.T "Q(LSI | Tegaderm)", "1 - P", rlang::quo(1.0 - p.LSI.T)
)
<- ExprModVar$new(
p.CRBSI.S "P(CRBSI | standard dressing)", "P",
::quo(r.CRBSI * n.cathdays / 1000.0)
rlang
)<- ExprModVar$new(
q.CRBSI.S "Q(CRBSI | standard dressing)", "1 - P", rlang::quo(1.0 - p.CRBSI.S)
)<- ExprModVar$new(
p.CRBSI.T "P(CRBSI|Tegaderm)", "P",
::quo(1.0 - (1.0 - r.CRBSI * n.cathdays / 1000.0) ^ hr.CRBSI)
rlang
)<- ExprModVar$new(
q.CRBSI.T "Q(CRBSI | Tegaderm)", "1 - P", rlang::quo(1.0 - p.CRBSI.T)
)
```

The following code constructs the decision tree based on Figure 2 of
Jenks *et al*^{1}. In the
formulation used by `rdecision`

, the decision tree is
constructed from sets of decision, chance and leaf nodes and from edges
(actions and reactions). Leaf nodes are synonymous with pathways in
Briggs’ terminology^{2}. The time
horizon is not stated explicitly in the model, and is assumed to be 7
days. It was implied that the time horizon was ICU stay plus some
follow-up, and the costs reflect those incurred in that period, so the
assumption of 7 days does not affect the `rdecision`

implementation of the model.

The tree is somewhat more complex than Figure 2 of Jenks *et
al* because it allows for patients to have more than one adverse
event (AE) during their stay (whereas their Figure 2 implies that only
one event per patient is possible). The rates of AE were estimated
independently, and allow for multiple events, see figure.

```
# create decision tree
<- as.difftime(7L, units = "days")
th # standard dressing
<- LeafNode$new("t01", interval = th)
t01 <- LeafNode$new("t02", interval = th)
t02 <- ChanceNode$new()
c01 <- Reaction$new(c01, t01, p = p.Dermatitis.S, cost = c.Dermatitis,
e01 label = "Dermatitis")
<- Reaction$new(c01, t02, p = q.Dermatitis.S, cost = 0.0,
e02 label = "No dermatitis")
#
<- LeafNode$new("t03", interval = th)
t03 <- LeafNode$new("t04", interval = th)
t04 <- ChanceNode$new()
c02 <- Reaction$new(c02, t03, p = p.Dermatitis.S, cost = c.Dermatitis,
e03 label = "Dermatitis")
<- Reaction$new(c02, t04, p = q.Dermatitis.S, cost = 0.0,
e04 label = "No dermatitis")
#
<- ChanceNode$new()
c03 <- Reaction$new(c03, c01, p = p.LSI.S, cost = c.LSI, label = "LSI")
e05 <- Reaction$new(c03, c02, p = q.LSI.S, cost = 0.0, label = "No LSI")
e06 #
<- LeafNode$new("t11", interval = th)
t11 <- LeafNode$new("t12", interval = th)
t12 <- ChanceNode$new()
c11 <- Reaction$new(c11, t11, p = p.Dermatitis.S, cost = c.Dermatitis,
e11 label = "Dermatitis")
<- Reaction$new(c11, t12, p = q.Dermatitis.S, cost = 0.0,
e12 label = "No Dermatitis")
#
<- LeafNode$new("t13", interval = th)
t13 <- LeafNode$new("t14", interval = th)
t14 <- ChanceNode$new()
c12 <- Reaction$new(c12, t13, p = p.Dermatitis.S, cost = c.Dermatitis,
e13 label = "Dermatitis")
<- Reaction$new(c12, t14, p = q.Dermatitis.S, cost = 0.0,
e14 label = "No dermatitis")
#
<- ChanceNode$new()
c13 <- Reaction$new(c13, c11, p = p.LSI.S, cost = c.LSI, label = "LSI")
e15 <- Reaction$new(c13, c12, p = q.LSI.S, cost = 0.0, label = "No LSI")
e16 #
<- ChanceNode$new()
c23 <- Reaction$new(c23, c03, p = p.CRBSI.S, cost = c.CRBSI, label = "CRBSI")
e21 <- Reaction$new(c23, c13, p = q.CRBSI.S, cost = 0.0, label = "No CRBSI")
e22 #
# Tegaderm branch
<- LeafNode$new("t31", interval = th)
t31 <- LeafNode$new("t32", interval = th)
t32 <- ChanceNode$new()
c31 <- Reaction$new(c31, t31, p = p.Dermatitis.T, cost = c.Dermatitis,
e31 label = "Dermatitis")
<- Reaction$new(c31, t32, p = q.Dermatitis.T, cost = 0.0,
e32 label = "no dermatitis")
#
<- LeafNode$new("t33", interval = th)
t33 <- LeafNode$new("t34", interval = th)
t34 <- ChanceNode$new()
c32 <- Reaction$new(c32, t33, p = p.Dermatitis.T, cost = c.Dermatitis,
e33 label = "Dermatitis")
<- Reaction$new(c32, t34, p = q.Dermatitis.T, cost = 0.0,
e34 label = "No dermatitis")
#
<- ChanceNode$new()
c33 <- Reaction$new(c33, c31, p = p.LSI.T, cost = c.LSI, label = "LSI")
e35 <- Reaction$new(c33, c32, p = q.LSI.T, cost = 0.0, label = "No LSI")
e36 #
<- LeafNode$new("t41", interval=th)
t41 <- LeafNode$new("t42", interval=th)
t42 <- ChanceNode$new()
c41 <- Reaction$new(c41, t41, p = p.Dermatitis.T, cost = c.Dermatitis,
e41 label = "Dermatitis")
<- Reaction$new(c41, t42, p = q.Dermatitis.T, cost = 0.0,
e42 label = "No dermatitis")
#
<- LeafNode$new("t43", interval = th)
t43 <- LeafNode$new("t44", interval = th)
t44 <- ChanceNode$new()
c42 <- Reaction$new(c42, t43, p = p.Dermatitis.T, cost = c.Dermatitis,
e43 label = "Dermatitis")
<- Reaction$new(c42, t44, p = q.Dermatitis.T, cost = 0.0,
e44 label = "No dermatitis")
#
<- ChanceNode$new()
c43 <- Reaction$new(c43, c41, p = p.LSI.T, cost = c.LSI, label = "LSI")
e45 <- Reaction$new(c43, c42, p = q.LSI.T, cost = 0.0, label = "No LSI")
e46 #
<- ChanceNode$new()
c53 <- Reaction$new(c53, c43, p = p.CRBSI.T, cost = c.CRBSI, label = "CRBSI")
e51 <- Reaction$new(c53, c33, p = q.CRBSI.T, cost = 0.0, label = "no CRBSI")
e52 #
# decision node
<- DecisionNode$new("d1")
d1 <- Action$new(d1, c23, label = "Standard", cost = c.Standard)
e9 <- Action$new(d1, c53, label = "Tegaderm", cost = c.Tegaderm)
e10 #
# create decision tree
<- list(d1,
V
c01, c02, c03, c11, c12, c13, c23, c31, c32, c33, c41, c42, c43, c53,
t01, t02, t03, t04, t11, t12, t13, t14, t31, t32, t33, t34,
t41, t42, t43, t44)<- list(e01, e02, e03, e04, e05, e06, e11, e12, e13, e14, e15, e16, e21, e22,
E
e31, e32, e33, e34, e35, e36, e41, e42, e43, e44, e45, e46, e51, e52,
e9,e10)<- DecisionTree$new(V, E) DT
```

In the company’s model, the uncertainties in the probabilities associated with the polytomous chance nodes were modelled as independent variables. This is not recommended because there is a chance that a particular run of the PSA will yield probabilities that are outside the range [0,1].

The model variables which will be associated with actions, reactions
and leaf nodes can be tabulated using the method
`modvar_table`

. This returns a data frame describing each
variable, its description, units and uncertainty distribution. Variables
inheriting from type `ModVar`

will be included in the
tabulation unless explicitly excluded, regular numeric values will not
be listed. In the Tegaderm model, the input model variables are in the
following table, with expression model variables excluded.

Description | Distribution |
---|---|

Dermatitis cost | Ga(30,5) |

Baseline dermatitis risk | N(0.0026,0.00026) |

No. catheters | N(3,0.3) |

LSI cost | Ga(50,5) |

P(LSI | Standard) | N(0.1,0.01) |

CRBSI cost | Ga(198,50) |

Baseline CRBSI rate | N(1.48,0.074) |

No. days with catheter | N(10,2) |

Tegaderm Dermatitis RR | LN(1.482,0.49) |

Tegaderm LSI HR | LN(-0.911,0.393) |

Tegaderm CRBSI HR | LN(-0.911,0.393) |

The point estimates, units and distributional properties are obtained from the same call, in the remaining columns.

Variable | Mean | Q2.5 | Q97.5 |
---|---|---|---|

Dermatitis cost, GBP | 150 | 101 | 208 |

Baseline dermatitis risk, /catheter | 0.0026 | 0.00209 | 0.00311 |

No. catheters, catheters | 3 | 2.41 | 3.59 |

LSI cost, GBP | 250 | 186 | 324 |

P(LSI | Standard), /patient | 0.1 | 0.0804 | 0.12 |

CRBSI cost, GBP | 9900 | 8569 | 11326 |

Baseline CRBSI rate, /1000 catheter days | 1.48 | 1.33 | 1.63 |

No. days with catheter, days | 10 | 6.08 | 13.9 |

Tegaderm Dermatitis RR, RR | 4.96 | 1.68 | 11.5 |

Tegaderm LSI HR, HR | 0.434 | 0.186 | 0.869 |

Tegaderm CRBSI HR, HR | 0.434 | 0.186 | 0.869 |

The following code runs a single model scenario, using the
`evaluate`

method of a decision node to evaluate each pathway
from the decision node, shown in the table. This model did not consider
utility, and the columns associated with utility are removed.

Run | d1 | Cost |
---|---|---|

1 | Standard | 176.7 |

1 | Tegaderm | 99.54 |

The sensitivity of the decision tree results to each source model
variable, varied independently of the others, is demonstrated by a
tornado diagram. The method `tornado`

can be used to generate
such a plot (and also provides a tabulated version of the values used in
the plot). Source variables are varied over their 95% confidence limits,
see figure.

Multivariate probabilistic sensitivity analysis is supported through the use of sampling model variables. The same call, with extra parameters, is used to run the PSA:

```
<- 1000L
N <- DT$evaluate(setvars = "random", by = "run", N = N) PSA
```

The first few runs of PSA are as follows; the `by="run"`

option reshapes the table to give one row per simulation, rather than
one row per run, per strategy.

Run | Cost.Tegaderm | Cost.Standard | Difference |
---|---|---|---|

1 | 86.03 | 154.6 | -68.58 |

2 | 139.7 | 183.6 | -43.89 |

3 | 120.5 | 163.4 | -42.94 |

4 | 95.27 | 177.9 | -82.66 |

5 | 72.74 | 151.9 | -79.13 |

6 | 94.55 | 158 | -63.46 |

7 | 76.57 | 144.7 | -68.16 |

8 | 129.4 | 153.9 | -24.56 |

9 | 126.6 | 210.8 | -84.16 |

10 | 95.32 | 125.7 | -30.4 |

From PSA (1000 runs), the mean cost of treatment with Tegaderm was 99.61, the mean cost of treatment with standard dressings was 177.14 and the mean cost saving was -77.54. The 95% confidence interval for cost saving was -143.82 to -10.09; the standard deviation of the cost saving was 32.83. Overall, 98.7% of runs found that Tegaderm was cost saving. These results replicate those reported by the manufacturer (saving of 77.76, 98.5% cases cost saving; mean cost of standard dressing 176.89, mean cost of Tegaderm 99.63).

1.

Jenks, M., Craig, J., Green, W., Hewitt, N.,
Arber, M. & Sims, A. J. Tegaderm CHG IV
Securement Dressing for Central Venous and
Arterial Catheter Insertion Sites: A NICE Medical
Technology Guidance. *Applied Health Economics and Health
Policy* **14,** 135–149 (2016).

2.

Briggs, A., Claxton, K. & Sculpher, M.
*Decision modelling for health economic evaluation*.
(Oxford University Press, 2006).