%ChoiceEff Restrictions

Accepted Solution Solved
Reply
New Contributor
Posts: 3
Accepted Solution

%ChoiceEff Restrictions

I'm trying to design a discrete choice experiment survey using the code from Kuhfeld's Marketing Research Methods with SAS 9.  

 

https://support.sas.com/techsup/technote/mr2010.pdf

 

Here is my code:

 

 

title 'Water'

%mktruns(2 2 2 4 2)
%mktex(2 2 2 4 2, n=64)

proc format;
value provider 1 = 'public utility' 2 = 'private seller';
value measure 1 = 'tanker' 2 = 'tap';
value payment 1 = 'upfront' 2 = 'after';
value price 1 = '500' 2 = '1500' 3 = '2500' 4 = '3500';
value quality 1 = 'raw' 2 = 'safe';
run;

%mktlab(data=design,
		vars=Provider Measure Payment Price Quality,
		int=f1-f2,
		out=final,
		stmts=format provider provider. measure measure. payment payment. price price. quality quality.)

		proc print; run;

%macro res;
bad=(quality = safe & price = 500)
%mend;
%choiceff(data=final, bestout=sasuser.waterdes, model=class(provider measure payment price quality / sta) / cprefix=0 lprefix=0, nsets=32, seed=145, flags=f1-f2, restrictions=res, resvars=price quality, options=relative, beta=zero) proc print data=sasuser.waterdes; var provider -- quality; id set; by set; run; proc datasets lib=work kill nolist memtype=data; quit;

 

I need to implement restrictions on the choice sets, namely that the price does not equal 500 when the quality is safe.  How can I implement this? 

 


Accepted Solutions
Solution
‎11-16-2016 02:50 PM
SAS Super FREQ
Posts: 481

Re: %ChoiceEff Restrictions

Posted in reply to WarrenKuhfeld

When your restrictions are more complicated, you might want to write them in terms of the actual levels.  Here is an example of how you could do that.

%macro res;
price   = {500 1500 2500 3500};
quality = {'raw' 'safe'};
bad = (quality[x[1,2]] = 'safe' & price[x[1,1]] = 500) + 
      (quality[x[2,2]] = 'safe' & price[x[2,1]] = 500);
%mend;

 

View solution in original post


All Replies
SAS Super FREQ
Posts: 3,910

Re: %ChoiceEff Restrictions

[ Edited ]

I've never used these macros, but I asked a colleague who has experience with them.  He suggestst that you look in the doc for the examples that define "macro res;"  (Open the PDF, then search for that string without the quotes.)  

 

My friend said "Restrictions must be posed in terms of the raw values stored in a matrix x with one row per alternative and one column for each of the resvars variables."

 

Based on that statement, I am going to guess that you should try the following:

 

%macro res;

bad=(x[1,2] = 2 & x[1,1] = 1) + (x[2,2] = 2 & x[2,1] = 1);

%mend;​

 

New Contributor
Posts: 3

Re: %ChoiceEff Restrictions

Hi,

 

That code didn't work for me, but digging deeper in the book, it seems that this has solved the problem:

 

%macro res;
if x[1,1] = 1 & x[1,2] = 2 then bad = 1;
if x[2,1] = 1 & x[2,2] = 2 then bad = bad + 1;
%mend;

This means that safe never shows up with 500.  

SAS Super FREQ
Posts: 481

Re: %ChoiceEff Restrictions

Actually, the code that you provided for the restrictions macro generates precisely the same values of bad as the code that I provided Rick.  Why did it not work for you?

Solution
‎11-16-2016 02:50 PM
SAS Super FREQ
Posts: 481

Re: %ChoiceEff Restrictions

Posted in reply to WarrenKuhfeld

When your restrictions are more complicated, you might want to write them in terms of the actual levels.  Here is an example of how you could do that.

%macro res;
price   = {500 1500 2500 3500};
quality = {'raw' 'safe'};
bad = (quality[x[1,2]] = 'safe' & price[x[1,1]] = 500) + 
      (quality[x[2,2]] = 'safe' & price[x[2,1]] = 500);
%mend;

 

New Contributor
Posts: 3

Re: %ChoiceEff Restrictions

Posted in reply to WarrenKuhfeld

I have no idea what I was putting in the first time, but this time, when I copied and pasted Rick's code, it worked.  Not sure what happened the first time.  Thanks to both for your responses!

☑ This topic is solved.

Need further help from the community? Please ask a new question.

Discussion stats
  • 5 replies
  • 427 views
  • 1 like
  • 3 in conversation