A library of designs should work. If you want to avoid having to create 32 designs, you could opt for 3 pivot designs, namely one pivot design for current service level 1 or 2 stars, one pivot design for current service level 3 stars, and one pivot design for current service level 4 or 5 stars, see Ngene scripts below. In these scripts, I used 3 stars as the base level for the dummy coded variable. After the data collection, you would pool all the data and then create a dummy variable for stars that has all 5 levels (not just 3 as in the separate designs).
Note that you can optimise the pivot designs around given mean attribute levels as done in the scripts below (which you can apply to any user specified attribute level), or you can design to create multiple pivot designs around different reference levels, but then you are probably better off with creating a library of designs with absolute attribute levels. Note that you will need a mechanism to avoid inappropriate user input such as a waiting time of 0 (which would not work with relative pivots) or a cost of 100000. This could be done for example by using discrete classes of user input (e.g. waiting time is 0-10 min, 10-20 min, 20-30 min, more than 30 min, and then use reference levels in the middle of the class).
Code: Select all
design ? design for service rating of 1 or 2 stars
;alts = clinic_sq*, clinic_1*, clinic_2*
;rows = 12
;eff = (mnl,d)
;model:
U(clinic_sq) = asc
+ b1.dummy[0] * radiologist[1,0] ? 0 = general (base), 1 = specialty
+ b2.dummy[0] * primarycare[1,0] ? 0 = no (base), 1 = yes
+ b3 * timetoresults.ref[20]
+ b4 * cost.ref[40]
+ b6 * waittime.ref[15]
+ b7 * traveltime.ref[15]
+ b8.dummy[0] * parkingcost[1,0] ? 0 = paid (base), 1 = free
+ b9.dummy[0|0] * parkingaccess[1,2,0] ? 0 = low (5-10 min walk) (base), 1 = medium (1-5 min walk), 2 = high (<1 min walk)
+ b10.dummy[0|0] * service[1,2,3] ? 3 = 3 stars (base), 1 = 1 star, 2 = 2 stars
+ b11.dummy[0] * onlinesched[1,0] ? 0 = no (base), 1 = yes
/
U(clinic_1) = b1.dummy[0] * radiologist
+ b2.dummy[0] * primarycare
+ b3 * timetoresults.piv[-25%,0%,25%]
+ b4 * cost.piv[-25%,0%,25%]
+ b6 * waittime.piv[-25%,0%,25%]
+ b7 * traveltime.piv[-25%,0%,25%]
+ b8.dummy * parkingcost
+ b9.dummy * parkingaccess
+ b10.dummy * service
+ b11.dummy * onlinesched
/
U(clinic_2) = b1.dummy[0] * radiologist
+ b2.dummy[0] * primarycare
+ b3 * timetoresults.piv[-25%,0%,25%]
+ b4 * cost.piv[-25%,0%,25%]
+ b6 * waittime.piv[-25%,0%,25%]
+ b7 * traveltime.piv[-25%,0%,25%]
+ b8.dummy * parkingcost
+ b9.dummy * parkingaccess
+ b10.dummy * service
+ b11.dummy * onlinesched
$
design ? design for service rating of 3 stars
;alts = clinic_sq*, clinic_1*, clinic_2*
;rows = 12
;eff = (mnl,d)
;model:
U(clinic_sq) = asc
+ b1.dummy[0] * radiologist[1,0] ? 0 = general (base), 1 = specialty
+ b2.dummy[0] * primarycare[1,0] ? 0 = no (base), 1 = yes
+ b3 * timetoresults.ref[20]
+ b4 * cost.ref[40]
+ b6 * waittime.ref[15]
+ b7 * traveltime.ref[15]
+ b8.dummy[0] * parkingcost[1,0] ? 0 = paid (base), 1 = free
+ b9.dummy[0|0] * parkingaccess[1,2,0] ? 0 = low (5-10 min walk) (base), 1 = medium (1-5 min walk), 2 = high (<1 min walk)
+ b10.dummy[0|0] * service[2,4,3] ? 3 = 3 stars (base), 2 = 2 stars, 4 = 4 stars
+ b11.dummy[0] * onlinesched[1,0] ? 0 = no (base), 1 = yes
/
U(clinic_1) = b1.dummy[0] * radiologist
+ b2.dummy[0] * primarycare
+ b3 * timetoresults.piv[-25%,0%,25%]
+ b4 * cost.piv[-25%,0%,25%]
+ b6 * waittime.piv[-25%,0%,25%]
+ b7 * traveltime.piv[-25%,0%,25%]
+ b8.dummy * parkingcost
+ b9.dummy * parkingaccess
+ b10.dummy * service
+ b11.dummy * onlinesched
/
U(clinic_2) = b1.dummy[0] * radiologist
+ b2.dummy[0] * primarycare
+ b3 * timetoresults.piv[-25%,0%,25%]
+ b4 * cost.piv[-25%,0%,25%]
+ b6 * waittime.piv[-25%,0%,25%]
+ b7 * traveltime.piv[-25%,0%,25%]
+ b8.dummy * parkingcost
+ b9.dummy * parkingaccess
+ b10.dummy * service
+ b11.dummy * onlinesched
$
design ? design for service rating of 4 or 5 stars
;alts = clinic_sq*, clinic_1*, clinic_2*
;rows = 12
;eff = (mnl,d)
;model:
U(clinic_sq) = asc
+ b1.dummy[0] * radiologist[1,0] ? 0 = general (base), 1 = specialty
+ b2.dummy[0] * primarycare[1,0] ? 0 = no (base), 1 = yes
+ b3 * timetoresults.ref[20]
+ b4 * cost.ref[40]
+ b6 * waittime.ref[15]
+ b7 * traveltime.ref[15]
+ b8.dummy[0] * parkingcost[1,0] ? 0 = paid (base), 1 = free
+ b9.dummy[0|0] * parkingaccess[1,2,0] ? 0 = low (5-10 min walk) (base), 1 = medium (1-5 min walk), 2 = high (<1 min walk)
+ b10.dummy[0|0] * service[4,5,3] ? 3 = 3 stars (base), 4 = 4 stars, 5 = 5 stars
+ b11.dummy[0] * onlinesched[1,0] ? 0 = no (base), 1 = yes
/
U(clinic_1) = b1.dummy[0] * radiologist
+ b2.dummy[0] * primarycare
+ b3 * timetoresults.piv[-25%,0%,25%]
+ b4 * cost.piv[-25%,0%,25%]
+ b6 * waittime.piv[-25%,0%,25%]
+ b7 * traveltime.piv[-25%,0%,25%]
+ b8.dummy * parkingcost
+ b9.dummy * parkingaccess
+ b10.dummy * service
+ b11.dummy * onlinesched
/
U(clinic_2) = b1.dummy[0] * radiologist
+ b2.dummy[0] * primarycare
+ b3 * timetoresults.piv[-25%,0%,25%]
+ b4 * cost.piv[-25%,0%,25%]
+ b6 * waittime.piv[-25%,0%,25%]
+ b7 * traveltime.piv[-25%,0%,25%]
+ b8.dummy * parkingcost
+ b9.dummy * parkingaccess
+ b10.dummy * service
+ b11.dummy * onlinesched
$
Another thing to consider is partial profile designs. You have 11 attributes, which is a lot, especially with 3 alternatives. This will make these choice tasks very complex for respondents. To simplify this for the user, you could create overlap, for example you vary only 5 attributes across the two alternatives and keep the remaining attributes fixed across the alternatives. SurveyEngine can automatically highlight attributes with overlapping levels to make it easier for the respondent as the respondent can ignore those attributes when making a choice in that choice task. I refer to Section 8.10 of the Ngene manual. This would require creating an external candidate set (e.g., in Excel) with allowable choice tasks where you create the desired overlap. If you need further assistance in creating partial profile designs please let me know and I may be able to assist.
Michiel