Simulating from a Mixture of Distributions
/*--------------------------------------------------------------
SAS Sample Library
Name: modex14.sas
Description: Example program from SAS/ETS User's Guide,
The MODEL Procedure
Title: Simulating from a Mixture of Distributions
Product: SAS/ETS Software
Keys: nonlinear simultaneous equation models
PROC: MODEL
Notes:
--------------------------------------------------------------*/
ods graphics on;
/* set distribution parameters */
%let df = 7.5;
%let sig1 = .5;
%let var2 = 2.5;
data t;
format date monyy.;
do date='1jun2001'd to '1nov2002'd;
/* t-distribution with df,sig1 */
t = .05 * date + 5000 + &sig1*tinv(ranuni(1234),&df);
output;
end;
run;
data normal;
format date monyy.;
le = &var2;
lv = &var2;
do date='1jun2001'd to '1nov2002'd;
/* Normal with GARCH error structure */
v = 0.0001 + 0.2 * le**2 + .75 * lv;
e = sqrt( v) * rannor(12345) ;
normal = 25 + e;
le = e;
lv = v;
output;
end;
run;
data cauchy;
format date monyy.;
PI = 3.1415926;
do date='1jun2001'd to '1nov2002'd;
cauchy = -4 + tan((ranuni(1234) - 0.5) * PI);
output;
end;
run;
title1 't-distributed Errors Example';
proc model data=t outmod=tModel;
parms df 10 vt 4;
t = a * date + c;
errormodel t ~ t( vt, df );
fit t / out=tresid;
id date;
run;
title1 'GARCH-distributed Errors Example';
proc model data=normal outmodel=normalModel;
normal = b0 ;
h.normal = arch0 + arch1 * xlag(resid.normal **2 , mse.normal)
+ GARCH1 * xlag(h.normal, mse.normal);
fit normal /fiml out=nresid;
id date;
run;
title1 'Cauchy-distributed Errors Example';
proc model data=cauchy outmod=cauchyModel;
parms nc = 1;
/* nc is noncentrality parm to Cauchy dist */
cauchy = nc;
obj = log(1+resid.cauchy**2 * 3.1415926);
errormodel cauchy ~ general(obj) cdf=cauchy(nc);
fit cauchy / out=cresid;
id date;
run;
/* Merge and normalize the 3 residual data sets */
data c; merge tresid nresid cresid; by date;
t = probit(cdf("T", t/sqrt(0.2789), 16.58 ));
cauchy = probit(cdf("CAUCHY", cauchy, -4.0623));
run;
proc corr data=c out=s;
var t normal cauchy;
run;
title1 'Simulating Equations with Different Error Distributions';
/* Create one observation driver data set */
data sim; merge t normal cauchy; by date;
data sim; set sim(firstobs = 519 );
proc model data=sim model=( tModel normalModel cauchyModel );
errormodel t ~ t( vt, df );
errormodel cauchy ~ cauchy(nc);
solve t cauchy normal / random=2000 seed=1962 out=monte
sdata=s(where=(_type_="CORR"));
run;
title "T and Cauchy Distribution";
proc kde data=monte;
univar t / out=t_dens;
univar cauchy / out=cauchy_dens;
bivar t cauchy / out=density
plots=all;
run;