Martin Spielauer                                                                                The RiskPaths teaching model 
21 
Figure 7: Mortality parameters 
Parameters  are declared within  a “parameters {…};” 
code block.  Modgen  supports numeric 
types, such as int, long, float, double, or Boolean (“logical” in the Modgen terminology). The 
dimensionality of the parameters in the RiskPaths model is defined by classifications and ranges. 
The following code generates the parameters for RiskPaths, as displayed in Figure 7. For the 
annual death probabilities we use the range  LIFE  that was defined in PersonCore.mpp. The 
following statement (parameter_group) groups the two mortality parameters in order to provide 
an ordered hierarchical selection list in the user interface (again, as displayed in Figure 3).  
parameters   
logical CanDie; 
//EN Switch mortality on/off 
double  ProbMort[LIFE];  
//EN Death probabilities   
}; 
parameter_group P01_Mortality  
//EN Mortality 
CanDie, ProbMort 
};
Actor declarations 
Actors are  described by  states which  are changed  in events. States can be both  continuous 
(integer or real) or categorical. In the mortality module, the state of interest is whether a person is 
alive or not, thus making it categorical in nature. The levels of a categorical state are defined with 
the Modgen classification command.  
We declare a state life_status of type LIFE_STATE, which is initialized with LS_ALIVE at birth 
and set to LS_NOT_ALIVE by the death event. It is good practice to initialize all states by 
assigning  initial  values.  Each  initial  value,  however,  must be  enclosed  in  braces,  i.e.  {}—
otherwise, the state is implemented as a derived state.  
Convert pdf to tiff - control application system:C# PDF Convert to Tiff SDK: Convert PDF to tiff images in C#.net, ASP.NET MVC, Ajax, WinForms, WPF
Online C# Tutorial for How to Convert PDF File to Tiff Image File
www.rasteredge.com
Convert pdf to tiff - control application system:VB.NET PDF Convert to Tiff SDK: Convert PDF to tiff images in vb.net, ASP.NET MVC, Ajax, WinForms, WPF
Free VB.NET Guide to Render and Convert PDF Document to TIFF
www.rasteredge.com
Martin Spielauer                                                                                The RiskPaths teaching model 
22 
classification LIFE_STATE  
//EN Life status 
LS_ALIVE, 
//EN Alive  
LS_NOT_ALIVE 
//EN Dead 
}; 
actor Person 
LIFE_STATE life_status = {LS_ALIVE}; 
//EN Life Status 
event timeDeathEvent, DeathEvent; 
//EN Death Event  
};  
Events are declared in the actor Person {..} block using the keyword event. All events consist of 
a function which returns the time of the next event and a function containing the code describing 
the consequences of the event. 
Event implementation 
When mortality is activated, the timeDeathEvent function returns a random time based on the 
mortality  parameter  for  the  given  year  of  age.  In  order  to  obtain  random  durations  from 
probabilities, we assume constant mortality hazards within each period, i.e. between birthdays. 
(The exception is a death probability of 1, which leads to death immediately at the start of the age 
year).  Note that any time later than the next birthday will lead to the  birthday event taking 
precedence over the mortality event; that is, the birthday event will censor the mortality event.  
TIME Person::timeDeathEvent()  
TIME event_time = TIME_INFINITE
if (CanDie)  
if (ProbMort[integer_age] >= 1)  
event_time = WAIT(0); 
else   
event_time = WAIT(-log(RandUniform(3)) /  
-log(1 - ProbMort[integer_age])); 
// Death event can not occur after the maximum duration of life 
if (event_time > MAX(LIFE))   
event_time = MAX(LIFE); 
return event_time; 
The  event  implementation  function  DeathEvent  is  straightforward.  It  sets  the  life_status  to 
LS_NOT_ALIVE and calls the function Finish(), the latter which deletes the actor.  
control application system:Online Convert PDF file to Tiff. Best free online PDF Tif
Using this .NET PDF to TIFF conversion control, C# developers can render and convert PDF document to TIFF image file with no loss in original file quality.
www.rasteredge.com
control application system:Online Convert PDF file to Word. Best free online PDF Conversion
Download Free Trial. Convert a Tiff/Tif File to PDF. Easy converting! We try to make it as easy as possible to convert your Tiff/Tif files to PDF.
www.rasteredge.com
Martin Spielauer                                                                                The RiskPaths teaching model 
23 
void Person::DeathEvent() 
life_status = LS_NOT_ALIVE;  
Finish(); 
7.3.2  Fertility.mpp 
This file defines and implements the first pregnancy event. As we are only interested in the study 
of childlessness in RiskPaths,  no other fertility-related event is  simulated.  Fertility.mpp  is a 
behavioural  module, and  again we follow  the  same standard organization of the code: type 
definitions, parameter declarations, actor declarations and event implementations.  
Parameter declarations 
Fertility is parameterized by both a baseline pregnancy risk by 2.5 year age intervals starting at 
the 15
th
birthday and a relative risk factor dependent on the union status and duration. We thus 
define two parameters: AgeBaselinePreg1 and UnionStatusPreg1. 
Figure 8: Fertility parameters 
Fertility risks use a time partition to define the columns. For the age baseline we use the partition 
AGEINT_STATE that was defined in PersonCore.mpp. The possible union states for the relative 
risk factors use the classification UNION_STATE which is declared in PersonCore.mpp as well.  
parameters   
//EN Age baseline for first pregnancy  
double AgeBaselinePreg1[AGEINT_STATE]; 
//EN Relative risks of union status on first pregnancy 
double UnionStatusPreg1[UNION_STATE]; 
}; 
parameter_group P02_Ferility   
//EN Fertility  
AgeBaselinePreg1, UnionStatusPreg1 
}; 
control application system:Online Convert Excel to PDF file. Best free online export xlsx
Download Free Trial. Convert a Excel File to PDF. Easy converting! We try to make it as easy as possible to convert your xlsx/xls files to PDF.
www.rasteredge.com
control application system:C# Create PDF from Tiff Library to convert tif images to PDF in C#
filePath). Description: Convert to PDF/TIFF with specified zoom value and save it on the disk. Parameters: Name, Description, Valid Value.
www.rasteredge.com
Martin Spielauer                                                                                The RiskPaths teaching model 
24 
Actor declarations 
The only state of the fertility module is parity_status, which can only have two levels: ‘childless’ 
and ‘pregnant’. (This is because RiskPaths no longe r simulates an actor’s fertility events after 
first conception).  
In Fertility.mpp, we only model one event: pregnancy. The corresponding pair of event functions 
is timeFirstPregEvent and FirstPregEvent.  
classification PARITY_STATE   
//EN Parity status 
PS_CHILDLESS, 
//EN Childless 
PS_PREGNANT  
//EN Pregnant 
}; 
actor Person 
//EN Parity status derived from the state parity 
PARITY_STATE parity_status = {PS_CHILDLESS}; 
//EN First pregnancy event  
event timeFirstPregEvent, FirstPregEvent;  
}; 
Event implementation 
As is true with all Modgen events, the first pregnancy event is implemented in two parts. The 
first determines the timing of the event, the second the consequences if the event happens. The 
timeFirstPregEvent function verifies if the actor is currently at risk and, if so, draws a random 
duration  based  on  the  underlying  piecewise  proportional  constant  hazard  regression  model 
parameterized by an age baseline and relative risk by union status. Accordingly, the hazard rate is 
calculated from the two parameters AgeBaselinePreg1 and UnionStatusPreg1. A random duration 
can be obtained from a uniform distributed random number by the transformation:  
randdur = - log(RandUniform(1)) / hazard.  
The Modgen function RandUniform() returns a uniform distributed random number between 0-1. 
The function takes an integer argument used to assign a different independent random number 
stream to each random number function in the code. When omitted, Modgen automatically writes 
back a unique index into the .mpp file before translation into C++ code.  
When  the  event happens,  the  state  “parity”  is  incre ased by  1.  (Note  that  the  derived state 
parity_status is changed to “PS_PREGNANT” automatic ally).  
TIME Person::timeFirstPregEvent() 
double dHazard = 0; 
TIME event_time = TIME_INFINITE
if (parity_status == PS_CHILDLESS)   
control application system:C# PDF Convert to Jpeg SDK: Convert PDF to JPEG images in C#.net
C# PDF - Convert PDF to JPEG in C#.NET. C#.NET PDF to JPEG Converting & Conversion Control. Convert PDF to JPEG Using C#.NET. Add necessary references:
www.rasteredge.com
control application system:VB.NET PDF Convert to HTML SDK: Convert PDF to html files in vb.
Convert PDF to HTML. |. Home ›› XDoc.PDF ›› VB.NET PDF: PDF to HTML. Convert PDF to HTML in VB.NET Demo Code. Add necessary references:
www.rasteredge.com
Martin Spielauer                                                                                The RiskPaths teaching model 
25 
dHazard = AgeBaselinePreg1[age_status] 
* UnionStatusPreg1[union_status]; 
if (dHazard > 0) 
 
event_time = WAIT(-log(RandUniform(1)) / dHazard); 
return event_time; 
void Person::FirstPregEvent()  
parity_status – PS_PREGNANT;   
}
7.3.3  Unions.mpp 
The  programming  of  union  transitions  introduces  only  minor  new  concepts  in  Modgen 
programming--thus, the following code discussion is mainly limited to union dissolutions. The 
hazard rates for both first and second union dissolution events are stored in the same parameter 
table, as they each use the same time intervals of union duration. 
In order to construct a parameter with the dimensions time and union order, we define a time 
partition and a classification:  
partition UNION_DURATION 
//EN Duration of current union 
1, 3, 5, 9, 13 
}; 
classification UNION_ORDER  
//EN Union order 
UO_FIRST, 
//EN First union   
UO_SECOND 
//EN Second union  
}; 
parameters   
… 
//EN Union Duration Baseline of Dissolution 
double UnionDurationBaseline[UNION_ORDER][UNION_DUR]; 
… 
}; 
control application system:C# PDF Convert to Word SDK: Convert PDF to Word library in C#.net
DocumentType.DOCX DocumentType.TIFF. zoomValue, The magnification of the original PDF page size. Description: Convert to DOCX/TIFF with specified resolution and
www.rasteredge.com
control application system:VB.NET PDF Convert to Jpeg SDK: Convert PDF to JPEG images in vb.
PDF from RTF. Create PDF from Text. PDF Export. Convert PDF to Word (.docx). Convert PDF to Tiff. Convert PDF to HTML. Convert PDF to
www.rasteredge.com
Martin Spielauer                                                                                The RiskPaths teaching model 
26 
Figure 9: Union dissolution parameters 
In  the  timeUnion1DissolutionEvent()  function,  hazard  rates  for  first  union  dissolution  are 
obtained as:  
dHazard = UnionDurationBaseline[UO_FIRST][union_duration];   
Accordingly, timeUnion2DissolutionEvent() references the second row from the parameter: 
dHazard = UnionDurationBaseline[UO_SECOND][union_duration];  
As opposed to the processes discussed so far, the union dissolution processes do not start at a 
predefined time (e.g. the 15
th
birthday) but at union formation events. The union duration spell is 
defined as a derived self-scheduling state in the following form: 
//EN Currently in an union  
logical in_union = (union_status == US_FIRST_UNION_PERIOD1   
|| union_status == US_FIRST_UNION_PERIOD2 
|| union_status == US_SECOND_UNION); 
//EN Time interval since union formation 
int 
union_duration = self_scheduling_split(  
active_spell_duration( in_union, TRUE), UNION_DURATION); 
With  respect to  union  formation, the implementation of the  clock which changes the union 
duration 
state 
union_status 
from 
US_FIRST_UNION_PERIOD1 
to 
US_FIRST_UNION_PERIOD2 after three years in a first union deserves some discussion. In 
contrast to the self-scheduling derived states used for all other clocks of the model, here – mainly 
as an illustration of this alternative - we explicitly implement the clock as an event itself. This 
event occurs after three years in the first union. The clock is set at first union formation. The 
actor declaration includes a state which records the time of the status change as well as the event 
declaration. 
actor Person  
… 
//EN Time of union period change 
TIME union_period2_change = {TIME_INFINITE}; 
Martin Spielauer                                                                                The RiskPaths teaching model 
27 
//EN Union period change event  
event timeUnionPeriod2Event, UnionPeriod2Event;  
};   
The time for the state change is set in the first union formation event. In the code sample, WAIT 
is a built-in Modgen function that returns the time of the current event, plus a specified time (in 
our example, three years). 
void Person::Union1FormationEvent()  
unions++; 
union_status = US_FIRST_UNION_PERIOD1; 
union_period2_change = WAIT(3); 
}  
The event implementation is straight forward: 
TIME Person::timeUnionPeriod2Event() 
return union_period2_change; 
void Person::UnionPeriod2Event() 
if (union_status == US_FIRST_UNION_PERIOD1) 
union_status = US_FIRST_UNION_PERIOD2;  
union_period2_change = TIME_INFINITE
}
7.4  Tables.mpp 
Modgen provides a very powerful and flexible cross-tabulation facility to report model results. 
The programming of each output  table usually requires only a few lines of code. RiskPaths 
contains only one table file which contains the declarations of all of its output tables—however, 
for more detailed models, it is advisable to split up table declarations by behavioural groups. 
The  basic  syntax  for  tables  is  displayed  in  Figure 6.  The  two  central  elements  of  a  table 
declaration are the captured classificatory dimensions (defining when an actor enters and leaves a 
cell) and the analysis dimension (recording what happens while an actor is in that cell). Typical 
classificatory dimensions are age or time intervals (e.g. fertility by age), states (e.g. fertility by 
union status), or a combination of both. Modgen does not limit the number of dimensions.  
The analysis dimension can contain many expressions, which can be states or derived states. 
Modgen provides a very useful list of special derived state functions which record, for example, 
the number of occurrences of certain events, the number of changes in states, or the duration in 
states. Two particularly helpful concepts are the keyword unit and the derived state function 
Martin Spielauer                                                                                The RiskPaths teaching model 
28 
duration() -- unit records the number of actors entering a table cell whereas duration() records 
the total time an actor stayed in the cell.  
Tables can contain filter criteria for defining if and under which conditions actor characteristics 
will be recorded. The Modgen table concepts are best understood by concrete examples as given 
below. As the full wealth of the Modgen table language goes beyond the scope of this chapter, 
you are also invited to consult the Modgen Developer’s Guide.  
Figure 6: Table Syntax 
table actor_name table_name 
//EN table label 
[filter_criteria]  
dimension_a * 
//EN dimension label 
… 
analysis_dimension_expression_x, 
//EN expression label 
… 
* dimension_n 
//EN dimension label 
… 
}; 
7.4.1  Table 1: Life expectancy 
The first table example contains summary values of our simulation and has no dimensions, i.e. 
cells apply to the entire population over the entire simulation period. We make use of the Modgen 
keyword unit, which counts the number of actors entering the cell of a table (in our example, the 
simulation itself), and the Modgen function duration() which sums up the time actors stay in this 
cell (in our example, the total years lived by all actors in the simulation). The average age at 
death of all actors in the simulation is then obtained by dividing duration() by unit. As for 
parameter declarations, comments placed in the code are used as labels in the application. (Note 
that in the table declaration below, the ‘decimals= 3’ portion of the comment is used to determine 
the number of decimal places in the table; this part of the comment does not carry through to the 
label used in the report). 
table Person T01_LifeExpectancy //EN 1) Life Expectancy 
unit 
// EN Total simulated cases 
duration(),  
// EN Total duration 
duration()/unit   
// EN Life expectancy decimals=3 
}; 
Martin Spielauer                                                                                The RiskPaths teaching model 
29 
7.4.2  Table 2: Life table 
In the second table we record the population by age. For output by age, we use integer_age as 
table dimension.  
table Person T02_TotalPopulationByYear 
//EN Life table 
//EN Age 
integer_age * 
unit,  
//EN Population start of year 
duration()  
//EN Average population in year 
}; 
Unit and duration() now refer to the number of entrances into - and durations within - one year 
age intervals. Unit thus counts the actors present at the beginning of each year, while duration() 
refers to the average population in the year.  
7.4.3  Tables 3 and 4: Age-specific fertility 
As well as the keywords unit and the derived state function duration(), states and a set of other 
derived state functions can be used in tables. If using a state without a function, Modgen records 
the change of the state while in a particular cell, i.e. the value of the state when the cell is exited 
minus the value of the state when the cell was entered.  
The  expression  transitions(parity_status,  PS_CHILDLESS,  PS_PREGNANT)  /  duration() 
records the (age specific) fertility as the number of birth events divided by the average number of 
women by year of age. 
The second expression is used to calculate the true rate, i.e. the number of birth events by 
exposure time. A woman is under exposure for first pregnancy when childless. We thus divide 
the number of events by the term ‘duration( parity_ status, PS_CHILDLESS )’.  
The table dimension is age in full years. As fertility is 0 until age 15 and very low after 40, the 
age  periods  before  15  and  after  40  are  not  further  divided.  We  thus  define  a  partition 
AGE_FERTILEYEARS  which  is  used  in  the  self_scheduling_split  which  defines  the  table 
dimension. 
partition AGE_FERTILEYEARS //EN Fertile age partition 
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,  
32, 33, 34, 35, 36, 37, 38, 39, 40  
}; 
table Person T03_FertilityByAge 
//EN Age-specific fertility   
//EN Age 
self_scheduling_split(age,AGE_FERTILEYEARS) * 
Martin Spielauer                                                                                The RiskPaths teaching model 
30 
//EN First birth rate all women decimals=4 
transitions( parity_status, PS_CHILDLESS, PS_PREGNANT ) /  
duration() , 
//EN First birth rate woman at risk decimals=4 
transitions( parity_status, PS_CHILDLESS, PS_PREGNANT ) / 
duration( parity_status, PS_CHILDLESS ) 
}; 
Table 4 produces first birth rates by the 2.5 year age groups used for parameterization. We also 
add an additional dimension, namely the union status; we thus obtain simulated values of the 
model parameters. 
table Person T04_FertilityRatesByAgeGroup //EN Fertility rates by age group 
[parity_status == PS_CHILDLESS] 
//EN Fertility decimals=4 
transitions( parity_status, PS_CHILDLESS, PS_PREGNANT ) /  
duration()   
self_scheduling_split(age, AGEINT_STATE) 
//EN Age interval 
* union_status 
//EN Union Status 
}; 
7.4.4  Table 5: Cohort fertility 
Table  5  calculates  two  cohort  measures  of  fertility  --  average  age  at  first  conception  and 
childlessness.  To  obtain  the  age  at  pregnancy  we  use  the  Modgen  derived  state  function 
value_at_transitions(parity_status,  PS_CHILDLESS  ,PS_PREGNANT, age) which  returns the 
value of one state  (age) at a  specific  transition  of another state, namely when parity_status 
changes from PS_CHILDLESS to PS_PREGNANT.  
table Person T05_CohortFertility 
//EN Cohort fertility  
//EN Av. age at 1st pregnancy decimals=2 
value_at_transitions(parity_status,PS_CHILDLESS,PS_PREGNANT,age)/ 
transitions( parity_status, PS_CHILDLESS, PS_PREGNANT ), 
//EN Childlessness decimals=4 
 1 - transitions( parity_status, PS_CHILDLESS, PS_PREGNANT ) / unit
//EN Percent one child decimals=4 
transitions( parity_status, PS_CHILDLESS, PS_PREGNANT ) / unit 
}; 
Documents you may be interested
Documents you may be interested