Documentation Example 18 for PROC MCMC
/****************************************************************/
/* S A S S A M P L E L I B R A R Y */
/* */
/* NAME: MCMCEX18 */
/* TITLE: Documentation Example 18 for PROC MCMC */
/* Constrained Analysis */
/* PRODUCT: STAT */
/* SYSTEM: ALL */
/* KEYS: */
/* PROCS: MCMC */
/* DATA: */
/* */
/* SUPPORT: Fang Chen */
/* REF: PROC MCMC, EXAMPLE 18 */
/* MISC: */
/****************************************************************/
options validvarname=any;
proc format;
value sizef 1 = '< 300cc' 2 = '300-550cc' 3 = '> 551cc';
value pricef 1 = '< $5000' 2 = '$5000 - $6000'
3 = '$6001 - $7000' 4 = '> $7000';
value startf 1 = 'Electric Start' 2 = 'Kick Start';
value balf 1 = 'Counter Balanced' 2 = 'Unbalanced';
value orif 1 = 'Japanese' 2 = 'European';
run;
data bikes;
input Size Price Start Balance Origin Rank @@;
format size sizef. price pricef. start startf.
balance balf. origin orif.;
datalines;
2 1 2 1 2 3 1 4 2 2 2 7 1 2 1 1 2 6
3 3 1 1 2 1 1 3 2 1 1 5 3 4 2 2 2 12
2 3 2 2 1 9 1 1 1 2 1 8 2 2 1 2 2 10
2 4 1 1 1 4 3 1 1 2 1 11 3 2 2 1 1 2
;
title 'Ordinary Conjoint Analysis by PROC TRANSREG';
proc transreg data=bikes utilities cprefix=0 lprefix=0;
ods select Utilities;
model identity(rank / reflect) =
class(size price start balance origin / zero=sum);
output out=coded(drop=intercept) replace;
run;
title 'Constrained Conjoint Analysis by PROC TRANSREG';
proc transreg data=bikes utilities cprefix=0 lprefix=0;
ods select ConservUtilities;
model identity(rank / reflect) =
monotone(price / tstandard=center)
class(size start balance origin / zero=sum);
run;
title 'Bayesian Constrained Conjoint Analysis by PROC MCMC';
proc mcmc data=coded outpost=bikesout ntu=3000 nmc=50000
propcov=quanew seed=448 diag=none;
ods select PostSumInt;
array pw[4] pw5000 pw5000_6000 pw6001_7000 pwCounterBalanced;
array sigma[4,4];
array mu[4];
begincnst;
call identity(sigma);
call mult(sigma, 100, sigma);
call zeromatrix(mu);
endcnst;
parms intercept pw300cc pw300_550cc pwElectricStart pwJapanese tau 1;
parms pw5000 0.3 pw5000_6000 0.2 pw6001_7000 0.1 pwCounterBalanced 1;
beginnodata;
prior intercept pw300: pwE: pwJ: ~ normal(0, var=100);
if (pw5000 >= pw5000_6000 & pw5000_6000 >= pw6001_7000 &
pw6001_7000 >= 0 & pwCounterBalanced > 0) then
lp = lpdfmvn(pw, mu, sigma);
else
lp = .;
prior pw5000 pw5000_6000 pw6001_7000 pwC: ~ general(lp);
prior tau ~ gamma(0.01, iscale=0.01);
endnodata;
mean = intercept +
pw300cc * '< 300cc'n +
pw300_550cc * '300-550cc'n +
pw5000 * '< $5000'n +
pw5000_6000 * '$5000 - $6000'n +
pw6001_7000 * '$6001 - $7000'n +
pwElectricStart * 'Electric Start'n +
pwCounterBalanced * 'Counter Balanced'n +
pwJapanese * Japanese;
model rank ~ normal(mean, prec=tau);
run;