Skip to Main Content

Random effect tobit model in nlmixed | SAS Code Fragments

The example data for running the following models can be downloaded
here.

* right censored;
proc nlmixed data = nls qpoints=15 EBOPT;
  parms  _cons = 1 _age= .01  s2 = .3 sigma = .3;
  xb = _cons  + _age*age + u ;
  if ln_wage <1.8 then  ll = -.5*log(2*constant('PI'))- log(sigma) -(ln_wage-xb)**2/(2*sigma**2);
  if ln_wage >=1.8 then ll = log(1 - cdf('NORMAL', (1.8-xb)/sigma));
  model ln_wage ~ general(ll);
  random u ~ normal (0,s2) subject=id;
run;

* left censored;

proc nlmixed data = nls qpoints=15 EBOPT;
  parms  _cons = 1 _age= .01  s2 = .3 sigma = .3;
  xb = _cons  + _age*age + u ;
  if ln_wage >.5 then  ll = -.5*log(2*constant('PI'))- log(sigma) -(ln_wage-xb)**2/(2*sigma**2);
  if ln_wage <=.5 then ll = log(cdf('NORMAL', (.5-xb)/sigma));
  model ln_wage ~ general(ll);
  random u ~ normal (0,s2) subject=id;
run;

* right and left-censored;
proc nlmixed data = nls qpoints=15 EBOPT;
  parms  _cons = 1 _age= .01  s2 = .3 sigma = .3;
  xb = _cons  + _age*age + u ;
  if ln_wage >.5 & ln_wage < 1.8 then  ll = -.5*log(2*constant('PI'))- log(sigma) -(ln_wage-xb)**2/(2*sigma**2);
  if ln_wage <=.5 then ll = log(cdf('NORMAL', (.5-xb)/sigma));
  if ln_wage >=1.8 then ll = log(1 - cdf('NORMAL', (1.8-xb)/sigma));
  model ln_wage ~ general(ll);
  random u ~ normal (0,s2) subject=id;
run;