Re: Evaluating external design & large designs
Posted: 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.
Michiel
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]
$