Page 1 of 1

Pivot design with dummy coding?

PostPosted: Sat May 14, 2022 5:51 am
by Jbenson
Hi all! I'm working on a DCE with two unlabeled alternatives, and a status quo option. I have ten total attributes, six of which are continuous, and four binary. I am using SurveyEngine as the platform to administer this DCE, and in the introduction I obtain the reference values for each of these. Currently, I have an orthogonal design generated from SurveyEngine, which presents users with two alternatives that have levels either 25% higher, or 25% lower than the reference.

The attributes are:
    Specialty (binary): "General" or "Specialist"
    Primary Care Recommended (binary): "Yes" or "No"
    Time to results (continuous): user reference, reference + 25%, reference - 25%
    Cost (continuous): user reference, reference + 25%, reference - 25%
    Wait time (continuous): user reference, reference + 25%, reference - 25%
    Travel time (continuous): user reference, reference + 25%, reference - 25%
    Parking cost (binary): "Free" or "Paid"
    Parking Accessibility (continuous): user reference, reference + 25%, reference - 25%
    Service (continuous): user reference, reference + 1 star, reference - 1 star. [If reference is "1 star", levels are 1, 2, 3. If reference is "5 star", levels are 5, 4, 3]
    Online Scheduling (binary): "Available" or "Not Available"

Example choice task is here: Image

I am attempting to replace this with a d-efficient design from NGene, and am struggling to conceptualize how to properly adapt it. It is easy to create the design with the reference alternatives for continuous attributes, but not so much for dummy coded ones. Similarly, one of the attributes (star rating) needs to be bounded between 1 and 5, so I can't generate a design which subtracts 1 star from 1 reference of 1, or likewise adds a star to a 5-star rating.

I am thinking that I would take an approach of a "library of designs" of pivoted designs, where each combination of binary attributes is constrained, as well as the star rating: this would then result in 32 designs, one of which the respondent would see, based on the combination of responses in their status quo.

Is this necessary? Or is there an easier way to approach this that I am not considering? I am working on draft code at the moment to write this down, and will post it in a follow up for added clarity.

Thank you so much!

Re: Pivot design with dummy coding?

PostPosted: Sat May 14, 2022 9:14 am
by Michiel Bliemer
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