Pilot design with attribute level constraints

This forum is for posts covering broader stated choice experimental design issues.

Moderators: Andrew Collins, Michiel Bliemer, johnr

Pilot design with attribute level constraints

Postby gabrielcalderonUR » Fri Oct 25, 2024 3:48 am

Dear all,
I'm working on an experimental design for my thesis, which aims to understand the substitution of tobacco-related products. For this, I consider a labeled design with an opt-out option. The atributtes and levels are the following: Image

For the pilot study I am producing a D-efficient design with ngene and the following is the code:
Code: Select all
; alts= ecigdisp*, ecigrech*, cig*, alt4
; rows= 18
; block= 2
; eff= (mnl,d)
; alg= mfederov
; require:
cig.externality=2, cig.hide=1 , cig.harm=1

;model:

U(ecigdisp)  =    price[-0.000001]*  price_disp[0.025,0.050,0.100,0.160]   ? $ Price of disposable cigarette
 + flavour.dummy[0.0001|0.00001]* flavour[0,1,2]                      ? Flavour: traditional=0, mint=1, fruits=2
 + harm.dummy[-0.0001]* harm[0,1]                                          ? Self-harm: less harmful 0(base), equally harmful=1
 + ext.dummy[-0.001|-0.00001|-0.00001]* externality[0,1,2,3]   ? Harm to others: no=0(base), moderate=1, high=2, unkown=3     
 + hide.dummy[-0.00001]*  hide[0,1]                                           ? Hide smoke: easy to hide=0(base), hard to hide=1
 + int1*  price_disp * flavour                                                        ? Interaction term between price_disp & flavour
                                 
                   
             /
U(ecigrech)=   price[-0.000001*  price_rech[0.035,0.045,0.055,0.080]  ? $ Price of rechargable cigarette
      + flavour.dummy[0.0001|0.00001]*  flavour    ? Flavour: traditional=0, mint=1, fruits=2
                + harm.dummy[-0.0001]* harm       ? Self-harm: less harmful than traditional cig=0(base), equally harmful=1
      + ext.dummy[-0.001|-0.00001|-0.00001]*  externality   ? Harm to others: no harm=0(base), moderate=1, high=2, unkown=3     
      + hide.dummy[-0.00001]* hide       ? Hide smoke: easy to hide=0(base), hard to hide=1
                + int1*  price_rech * flavour             ? Interaction term between price_rech & flavour
                                 
                       
            /

U(cig)=       price[-0.000001]* price_cig [0.025,0.05,0.200,0.350]  ? $ Price of traditional tocabbo package
      + flavour.dummy[0.0001|0.00001]* flavour                  ? Flavour: traditional=0, mint=1, fruits=2
                + harm.dummy[-0.0001]* harm                        ? Self-harm - always harmful (harmful=1)
      + ext[-0.001|-0.00001|-0.00001]* externality       ? Harm to others - always harmful
      + hide.dummy[-0.00001]*  hide          ? Hide smoke - always hard to hide

     
        /

U(alt4)= b0
$


I left the code running for up to two hours, the D-error is 0.941978 and the A-error is 2.78576
Question 1: Since for the alternative cig (i.e. traditional cigarette) there is only one level for the attributes "ext", "hide" and "harm", is the way I have written it in the code correct?
Question 2: This is a design for an experiment. This would be the design I follow for the pilot study. Should I now consider a Bayesian D-efficient design, even though I have no priors? or should I continue with the D-efficient design as presented here?
Question 3: The program returns the following warning: "One or more attributes will not have level balance with the number of rows specified: ecigdisp.price_disp, ecigdisp.externality, ecigrech.price_rech, ecigrech.externality, cig.price_cig, cig.externality". In fact, with two of these attributes we obtain only two levels. What should be the rule for determining the number of rows? I am currently using Rose and Bliemer (2022) equation 3

I am also a bit concerned about the size of the D-error.
Any additional recomendations to improve the design would be really appreciated
Thank you so much
gabrielcalderonUR
 
Posts: 1
Joined: Mon Oct 07, 2024 12:42 pm

Re: Pilot design with attribute level constraints

Postby Michiel Bliemer » Fri Oct 25, 2024 6:54 am

There were several issues with your script, I tried to fix them in the script below, please have a look.
I added constants, I added interaction effects for cig, I changed your interaction effects to be appropriate for dummy coded flavour. Note that the LAST level in Ngene is the base level.
When using (near) zero priors, an efficient design will typically only use the outer levels as this provides maximum trade-off, so in that case I typically dummy code also the numerical attributes, in this case price. Your price levels were a bit odd, very small values and very unevenly spaced, but maybe that was on purpose.

Code: Select all
design
;alts= ecigdisp*, ecigrech*, cig*, optout
;rows= 24
;block= 3
;eff= (mnl,d)
;alg= mfederov
;require:
cig.externality=2, cig.hide=1 , cig.harm=1

;model:
U(ecigdisp)  = asc_ecigdisp[0]
             + price.dummy[-0.01|-0.02|-0.03]  * price_disp[1,2,3,0]                  ? $ Price of disposable cigarette
             + flavour.dummy[0|0]              * flavour[1,2,0]                       ? Flavour: traditional=0 (base), mint=1, fruits=2
             + harm.dummy[-0.001]              * harm[1,0]                            ? Self-harm: less harmful 0(base), equally harmful=1
             + ext.dummy[-0.001|-0.002|-0.002] * externality[1,2,3,0]                 ? Harm to others: no=0(base), moderate=1, high=2, unkown=3     
             + hide.dummy[-0.001]              * hide[1,0]                            ? Hide smoke: easy to hide=0(base), hard to hide=1
             + int1                            * price_disp * flavour.dummy[1]        ? Interaction term between price_disp & mint flavour
             + int2                            * price_disp * flavour.dummy[2]        ? Interaction term between price_disp & fruits flavour
             /
U(ecigrech)  = asc_ecigrech[0]
             + price.dummy                     * price_rech[1,2,3,0]                  ? $ Price of rechargable cigarette
             + flavour.dummy                   * flavour
             + harm.dummy                      * harm
             + ext.dummy                       * externality
             + hide.dummy                      * hide
             + int1                            * price_rech * flavour.dummy[1]
             + int2                            * price_rech * flavour.dummy[2]
             /
U(cig)       = asc_cig[0]
             + price.dummy                     * price_cig[1,2,3,0]                   ? $ Price of traditional tocabbo package
             + flavour.dummy                   * flavour               
             + harm.dummy                      * harm                   
             + ext.dummy                       * externality       
             + hide.dummy                      * hide         
             + int1                            * price_cig * flavour.dummy[1]
             + int2                            * price_cig * flavour.dummy[2]
$


Answers:
Q1: Yes
Q2: Using uninformative local priors as you have done is fine for the pilot study
Q3: 18 rows is not divisible by 4 levels, so it cannot obtain attribute level balance. Your number of rows will need to be divisible by 2, 3, and 4. I changed it therefore to 24 rows.

Your large D-error was the result of your very small attribute levels for price, which was not really problematic but you may want to change the unit of price (make it cents instead of dollars or something).

Michiel
Michiel Bliemer
 
Posts: 1879
Joined: Tue Mar 31, 2009 4:13 pm


Return to Choice experiments - general

Who is online

Users browsing this forum: No registered users and 2 guests