Last data update: 2014.03.03
R: Run microsimulation (parallel computing)
micSimParallel R Documentation
Run microsimulation (parallel computing)
Description
The function micSimParallel
is a parallelized version of the function micSim. That is, it runs a continuous-time microsimulation simulation distributed, i.e., using more than one CPU core.
Usage
micSimParallel(initPop, immigrPop = NULL, transitionMatrix, absStates = NULL,
initStates = c(), initStatesProb = c(), maxAge = 99, simHorizon, fertTr = c(),
dateSchoolEnrol="09/01", cores=1, seeds=1254)
Arguments
initPop
immigrPop
transitionMatrix
absStates
initStates
initStatesProb
maxAge
simHorizon
fertTr
dateSchoolEnrol
See micSim.
cores
Number of CPUs to be used.
seeds
Seeds for pseudo number generators used for parallel computing.
Details
The argument cores
must not exceed the number of cores of the computer (cluster) used.
In seeds
as many seeds should be given as cores are used. If less are given, the latter are repeated to complete the set of seeds.
Value
The data frame pop
contains the whole synthetic population considered during simulation including all events generated. For more details, see micSim.
Author(s)
Sabine Zinn
Examples
######################################################################################
# Complex example dealing with mortality, changes in the fertily and the marital
# status, in the educational attainment, as well as dealing with migration
# (A simpler example is given on the help page of the "micSim" function of this package.)
######################################################################################
# Clean workspace
rm(list=ls())
# Defining simulation horizon
simHorizon <- setSimHorizon(startDate="01/01/2014", endDate="31/12/2024")
# Seed for random number generator
set.seed(234)
# Definition of maximal age
maxAge <- 100
# Defintion of nonabsorbing and absorbing states
sex <- c("m","f")
fert <- c("0","1+")
marital <- c("NM","M","D","W")
edu <- c("no","low","med","high")
stateSpace <- expand.grid(sex=sex,fert=fert,marital=marital,edu=edu)
absStates <- c("dead","rest")
# General date of enrollment to elementary school
dateSchoolEnrol <- "09/01"
# Definition of an initial population (for illustration purposes, create a random population)
N = 10000
initBirthDatesRange <- chron(dates=c("31/12/1950","01/01/2014"),format=c(dates="d/m/Y"),
out.format=c(dates="d/m/year"))
set.seed(124) # Set a seed for the random number generator (to make results repeatable)
birthDates <- dates(initBirthDatesRange[1] + runif(N, min=0, max=diff(initBirthDatesRange)))
getRandInitState <- function(birthDate){
age <- trunc(as.numeric(simHorizon[1] - birthDate)/365.25)
s1 <- sample(sex,1)
s2 <- ifelse(age<=18, fert[1], sample(fert,1))
s3 <- ifelse(age<=18, marital[1], ifelse(age<=22, sample(marital[1:3],1),
sample(marital,1)))
s4 <- ifelse(age<=7, edu[1], ifelse(age<=18, edu[2], ifelse(age<=23, sample(edu[2:3],1),
sample(edu[-1],1))))
initState <- paste(c(s1,s2,s3,s4),collapse="/")
return(initState)
}
initPop <- data.frame(ID=1:N, birthDate=birthDates,
initState=sapply(birthDates, getRandInitState))
# Definition of immigrants entering the population (for illustration purposes, create immigrants
# randomly)
M = 2000
immigrDatesRange <- as.numeric(simHorizon)
immigrDates <- dates(chron(immigrDatesRange[1] + runif(M, min=0,max=diff(immigrDatesRange)),
format=c(dates="d/m/Y", times="h:m:s"), out.format=c(dates="d/m/year",times="h:m:s")))
immigrAges <- runif(M, min=15*365.25, max=70*365.25)
immigrBirthDates <- dates(chron(as.numeric(immigrDates) - immigrAges,
format=c(dates="d/m/Y", times="h:m:s"), out.format=c(dates="d/m/year", times="h:m:s")))
IDmig <- max(as.numeric(initPop[,"ID"]))+(1:M)
immigrPop <- data.frame(ID = IDmig, immigrDate = immigrDates, birthDate=immigrBirthDates,
immigrInitState=sapply(immigrBirthDates, getRandInitState))
# Definition of initial states for newborns
initStates <- rbind(c("m","0","NM","no"),c("f","0","NM","no"))
# Definition of related occurrence probabilities
initStatesProb <- c(0.515,0.485)
# Definition of (possible) transition rates
# (1) Fertility rates (Hadwiger mixture model)
fert1Rates <- function(age, calTime, duration){ # parity 1
b <- ifelse(calTime<=2020, 3.9, 3.3)
c <- ifelse(calTime<=2020, 28, 29)
rate <- (b/c)*(c/age)^(3/2)*exp(-b^2*(c/age+age/c-2))
rate[age<=15 | age>=45] <- 0
return(rate)
}
fert2Rates <- function(age, calTime, duration){ # partiy 2+
b <- ifelse(calTime<=2020, 3.2, 2.8)
c <- ifelse(calTime<=2020, 32, 33)
rate <- (b/c)*(c/age)^(3/2)*exp(-b^2*(c/age+age/c-2))
rate[age<=15 | age>=45 | duration<0.75] <- 0
return(rate)
}
# (2) Rates for first marriage (normal density)
marriage1Rates <- function(age, calTime, duration){
m <- ifelse(calTime<=2020, 25, 30)
s <- ifelse(calTime<=2020, 3, 3)
rate <- dnorm(age, mean=m, sd=s)
rate[age<=16] <- 0
return(rate)
}
# (3) Remariage rates (log-logistic model)
marriage2Rates <- function(age, calTime, duration){
b <- ifelse(calTime<=2020, 0.07, 0.10)
p <- ifelse(calTime<=2020, 2.7, 2.7)
lambda <- ifelse(calTime<=1950, 0.04, 0.03)
rate <- b*p*(lambda*age)^(p-1)/(1+(lambda*age)^p)
rate[age<=18] <- 0
return(rate)
}
# (4) Divorce rates (normal density)
divorceRates <- function(age, calTime, duration){
m <- 40
s <- ifelse(calTime<=2020, 7, 6)
rate <- dnorm(age,mean=m,sd=s)
rate[age<=18] <- 0
return(rate)
}
# (5) Widowhood rates (gamma cdf)
widowhoodRates <- function(age, calTime, duration){
rate <- ifelse(age<=30, 0, pgamma(age-30, shape=6, rate=0.06))
return(rate)
}
# (6) Rates to change educational attainment
# Set rate to `Inf' to make transition for age 7 deterministic.
noToLowEduRates <- function(age, calTime, duration){
rate <- ifelse(age==7,Inf,0)
return(rate)
}
lowToMedEduRates <- function(age, calTime, duration){
rate <- dnorm(age,mean=16,sd=1)
rate[age<=15 | age>=25] <- 0
return(rate)
}
medToHighEduRates <- function(age, calTime, duration){
rate <- dnorm(age,mean=20,sd=3)
rate[age<=18 | age>=35] <- 0
return(rate)
}
# (7) Mortality rates (Gompertz model)
mortRates <- function(age, calTime, duration){
a <- 0.00003
b <- ifelse(calTime<=2020, 0.1, 0.097)
rate <- a*exp(b*age)
return(rate)
}
# (8) Emigration rates
emigrRates <- function(age, calTime, duration){
rate <- ifelse(age<=18,0,0.0025)
return(rate)
}
# Transition pattern and assignment of functions specifying transition rates
fertTrMatrix <- cbind(c("0->1+","1+->1+"),
c("fert1Rates", "fert2Rates"))
maritalTrMatrix <- cbind(c("NM->M","M->D","M->W","D->M","W->M"),
c("marriage1Rates","divorceRates","widowhoodRates",
"marriage2Rates","marriage2Rates"))
eduTrMatrix <- cbind(c("no->low","low->med","med->high"),
c("noToLowEduRates","lowToMedEduRates","medToHighEduRates"))
allTransitions <- rbind(fertTrMatrix, maritalTrMatrix, eduTrMatrix)
absTransitions <- rbind(c("dead","mortRates"),c("rest","emigrRates"))
transitionMatrix <- buildTransitionMatrix(allTransitions=allTransitions,
absTransitions=absTransitions, stateSpace=stateSpace)
# Define transitions triggering a birth event
fertTr <- fertTrMatrix[,1]
# Run microsimulation on cluster with five cores (settings depend on cluster used)
## Not run:
cores <- 5
seeds <- c(1233,1245,1234,5,2)
pop <- micSimParallel(initPop=initPop, immigrPop=immigrPop,
transitionMatrix=transitionMatrix, absStates=absStates, initStates=initStates,
initStatesProb=initStatesProb, maxAge=maxAge, simHorizon=simHorizon,
fertTr=fertTr, dateSchoolEnrol=dateSchoolEnrol,
cores=cores, seeds=seeds)
## End(Not run)
Results
R version 3.3.1 (2016-06-21) -- "Bug in Your Hair"
Copyright (C) 2016 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
> library(MicSim)
Loading required package: chron
Loading required package: snowfall
Loading required package: snow
Loading required package: rlecuyer
> png(filename="/home/ddbj/snapshot/RGM3/R_CC/result/MicSim/micSimParallel.Rd_%03d_medium.png", width=480, height=480)
> ### Name: micSimParallel
> ### Title: Run microsimulation (parallel computing)
> ### Aliases: micSimParallel
>
> ### ** Examples
>
> ######################################################################################
> # Complex example dealing with mortality, changes in the fertily and the marital
> # status, in the educational attainment, as well as dealing with migration
> # (A simpler example is given on the help page of the "micSim" function of this package.)
> ######################################################################################
> # Clean workspace
> rm(list=ls())
>
> # Defining simulation horizon
> simHorizon <- setSimHorizon(startDate="01/01/2014", endDate="31/12/2024")
>
> # Seed for random number generator
> set.seed(234)
>
> # Definition of maximal age
> maxAge <- 100
>
> # Defintion of nonabsorbing and absorbing states
> sex <- c("m","f")
> fert <- c("0","1+")
> marital <- c("NM","M","D","W")
> edu <- c("no","low","med","high")
> stateSpace <- expand.grid(sex=sex,fert=fert,marital=marital,edu=edu)
> absStates <- c("dead","rest")
>
> # General date of enrollment to elementary school
> dateSchoolEnrol <- "09/01"
>
> # Definition of an initial population (for illustration purposes, create a random population)
> N = 10000
> initBirthDatesRange <- chron(dates=c("31/12/1950","01/01/2014"),format=c(dates="d/m/Y"),
+ out.format=c(dates="d/m/year"))
> set.seed(124) # Set a seed for the random number generator (to make results repeatable)
> birthDates <- dates(initBirthDatesRange[1] + runif(N, min=0, max=diff(initBirthDatesRange)))
> getRandInitState <- function(birthDate){
+ age <- trunc(as.numeric(simHorizon[1] - birthDate)/365.25)
+ s1 <- sample(sex,1)
+ s2 <- ifelse(age<=18, fert[1], sample(fert,1))
+ s3 <- ifelse(age<=18, marital[1], ifelse(age<=22, sample(marital[1:3],1),
+ sample(marital,1)))
+ s4 <- ifelse(age<=7, edu[1], ifelse(age<=18, edu[2], ifelse(age<=23, sample(edu[2:3],1),
+ sample(edu[-1],1))))
+ initState <- paste(c(s1,s2,s3,s4),collapse="/")
+ return(initState)
+ }
> initPop <- data.frame(ID=1:N, birthDate=birthDates,
+ initState=sapply(birthDates, getRandInitState))
>
> # Definition of immigrants entering the population (for illustration purposes, create immigrants
> # randomly)
> M = 2000
> immigrDatesRange <- as.numeric(simHorizon)
> immigrDates <- dates(chron(immigrDatesRange[1] + runif(M, min=0,max=diff(immigrDatesRange)),
+ format=c(dates="d/m/Y", times="h:m:s"), out.format=c(dates="d/m/year",times="h:m:s")))
> immigrAges <- runif(M, min=15*365.25, max=70*365.25)
> immigrBirthDates <- dates(chron(as.numeric(immigrDates) - immigrAges,
+ format=c(dates="d/m/Y", times="h:m:s"), out.format=c(dates="d/m/year", times="h:m:s")))
> IDmig <- max(as.numeric(initPop[,"ID"]))+(1:M)
> immigrPop <- data.frame(ID = IDmig, immigrDate = immigrDates, birthDate=immigrBirthDates,
+ immigrInitState=sapply(immigrBirthDates, getRandInitState))
>
> # Definition of initial states for newborns
> initStates <- rbind(c("m","0","NM","no"),c("f","0","NM","no"))
> # Definition of related occurrence probabilities
> initStatesProb <- c(0.515,0.485)
>
> # Definition of (possible) transition rates
> # (1) Fertility rates (Hadwiger mixture model)
> fert1Rates <- function(age, calTime, duration){ # parity 1
+ b <- ifelse(calTime<=2020, 3.9, 3.3)
+ c <- ifelse(calTime<=2020, 28, 29)
+ rate <- (b/c)*(c/age)^(3/2)*exp(-b^2*(c/age+age/c-2))
+ rate[age<=15 | age>=45] <- 0
+ return(rate)
+ }
> fert2Rates <- function(age, calTime, duration){ # partiy 2+
+ b <- ifelse(calTime<=2020, 3.2, 2.8)
+ c <- ifelse(calTime<=2020, 32, 33)
+ rate <- (b/c)*(c/age)^(3/2)*exp(-b^2*(c/age+age/c-2))
+ rate[age<=15 | age>=45 | duration<0.75] <- 0
+ return(rate)
+ }
> # (2) Rates for first marriage (normal density)
> marriage1Rates <- function(age, calTime, duration){
+ m <- ifelse(calTime<=2020, 25, 30)
+ s <- ifelse(calTime<=2020, 3, 3)
+ rate <- dnorm(age, mean=m, sd=s)
+ rate[age<=16] <- 0
+ return(rate)
+ }
> # (3) Remariage rates (log-logistic model)
> marriage2Rates <- function(age, calTime, duration){
+ b <- ifelse(calTime<=2020, 0.07, 0.10)
+ p <- ifelse(calTime<=2020, 2.7, 2.7)
+ lambda <- ifelse(calTime<=1950, 0.04, 0.03)
+ rate <- b*p*(lambda*age)^(p-1)/(1+(lambda*age)^p)
+ rate[age<=18] <- 0
+ return(rate)
+ }
> # (4) Divorce rates (normal density)
> divorceRates <- function(age, calTime, duration){
+ m <- 40
+ s <- ifelse(calTime<=2020, 7, 6)
+ rate <- dnorm(age,mean=m,sd=s)
+ rate[age<=18] <- 0
+ return(rate)
+ }
> # (5) Widowhood rates (gamma cdf)
> widowhoodRates <- function(age, calTime, duration){
+ rate <- ifelse(age<=30, 0, pgamma(age-30, shape=6, rate=0.06))
+ return(rate)
+ }
> # (6) Rates to change educational attainment
> # Set rate to `Inf' to make transition for age 7 deterministic.
> noToLowEduRates <- function(age, calTime, duration){
+ rate <- ifelse(age==7,Inf,0)
+ return(rate)
+ }
> lowToMedEduRates <- function(age, calTime, duration){
+ rate <- dnorm(age,mean=16,sd=1)
+ rate[age<=15 | age>=25] <- 0
+ return(rate)
+ }
> medToHighEduRates <- function(age, calTime, duration){
+ rate <- dnorm(age,mean=20,sd=3)
+ rate[age<=18 | age>=35] <- 0
+ return(rate)
+ }
> # (7) Mortality rates (Gompertz model)
> mortRates <- function(age, calTime, duration){
+ a <- 0.00003
+ b <- ifelse(calTime<=2020, 0.1, 0.097)
+ rate <- a*exp(b*age)
+ return(rate)
+ }
> # (8) Emigration rates
> emigrRates <- function(age, calTime, duration){
+ rate <- ifelse(age<=18,0,0.0025)
+ return(rate)
+ }
>
> # Transition pattern and assignment of functions specifying transition rates
> fertTrMatrix <- cbind(c("0->1+","1+->1+"),
+ c("fert1Rates", "fert2Rates"))
> maritalTrMatrix <- cbind(c("NM->M","M->D","M->W","D->M","W->M"),
+ c("marriage1Rates","divorceRates","widowhoodRates",
+ "marriage2Rates","marriage2Rates"))
> eduTrMatrix <- cbind(c("no->low","low->med","med->high"),
+ c("noToLowEduRates","lowToMedEduRates","medToHighEduRates"))
> allTransitions <- rbind(fertTrMatrix, maritalTrMatrix, eduTrMatrix)
> absTransitions <- rbind(c("dead","mortRates"),c("rest","emigrRates"))
> transitionMatrix <- buildTransitionMatrix(allTransitions=allTransitions,
+ absTransitions=absTransitions, stateSpace=stateSpace)
>
> # Define transitions triggering a birth event
> fertTr <- fertTrMatrix[,1]
>
> # Run microsimulation on cluster with five cores (settings depend on cluster used)
> ## Not run:
> ##D cores <- 5
> ##D seeds <- c(1233,1245,1234,5,2)
> ##D pop <- micSimParallel(initPop=initPop, immigrPop=immigrPop,
> ##D transitionMatrix=transitionMatrix, absStates=absStates, initStates=initStates,
> ##D initStatesProb=initStatesProb, maxAge=maxAge, simHorizon=simHorizon,
> ##D fertTr=fertTr, dateSchoolEnrol=dateSchoolEnrol,
> ##D cores=cores, seeds=seeds)
> ## End(Not run)
>
>
>
>
>
> dev.off()
null device
1
>