Evaluating external design & large designs

This forum is for posts that specifically focus on Ngene.

Moderators: Andrew Collins, Michiel Bliemer, johnr

Re: Evaluating external design & large designs

Postby Michiel Bliemer » Thu Apr 10, 2025 9:52 am

1. If you only specify one non-zero prior then of course Ngene cannot check for dominance because that attribute cannot be compared with anything. If you specify non-zero priors for only 2 attributes then Ngene will reject any design that has a dominant attribute based on only these 2 attributes. When you specify the preference order, it is always best to specify (almost all) attributes with a preference order. If some have unknown order, then it is unlikely that there is an issue with dominant alternatives. In any case, with the default column-based swapping algorithm it will be impossible to find a design with 660 rows without any dominant alternative. You will need to switch to the modified Federov algorithm using ;alg = mfederov. This is a row-based algorithm that can easily avoid dominant alternatives, but may not yield attribute level balance. As mentioned earlier, the modified Federov algorithm is slow and perhaps too slow for such a huge model and design. In your case, since not ALL of your attributes have a clear preference order, you may want to forego dominance checks as there will not be a major issue.

2. You can reformulate using reject constraints. For example:
;reject:
alt12.mode = 1 and alt1_is_pt = 0,
etc,

3. This is the easiest of all. You need to formulate a labelled experiment whereby alt1 is always mode=1, alt2 is always mode=2, and alt3 is always mode=3. You can randomise the order of the alternatives in the survey instrument. This also makes it much easier to specify alternative-specific coefficients without the need for all the interactions, and it also makes it much easier to specify that certain attributes only appear in certain alternatives. In other words, everything becomes much easier; you do not need the is_pt indicator anymore and you do not need the auxiliary model anymore. But from your first message, you wanted mode to be an attribute, and the only reason for doing this is to allow the same mode across multiple alternatives. But if you do not want this, then the solution is simply a labelled experiment. Much easier, see script below! And in a labelled experiment, there is no issue with dominant alternatives because you are no longer comparing bus versus bus but only bus versus car etc.

Code: Select all
Design
;alts = rail, car, bus, none
;rows = 660
;block = 55

;eff = (mnl,d)                                   
;alg = mfederov

;model:
U(rail)  = asc_rail
         + b_fm_rail.dummy[0|0|0|0|0|0|0|0|0|0] * fm[2,3,4,5,6,7,8,9,10,11,1]                                  ? First Mile dummy: 1 = walk 5m (base), 2 = walk 15m, 3 = Taxi 5m 12€, 4 = Taxi 15m 30€, 5 = Taxi 30m 50€, 6 = PT 10m 0€, 7 = PT 30m 0€, 8 = PT 50m 0€, 9 = PT 10m 3€, 10 = PT 30m 6€, 11 = PT 50m 9€
         + b_tt.dummy[0|0]                      * tt[2,3,1]                                                    ? time dummy: 1 = 7h (base), 2 = 8h, 3 = 9h
         + b_transfers_rail.dummy[0|0]          * transfers[2,3,1]                                             ? transfers dummy: 1 = 0 transfers, 2 = 1 transfer, 3 = 2 transfers
         + b_delay.dummy[0|0|0]                 * delay[2,3,4,1]                                               ? delay dummy: 1 = on time (base), 2 = 20% 1h, 3 = 20% 2h, 4 = 20% 3h
         + b_cost.dummy[0|0|0|0]                * cost[2,3,4,5,1]                                              ? cost dummy: 1 = 25€ (base), 2 = 50€, 3 = 100€, 4 = 150€, 5 = 200€
         + b_lm_rail.dummy[0|0|0|0|0|0|0|0|0|0] * lm[2,3,4,5,6,7,8,9,10,11,1]                                  ? LM dummy: 1 = walk 5m (base), 2 = walk 15m, 3 = Taxi 5m 12€, 4 = Taxi 15m 30€, 5 = Taxi 30m 50€, 6 = PT 10m 0€, 7 = PT 30m 0€, 8 = PT 50m 0€, 9 = PT 10m 3€, 10 = PT 30m 6€, 11 = PT 50m 9€
         + b_busfreq.dummy[0|0]                 * busfreq[2,3,1]                                               ? bus frequency: 1 = every 30m (base), 2 = every 60m, 3 = 3 times a day
         + b_busstop.dummy[0|0|0|0]             * busstop[2,3,4,5,1]                                           ? distance to bus stop: 1 = right at the hotel (base), 2 = 5min, 3 = 10min, 4 = 15min, 5 = 30min
         + b_hotel.dummy[0|0|0|0]               * hotel[2,3,4,5,1]                                             ? facilities at the hotel: 1 = nothing, 2 = E-Bikes, 3 = of (own) electric car for free, 4 = charging of (own) electric car for a market price, 5 = electric car for guests
         + b_transfers2_delay2_rail             * transfers.dummy[2] * delay.dummy[2]
         + b_transfers2_delay3_rail             * transfers.dummy[2] * delay.dummy[3]
         + b_transfers2_delay4_rail             * transfers.dummy[2] * delay.dummy[4]
         + b_transfers3_delay2_rail             * transfers.dummy[3] * delay.dummy[2]
         + b_transfers3_delay3_rail             * transfers.dummy[3] * delay.dummy[3]
         + b_transfers3_delay4_rail             * transfers.dummy[3] * delay.dummy[4]
         /

U(car)   = asc_car
         + b_tt.dummy                           * tt
         + b_delay.dummy                        * delay
         + b_cost.dummy                         * cost
         + b_busfreq.dummy                      * busfreq
         + b_busstop.dummy                      * busstop
         + b_hotel.dummy                        * hotel
         /

U(bus)   = asc_bus
         + b_fm_bus.dummy[0|0|0|0|0|0|0|0|0|0]  * fm     
         + b_tt.dummy                           * tt
         + b_transfers_bus.dummy[0|0]           * transfers
         + b_delay.dummy                        * delay
         + b_cost.dummy                         * cost
         + b_lm_bus.dummy[0|0|0|0|0|0|0|0|0|0]  * lm
         + b_busfreq.dummy                      * busfreq
         + b_busstop.dummy                      * busstop
         + b_hotel.dummy                        * hotel
         + b_transfers2_delay2_bus              * transfers.dummy[2] * delay.dummy[2]
         + b_transfers2_delay3_bus              * transfers.dummy[2] * delay.dummy[3]
         + b_transfers2_delay4_bus              * transfers.dummy[2] * delay.dummy[4]
         + b_transfers3_delay2_bus              * transfers.dummy[3] * delay.dummy[2]
         + b_transfers3_delay3_bus              * transfers.dummy[3] * delay.dummy[3]
         + b_transfers3_delay4_bus              * transfers.dummy[3] * delay.dummy[4]

$


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

Re: Evaluating external design & large designs

Postby bartoszbursa » Wed Apr 16, 2025 4:49 pm

Thanks again, Michiel, this is extremely helpful!

I see the advantages of a labeled design - simpler code, easy to follow alternative-specific coefficients, no multiple interaction terms, etc.

However, there is one problem with labeled design in my specific case. As the final development of my design, which is getting to complex with these first/last mile attributes for the respondents, I want to show only 3 (2 real ones + none) out of 4 alternatives, which leads me to partial choice sets with modified Federov and the trick with an additional 9999 level for one of the attributes. Unfortunately, according to the manual, this works only if there is at least one non-dummy variable in the model. Is there any other way to do it? I thought of two ways:
(1) In labeled design, maybe I could add an artificial linear variable just for the sake of the trick, and then delete it from the design?
(2) in unlabeled design, add some kind of additional variable that "turns off" one level of mode (which will now be an attribute) every 25% of cases, but I am not sure how to start with that.

Bartosz
bartoszbursa
 
Posts: 6
Joined: Tue Mar 18, 2025 9:29 pm

Previous

Return to Choice experiments - Ngene

Who is online

Users browsing this forum: No registered users and 11 guests

cron