[R] Generating input population for microsimulation

Jan van der Laan rhelp at eoos.dds.nl
Wed Dec 14 18:34:47 CET 2011


Emma,

That is because generate_unit expects a data.frame with one row and  
columns id and size:

generate_unit(data.frame(id=1, size=10))

Jan




Emma Thomas <thomas_ek at yahoo.com> schreef:

> Dear Jan,
>
> Thanks for your reply.
>
> The first solution works well for my needs for now, but I have a  
> question about the second. If I run your code and then call the  
> function:
>
> generate_unit(10)
>
> I get an error that
>
> Error in unit$size : $ operator is invalid for atomic vectors
>
>
> Did you experience the same thing?
>
> In any case, I will definitely take a look at the plyr package,  
> which I'm sure will be useful in the future.
>
> Thanks again!
>
> Emma
>
>
>
> ----- Original Message -----
> From: Jan van der Laan <rhelp at eoos.dds.nl>
> To: "r-help at r-project.org" <r-help at r-project.org>
> Cc: Emma Thomas <thomas_ek at yahoo.com>
> Sent: Wednesday, December 14, 2011 6:18 AM
> Subject: Re: [R] Generating input population for microsimulation
>
> Emma,
>
> If, as you say, each unit is the same you can just repeat the units  
> to obtain the required number of units. For example,
>
>
>   unit_size <- 10
>   n_units <- 10
>
>   unit_id <- rep(1:n_units, each=unit_size)
>   pid     <- rep(1:unit_size, n_units)
>   senior  <- ifelse(pid <= 2, 1, 0)
>
>   pop <- data.frame(unit_id, pid, senior)
>
>
> If you want more flexibility in generating the units, I would first  
> generate the units (without the persons) and then generate the  
> persons for each unit. In the example below I use the plyr package;  
> you could probably also use lapply/sapply, or simply a loop over the  
> units.
>
>   library(plyr)
>
>   generate_unit <- function(unit) {
>       pid <- 1:unit$size
>       senior <- rep(0, unit$size)
>       senior[sample(unit$size, 2)] <- 1
>       return(data.frame(unit_id=unit$id, pid=pid, senior=senior))
>   }
>
>   units <- data.frame(id=1:n_units, size=unit_size)
>
>   library(plyr)
>   ddply(units, .(id), generate_unit)
>
>
> HTH,
>
> Jan
>
>
>
>
> Emma Thomas <thomas_ek at yahoo.com> schreef:
>
>> Hi all,
>>
>> I've been struggling with some code and was wondering if you all could help.
>>
>> I am trying to generate a theoretical population of P people who  
>> are housed within X different units. Each unit follows the same  
>> structure- 10 people per unit, 8 of whom are junior and two of whom  
>> are senior. I'd like to create a unit ID and a unique identifier  
>> for each person (person ID, PID) in the population so that I have a  
>> matrix that looks like:
>>
>>      unit_id pid senior
>>   [1,]      1   1      0
>>   [2,]      1   2      0
>>   [3,]      1   3      0
>>   [4,]      1   4      0
>>   [5,]      1   5      0
>>   [6,]      1   6      0
>>   [7,]      1   7      0
>>   [8,]      1   8      0
>>   [9,]      1   9      1
>>   [10,]    1   10   1
>> ...
>>
>> I came up with the following code, but am having some trouble  
>> getting it to populate my matrix the way I'd like.
>>
>> world <- function(units, pop_size, unit_size){
>>     pid <- rep(0,pop_size) #person ID
>>     senior <- rep(0,pop_size) #senior in charge
>>     unit_id <- rep(0,pop_size) #unit ID
>>    
>>         for (i in 1:pop_size){
>>         for (f in 1:units)    { 
>>         senior[i] = sample(c(1,1,0,0,0,0,0,0,0,0), 1, replace = FALSE)
>>         pid[i] = sample(c(1:10), 1, replace = FALSE)
>>         unit_id[i] <- f
>>                 }}   
>>     data <- cbind(unit_id, pid, senior)
>>    
>>     return(data)
>>     }
>>
>>     world(units = 10,pop_size = 100, unit_size = 10) #call the function
>>
>>
>>
>> The output looks like:
>>      unit_id pid senior
>>   [1,]      10   7      0
>>   [2,]      10   4      0
>>   [3,]      10  10      0
>>   [4,]      10   9      1
>>   [5,]      10  10      0
>>   [6,]      10   1      1
>> ...
>>
>> but what I really want is to generate is 10 different units with  
>> two seniors per unit, and with each person in the population having  
>> a unique identifier.
>>
>> I thought a nested for loop was one way to go about creating my  
>> data set of people and families, but obviously I'm doing something  
>> (or many things) wrong. Any suggestions on how to fix this? I had  
>> been focusing on creating a person and assigning them to a unit,  
>> but perhaps I should create the units and then populate the units  
>> with people?
>>
>> Thanks so much in advance.
>>
>> Emma
>>
>> ______________________________________________
>> R-help at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list