1
$\begingroup$

How can I simulate a clustered panel data set, that includes 2 levels in R?

An example would be student test scores in a classroom.

I am searching for an efficient and easy way to construct the following equation:

$Y_{igt} = \alpha_i + \gamma_g + \tau_t + \beta_{0}\,t + \beta_{1}\,D_{gt} + \beta_2\,X_{it} + \varepsilon_{igt}$

where $Y_{igt}$ is the Outcome of individual $i$ in group $g$ at time $t$, $D_{gt}$ is a treatment dummy at the group level, $X_it$ is a random variable, $\alpha_i$, $\gamma_g$, $\tau_t$ are individual, group and time fixed effects. $\varepsilon_{igt}$ is the idiosyncratic error.

I have tried it in a quite complicated way (see below), though I am sure there must exist easier ways. Furthermore at a later stage it should be able to include additional correlated explanatory predictors with and without trends.

###overall mean
d.const<-data.frame(
  const=20
  )

##individuals
    N<-300
    x<-data.frame(
      id=1:N,
      alpha.i=rnorm(N,0,1)
    )
    d.indiv<-x

    ##groups
    G=20
    d.group<-data.frame(
  gid=1:G,
  D.g=rbinom(G,1,0.5),
  tstart=sample(1:T,G,replace=T),
  gamma.g=rnorm(G,10,5)
)
d.group

##time fixed effect
T<-5
d.tfix<-data.frame(
  year=1:T,
  tau.t=rnorm(T,0,5)
)
d.tfix

##panel data structure set
d.panel<-data.frame(
  id=rep(1:N,each=T),
  gid=sample(1:G,N,replace=T),
  year=rep(1:T,N)
)
d.panel

###merged
d<-d.panel
d<-merge(d,d.indiv,by="id")
d<-merge(d,d.group,by="gid")
d<-merge(d,d.tfix,by="year")
d<-d[order(d$gid,d$id,d$year),]
d

#predictors
d$x.it<-rnorm(nrow(d),10,20)
d$D.gi<-ifelse(d$D.g==1 & d$year==d$tstart,1,0)
#error
d$epsilon<-rnorm(nrow(d),0,1)
#outcome
d$y<-with(d,const+alpha.i+gamma.g+tau.t+2*year+3*alpha.i*D.gi+5*x.it+epsilon)
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.