A potentially attractive approach to modelling complex health systems
is to begin with a relatively simple computational model and to
progressively extend its scope and sophistication. Such an approach
could be described as “modular” if it is possible to readily combine
multiple discrete modelling projects (potentially developed by different
modelling teams) that each independently describe distinct aspects of
the system being modelled. The ready4
package provides
foundational elements of a software framework to support the development
of modular and open-source computational health economic models using
R.
Modular model development is enabled by the encapsulation
and inheritance features of Object Oriented Programming (OOP).
Specifically, ready4
uses two of R’s systems for
implementing OOP - S3 and S4. An in-depth explanation of R’s different
class system is beyond the scope of this article, but is explored in Hadley Wickham’s Advanced R
handbook. However, it is useful to know some very high level
information about S3 and S4 classes:
S4 classes are frequently said to be “formal”, “strict” or “rigorous”. The elements of an S4 class are called slots and the type of data that each slot is allowed to contain is specified in the class definition. An S4 class can be comprised of slots that contain different types of data (e.g. a slot that contains a character vector and another slot that contains tabular data).
S3 classes are often described as “simple”, “informal” and “flexible”. S3 objects attach an attribute label to base type objects (e.g. a character vector, a data.frame, a list), which in turn is used to work out what methods should be applied to the class.
As we use the term, a “model module” is comprised of both a
data-structure (or “class”) and algorithms (or “methods”) that are
associated with that data-structure. A model module can be used to model
a discrete component of a health economic system. Model modules can be
created from a template - the ready4
package’s
Ready4Module
class.
We can create an object (X
) from the
Ready4Module
template using the following command.
However, if we inspect X
we can see it is of limited use
as it contains no data other than an empty element called
dissemination_1L_chr
.
## Formal class 'Ready4Module' [package "ready4"] with 1 slot
## ..@ dissemination_1L_chr: chr NA
The Ready4Module
class is therefore not intended to be
called directly. Instead, the purpose of Ready4Module
is to
be the parent class of other templates for creating model modules.
Ready4Module
and all of its child-classes (ie all model
module templates) are “S4” classes.
ready4 Concept
An instance of Ready4Module
(or classes that inherit
from Ready4Module
) and its associated methods.
In ready4, S3 classes are principally used to help define the structural properties of slots (array elements) of model modules and the methods that can be applied to these slots. S3 classes created for these purposes are called sub-modules.
ready4 Concept
An instance of an informal (S3) class and its associated methods that describes, validates and applies algorithms to a slot of a Module.
All methods associated with modules and sub-modules adopt a
common syntax. However, the algorithms implemented by each command
in that syntax will vary depending on which module it is applied to. A
limited number of methods are defined for the Ready4Module
template which by default are inherited by all other module templates.
Currently, the only methods defined for Ready4Module
are slot-methods
and these can be itemised using the get_methods
function.
## [1] "authorSlot" "characterizeSlot" "depictSlot"
## [4] "enhanceSlot" "exhibitSlot" "ingestSlot"
## [7] "investigateSlot" "manufactureSlot" "metamorphoseSlot"
## [10] "procureSlot" "prognosticateSlot" "ratifySlot"
## [13] "reckonSlot" "renewSlot" "shareSlot"
Developers using the extended ready4 software framework can use our module authoring tools to add new methods or overwrite inherited default methods.