Level balance with restrictions

This forum is for posts that specifically focus on Ngene.

Moderators: Andrew Collins, Michiel Bliemer, johnr

Level balance with restrictions

Postby twickr07 » Sat Feb 26, 2022 12:41 am

Hello,

I am doing an unlabelled design to elicit patient preferences for treatments. To make the choice profiles realistic I had to put in a few restrictions (see code below) but I made sure the restrictions are not causing multicollinearity by checking the Pearson correlations are below the 0.3 range. However, because of the restrictions the level balance is not achieved, for example route 1 appears 12 times, route 2 appears 12 times and route 3 appears 36 times.
1) I understand that total level balance is not possible because of the restrictions, but is there a way to reduce this imbalance?

2) I have included a cost attribute in the design which is useful for the US participants but not applicable to the UK participants. If one country has a cost attribute and the other do not then does it require a different design? or is there a clever way to combine them at the design stage or analysis stage?

3)I have used near 0 values as I don't know the priors, in this case can you advise how to choose the prior for the opt-out or no treatment alternative?

Thanks for any thoughts you have on these questions!
Tara

Code: Select all
design
;alts = treatment1, treatment2, optout
;rows = 60
;eff = (mnl,d)
;con
;cond:
        if(treatment1.route=1, treatment1.freq =[2,3,4,5]),
        if(treatment1.route=0, treatment1.freq =[2,3,4,5]),
        if(treatment2.route=1, treatment2.freq =[2,3,4,5]),
        if(treatment2.route=0, treatment2.freq =[2,3,4,5]),
        if(treatment1.route=1, treatment1.location =[2,3,4]),
        if(treatment1.route=0, treatment1.location =[2,3,4]),
        if(treatment2.route=1, treatment2.location =[2,3,4]),
        if(treatment2.route=0, treatment2.location =[2,3,4])

;model:
U(treatment1) = b1.dummy[0|0]                                     * route[2,1,0]              (15-25,15-25,15-25)
              + b2.dummy[0.00005|0.00004|0.00003|0.00002|0.00001] * freq[5,4,3,2,1,0]         (10,10,10,10,10,10)
              + b3.dummy[0|0|0|0|0]                               * location[5,4,3,2,1,0]     (10,10,10,10,10,10)
              + b4 [-0.00001]                                     * cost [100,200,300]        (20,20,20)
              + b5 [0.00001]                                      * effectiveness [40,50,60]  (20,20,20)
              /
U(treatment2) = b1.dummy * route
              + b2.dummy * freq
              + b3.dummy * location
              + b4       * cost     
              + b5       * effectiveness   
              /
U(optout)     = b6 [0]
$
twickr07
 
Posts: 15
Joined: Mon Nov 25, 2019 9:51 pm

Re: Level balance with restrictions

Postby Michiel Bliemer » Sat Feb 26, 2022 8:04 am

1. You can try adding + 10*(imbalance) or something like that to the objective function in ;eff, see script below. But note that the default swapping algorithm that you are using will generally lead to designs with the best possible attribute level balance. In your case, because of the specific constraints, your attribute levels will be far from balanced for route, freq, and location and it may not be possible to improve this.

Note that the default swapping algorithm will not be able to remove dominant alternatives from your design because you have many rows and it is likely that one of those 60 rows will have at least one choice task with a dominant alternative. I have added * to the alternatives to ensure that Ngene checks for this, and switched to the modified Federov algorithm. I have rewritten your constraints to reject constraints compatible with this algorithm.

Note that dummy coded attributes will generally automatically exhibit reasonable level balance, but numerical attributes in the modified Federov algorithm will not. Therefore, I would recommend adding specific constraints for these attributes, see code.

2. Since you are using zero priors (such that the cost attribute does not influence utility), I would be comfortable to include the cost attribtue in the design and simply not show it to UK participants.

3. When using zero priors for the attributes, you should also choose zero priors for all constants.

I hope this helps.

Code: Select all
design
;alts = treatment1*, treatment2*, optout
;rows = 60
;eff = (mnl,d) + 10*(imbalance)
;con
;alg = mfederov
;reject:
treatment1.route=0 and treatment1.freq=0,
treatment1.route=0 and treatment1.freq=1,
treatment1.route=1 and treatment1.freq=0,
treatment1.route=1 and treatment1.freq=1,
treatment1.route=0 and treatment1.location=0,
treatment1.route=0 and treatment1.location=1,
treatment1.route=0 and treatment1.location=5,
treatment1.route=1 and treatment1.location=0,
treatment1.route=1 and treatment1.location=1,
treatment1.route=1 and treatment1.location=5,
treatment2.route=0 and treatment2.freq=0,
treatment2.route=0 and treatment2.freq=1,
treatment2.route=1 and treatment2.freq=0,
treatment2.route=1 and treatment2.freq=1,
treatment2.route=0 and treatment2.location=0,
treatment2.route=0 and treatment2.location=1,
treatment2.route=0 and treatment2.location=5,
treatment2.route=1 and treatment2.location=0,
treatment2.route=1 and treatment2.location=1,
treatment2.route=1 and treatment2.location=5
;model:
U(treatment1) = b1.dummy[0|0]                                     * route[2,1,0]             
              + b2.dummy[0.00005|0.00004|0.00003|0.00002|0.00001] * freq[5,4,3,2,1,0]         
              + b3.dummy[0|0|0|0|0]                               * location[5,4,3,2,1,0]     
              + b4[-0.00001]                                      * cost [100,200,300]        (15-25,15-25,15-25)
              + b5[0.00001]                                       * effectiveness [40,50,60]  (15-25,15-25,15-25)
              /
U(treatment2) = b1.dummy * route
              + b2.dummy * freq
              + b3.dummy * location
              + b4       * cost     
              + b5       * effectiveness   
              /
U(optout)     = b6[0]
$
Michiel Bliemer
 
Posts: 1730
Joined: Tue Mar 31, 2009 4:13 pm

Re: Level balance with restrictions

Postby twickr07 » Wed Mar 02, 2022 3:12 am

Hi Michiel,

Thank you so much - your responses were super helpful!

As you said it was not possible to improve the attribute level balance after running the new code. I've read that level balance is really important so, how damaging is it to not have level balance in my design? instead, would you recommend doing a labelled design? I tried to run a labelled design but came across an error message saying "Two identically named attributes do not have consistently specified levels: 'infusion.freq', 'injection.freq'" could you please explain what I did wrong?

Thanks!

Code: Select all
?0=twice a day,1=once a day,2=twice a week,3=once a week,4=biweekly,4=once a month,5=once every 5 weeks
?0=hospital, 1=community clinic, 2=home
?0=60 minutes, 1=30 minutes, 2=5 minutes, 3 = 2 minutes

design
;alts = injection, infusion, pill, optout
;rows = 60
;block = 6
;eff = (mnl,d)
;con
;model:
U(injection)  = injection [0]
              + freq.dummy[0.00004|0.00003|0.00002|0.00001]   * freq[5,4,3,2,1]         
              + loc.dummy[0.00002|0.00001]                    * location[2,1,0]         
              + time.dummy[0.0001]                            * time[3,2]               
              + effect [0.00001]                              * effectiveness [40,50,60]
              + cost[-0.00001]                                * costoftreat[100,200,300]
              /
U(infusion)   = infusion [0]
              + freq.dummy[0.00003|0.00002|0.00001]           * freq [5,4,3,2]
              + loc.dummy [0.0001]                            * location [1,0]
              + time.dummy[0.0001]                            * time [1,0]             
              + effect                                        * effectiveness
              + cost                                          * costoftreat
              /
U(pill)       = freq.dummy [0.00002|0.00001]                  * freq [2,1,0]
              + loc.dummy  [0.0001]                           * location [2,1]
              + time.dummy [0.0001]                           * time [3,2]
              + effect                                        * effectiveness
              + cost                                          * costoftreat
              /
U(optout)     = b6[0]
$
twickr07
 
Posts: 15
Joined: Mon Nov 25, 2019 9:51 pm

Re: Level balance with restrictions

Postby Michiel Bliemer » Wed Mar 02, 2022 8:04 am

Attribute level balance is not very important, and as you will understand it often also does not exist in the real world in revealed preference data either. I would not never claim it to be very important, it is merely desirable.

Your error message is because you are using different levels for attributes with the same name, e.g. freq[5,4,3,2,1] and freq[2,1,0]. You need to define a single attribute freq with all levels, i.e. freq[5,4,3,2,1,0], and then impose constraints to limit the levels of certain alternatives, e.g.

;alg = mfederov
;reject:
pill.freq = 3, pill.freq = 4, pill.freq = 5

Note that this will not solve your attribute level balance problem since freq levels 1 and 2 will by definition appear much more frequently than levels 0, 3, 4, and 5. That is the price you pay for realism. Only by letting go of realism will you be able to get attribute level balance. Realism is clearly far more important than attribute level balance.

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

Re: Level balance with restrictions

Postby twickr07 » Wed Mar 02, 2022 7:54 pm

Hi Michiel,

Thank you for the clarification - I really appreciate your help. I'll stick with my unlabelled design :)

Tara
twickr07
 
Posts: 15
Joined: Mon Nov 25, 2019 9:51 pm


Return to Choice experiments - Ngene

Who is online

Users browsing this forum: No registered users and 10 guests

cron