Page 1 of 1

Keeping attributes on a similar level

PostPosted: Wed Nov 14, 2018 2:08 am
by anna_123
Hi everyone,

I'm fairly new to Ngene and am trying to design a survey for modelling transport mode choices. The choice task looks something like: "If you were to make a trip that is 3km long which of the following modes of transportation would you choose?"

Different choice situations will have different trip lengths and attribute levels. The respondents can choose between the following modes with the given attributes:

walk (attributes: time)
bike (attributes: time)
bike sharing (attributes: time, cost)
car as passenger (attributes: time, waiting time)
public transport (attributes: time, waiting time, cost, # of changes)

To make the choice situation realistic I think it would be good to have similar levels across the alternatives, i.e. if the trip is long, for each alternative I would show a higher attribute level. Does that make sense? How can I do that in Ngene?
Here's my syntax for the pilot study:

Code: Select all
design
;alts = fuss, rad, rad_sharing, auto_mf, oev
;rows = 12
;block = 2
;eff = (mnl,d)

;model:

U(walk)= bt_walk[-0.06]*time_walk[0,18.75,37.5,56.25,75]/
U(bike)= bt_bike[-0.06] *t_bike[2,16,30]/
U(bike_sharing)= bt_bike*t_bike+ bc_bs[-0.05] *cost_bs[0.24,1.36,2.48,3.6]/
U(car_pass)= bt_car[-0.05]*time_car[2,13.5,25]+ bwt[-0.1]*wt_car[1,8,15]/
U(pt)= bz_oev[-0.08] *time_pt[2,15,30,40]+ bc_pt[-0.06]*cost_pt[2.5,3.5]+ bwt*wt_pt[1,8,15] + bch_pt[-0.08]*ch_pt[0,1,2,3]
$

Would you suggest more parameters? Should I include sociodemographic parameters and/or an opt out?

Re: Keeping attributes on a similar level

PostPosted: Wed Nov 14, 2018 8:12 am
by Michiel Bliemer
Is the "3km long" fixed across all choice tasks for a single respondent, or does it vary within respondent?
If it is fixed, then it is easiest to simply create three different designs, one for short trips, one for medium length trips, and one for long trips.
If it varies across choice tasks, then you could add "trip length" as a scenario variable in your utility functions and use conditional if-then constraints to make sure that the other attribute levels make sense, e.g. if(walk.triplength = 3, time_walk = [15, 20, 25]) while the time_walk attribute has many levels, e.g. [5,10,15,20,25,30,35,40,...].

It is not common to include socio-demographics at the design stage, but if you believe this is important then you could create different surveys per segment.

You will need to add alternative-specific constants in your utility functions since your alternatives are labelled.

There is often no need to add an opt-out unless unconditional market shares are the aim of your study.

Please select attribute levels that are easy to interpret for respondents, so not 56.25 min walk time.

I cannot recommend which parameters or attributes to include, this depends on your study.

Michiel

Re: Keeping attributes on a similar level

PostPosted: Thu Nov 15, 2018 5:24 pm
by anna_123
The trip length varies for each respondent, so we will use conditionals! Thanks for the elaborate response :)

I totally agree about using understandable attribute levels, those were just premiliminary, also thanks for catching that I forgot the ASC!

Re: Keeping attributes on a similar level

PostPosted: Fri Nov 16, 2018 1:24 am
by anna_123
Hi again,

I have tried to implement the changes but already have a follow up question. Here's how I changed the syntax:

Code: Select all
design
;alts = walk, bike, bike_sharing, car_pass, pt
;rows = 12
;block = 2
;eff = (mnl,d)

;cond:
if(walk.length = 1, time_walk = [8,12,16,20]),
if(walk.length = 3, time_walk = [25,37,48,60]),
if(walk.length = 6, time_walk = [51,74,97,120]),
if(bike.length = 1, time_bike= [2,4,6,8]),
if(bike.length = 3, time_bike= [6,12,19,25]),
if(bike.length = 6, time_bike= [12,25,38,51]),
if(car_pass.length = 1, time_car= [1,3,4,6]),
if(car_pass.length = 3, time_car= [3,8,13,18]),
if(car_pass.length = 6, time_car= [6,16,26,36]),
if(pt.length = 1, time_pt= [2,4,6,8]),
if(pt.length = 3, time_pt= [6,12,19,25]),
if(pt.length = 6, time_pt= [12,25,38,51])

;model:
U(walk)= asc_walk+bt_walk[-0.06]*time_walk[8,12,16,20,25,37,48,51,60,74,97,120]+bl_walk[-0.1]*length[1,3,5]/
U(bike)= asc_bike+bt_bike[-0.06]*time_bike[2,4,6,8,12,19,25,38,51]+bl_bike[-0.1]*length/
U(bike_sharing)=asc_bike_sharing+bt_bike*time_bike+bc_bs[-0.05]*cost_bs[0.1,0.7,1.4,2]+ bl_bs[-0.1]*length/
U(car_pass)= asc_car_pass+bt_car[-0.05]*time_car[1,3,4,6,8,13,16,18,26,36]+ bwt[-0.1]*wt_car[1,8,15]+bl_car[-0.05]*length/
U(pt)=bt_pt[-0.08]*time_pt [2,4,6,8,12,19,25,38,51]+bc_pt[-0.06]*cost_pt[1.3,2.2,3.1,4.0] + bwt*wt_pt[1,8,15]+bch_pt[-0.08]*ch_pt[0,1,2,3]+bl_pt[-0.05]*length 

$


Now I get an error message stating that an attribute, 'time_walk', specified in the ';cond' property could not be found. Also ideally I would like to have the same trip lengths over all alternatives. Does that mean, I have to require that they are the same? Can I just add that when having conditionals?

Thanks again!

Re: Keeping attributes on a similar level

PostPosted: Sun Nov 18, 2018 10:45 am
by Michiel Bliemer
You forget to put the alternative name in front of the attribute name in your ;cond statements. I have fixed it below.
I also added length as a scenario variable where I refer to the same value across all alternatives using length[length].

Given that you have a lot of levels and complex conditional constraints, it is difficult for Ngene to find a suitable design in 12 choice tasks; 24 choice tasks works better in this case.

Code: Select all
design
;alts = walk, bike, bike_sharing, car_pass, pt
;rows = 24
;block = 4
;eff = (mnl,d)

;cond:
if(walk.length = 1, walk.time_walk = [8,12,16,20]),
if(walk.length = 3, walk.time_walk = [25,37,48,60]),
if(walk.length = 6, walk.time_walk = [51,74,97,120]),
if(bike.length = 1, bike.time_bike= [2,4,6,8]),
if(bike.length = 3, bike.time_bike= [6,12,19,25]),
if(bike.length = 6, bike.time_bike= [12,25,38,51]),
if(car_pass.length = 1, car_pass.time_car= [1,3,4,6]),
if(car_pass.length = 3, car_pass.time_car= [3,8,13,18]),
if(car_pass.length = 6, car_pass.time_car= [6,16,26,36]),
if(pt.length = 1, pt.time_pt= [2,4,6,8]),
if(pt.length = 3, pt.time_pt= [6,12,19,25]),
if(pt.length = 6, pt.time_pt= [12,25,38,51])

;model:
U(walk)= asc_walk+bt_walk[-0.06]*time_walk[8,12,16,20,25,37,48,51,60,74,97,120]+bl_walk[-0.1]*length[1,3,5]/
U(bike)= asc_bike+bt_bike[-0.06]*time_bike[2,4,6,8,12,19,25,38,51]+bl_bike[-0.1]*length[length]/
U(bike_sharing)=asc_bike_sharing+bt_bike*time_bike+bc_bs[-0.05]*cost_bs[0.1,0.7,1.4,2]+ bl_bs[-0.1]*length[length]/
U(car_pass)= asc_car_pass+bt_car[-0.05]*time_car[1,3,4,6,8,13,16,18,26,36]+ bwt[-0.1]*wt_car[1,8,15]+bl_car[-0.05]*length[length]/
U(pt)=bt_pt[-0.08]*time_pt [2,4,6,8,12,19,25,38,51]+bc_pt[-0.06]*cost_pt[1.3,2.2,3.1,4.0] + bwt*wt_pt[1,8,15]+bch_pt[-0.08]*ch_pt[0,1,2,3]+bl_pt[-0.05]*length[length]
$


Michiel

Re: Keeping attributes on a similar level

PostPosted: Tue Nov 20, 2018 2:56 am
by anna_123
Great! Thank you very much, that really helped a lot!