Conjoint-table plugin is an enhanced version of the original conjoint plugin developed by SurveyCTO. In the standard conjoint plugin, randomization of attributes or values are to be done within the plugin itself. This does not give flexibility to do the randomization or selection of values with any other criteria. This new conjoint-table plugin allows the user to fix the values in the SurveyCTO XLSForm as per their requirement and create the table accordingly.
In SurveyCTO, the conjoint table plugin allows attribute order to be randomized by setting randomize=1
. However, if you need more control over how attributes are randomized—such as keeping specific attributes like "price" and "warranty" together with random order at the top of the list while allowing other attributes to appear in any order—the enhanced version of the conjoint table plugin can offer this added flexibility.
Additionally, this plug-in allows to add image as an attribute, i.e., add a product image for each of the products.
Feature / Property | Support |
---|---|
Supported field type(s) | text note |
Default values | No |
Randomization | Yes |
Media:image | Yes |
Media:video | No |
Media:audio | No |
Delimiter | Yes |
Custom constrain message | Yes |
Custom required message | Yes |
Read only | No |
Dependency among attribute values: Certain attributes depend on each other, meaning that specific values can only appear if another attribute meets a particular condition. For example:
- Battery Life: If the battery life is indicated as 5 years, then guarantee on the battery should not appear more than 5 years.
More control on randomization of values: There can be many reasons the research team may want to have more control over the randomization and table formation. For example, it may be important to group some of the attributes, and randomize the orders of the attributes only within the group. There can be other reasons, for example, they may not want an equal probability for each value to appear.
Additionally, this plugin allows for the inclusion of images for profiles, making it ideal for studies requiring visual evaluations of products or services, such as packaging, branding, or design.
This plug-in works as a table generator while the randomization and array constructions happen using regular SurveyCTO calculations.
Attribute randomization: To avoid order bias, attributes (such as price, brand, warranty, battery life) need to be shuffled so that respondents see unique combinations in each scenario.
- Download the sample form from this repo and upload it to your SurveyCTO server.
- Download the conjoint-table-bn.fieldplugin.zip from this repo, and attach it to the test form on your SurveyCTO server.
- Make sure to provide the correct parameters (see below).
custom-conjoint-table-bn(attributes = ${attributes}, level1 = ${levels_array1}, level2 = ${levels_array2}, image1=${c1_mbl_img}, image2=${c2_mbl_img}, labels='Mobile 1, Mobile 2')
Let’s assume we want to conduct a conjoint experiment where we have set of attributes. The attribute list are given below:
Attributes | Values |
---|---|
Phone name | "Nokia, Samsung, Redmi, Oneplus, Huawei,Pixel" |
Price | "5000 taka, 6000 taka, 6500 taka, 8000 taka, 12000 taka, 15000 taka, 1700 taka" |
Display | "5.5 inches, 6 inches, 6.2 inches, 6.5 inches, 7.5 inches" |
Warranty | "If price is (5000, 6000 or 6500 taka) = warranty (6 months, 8 months) If price is (8000 or 12000) = warranty(6 months, 8 months, 10 months) If price is (15000 or 17000) = warranty 1 year" |
Payment | “Online payment,Cash payment” |
- Attributes.
- Randomize and organize level1 and level2 values into ordered arrays with a pipe ‘|‘ delimiter based on attributes.
level1
level2
- Place the resulting calculated attributes array along with level1 and level2 values array in the plugin parameters.
type | Name | Calculation | repeat count | Description |
---|---|---|---|---|
calculate | attributes | Price, Warranty, Display, phone name and payment" | Create a list of attributes and separated by delimited ‘,’ |
name | Calculation | Description |
---|---|---|
mobile array | “"Nokia, Samsung, Redmi, Oneplus, Huawei,Pixel"” | Create a list with phone names that are delimited by "," |
c1_mobile | once(item-at(',',${mobile_array},(int(count-items(',',${mobile_array}))*random()))) | For the level1, this will select one value at a time at random. |
c2_mobile | once(item-at(',',${mobile_array},(int(count-items(',',${mobile_array}))*random()))) | For level2, this will select one value at a time at random. |
Name | calculation | description |
---|---|---|
mobile_price_array | "5000 taka,6000 taka,6500 taka,8000 taka,12000 taka,15000 taka,17000 taka" | Use a list with the delimited "," for mobile price values. |
c1_mobile_price | once(item-at(',',${mobile_price_array},int(count-items(',',${mobile_price_array}))*random())) | For the level1, this will select one number at random from the mobile_price_array. |
c2_mobile_price | once(item-at(',',${mobile_price_array},int(count-items(',',${mobile_price_array}))*random())) | For level2, this will select one number at random from the mobile_price_array. |
Name | calculation | description |
---|---|---|
c1_warranty | "if((${c1_mobile_price} = ""5000 taka"" or ${c1_mobile_price} = ""6000 taka"" or ${c1_mobile_price} = ""6500 taka""), ""6 months, 8 months"", if((${c1_mobile_price} = ""8000 taka"" or ${c1_mobile_price} = ""12000 taka""), ""10 months, 1 year"", if((${c1_mobile_price} = ""15000 taka"" or ${c1_mobile_price} = ""17000 taka""), ""1.5 year"", """"))) " | Depending on the ${c1_mobile_price} warranty is calculated. For example: if mobile price value is 15000 taka the calculated value will be 1.5 year |
c2_warranty | "if((${c2_mobile_price} = ""5000 taka"" or ${c2_mobile_price} = ""6000 taka"" or ${c2_mobile_price} = ""6500 taka""), ""6 months, 8 months"", if((${c2_mobile_price} = ""8000 taka"" or ${c2_mobile_price} = ""12000 taka""), ""10 months, 1 year"", if((${c2_mobile_price} = ""15000 taka"" or ${c2_mobile_price} = ""17000 taka""), ""1.5 year"", """"))) " | Depending on ${c2_mobile_price} item, calculate warranty. For example: if mobile price value is 15000 taka the calculated value will be 1.5 year |
Name | calculation | description |
---|---|---|
c1_display_array | "5.5 inches, 6 inches, 6.2 inches, 6.5 inches, 7.5 inches" | Use a list with the delimited "," for mobile display values. |
c1_mobile_price | once(item-at(',',${c1_display_array},int(count-items(',',${c1_display_array})*random()))) | For level1, this function selects one value at random from c1_display_array. |
c2_mobile_price | once(item-at(',',${c1_display_array},int(count-items(',',${c1_display_array})*random()))) | For the level2, this function selects one value at random from c2_display_array. |
type | name | calculation | repeat count | description |
---|---|---|---|---|
begin repeat | level_construct | 5 | Set the repeat count based on the number of attributes in your combined list | |
calculate | serial | item-at(',', ${attributes}, index()-1) | Randomly pick attributes from previously constructed attributes array | |
calculate | value_1 | "if(${serial}="Price", ${c1_mobile_price},if(${serial}=""Warranty"", ${c1_warranty}, if(${serial}=""Display"", ${c1_display}, if (${serial}=""Payment"",${c1_pay},${c1_mobile})))) " | Assign values for level_1 from the randomized value lists based on the attribute indicated in the ${serial} field | |
calculate | value_2 | if(${serial}="Price", ${c2_mobile_price},if(${serial}="Warranty", ${c2_warranty}, if(${serial}="Display", ${c2_display}, if (${serial}="Payment",${c2_pay},${c2_mobile})))) | Assign values for level_2 from the randomized value lists based on the attribute indicated in the ${serial} field | |
end repeat | level_construct | |||
calculate | levels_array1 | join(' | ', ${value_1}) | |
calculate | levels_array1 | join(' | ', ${value_1}) |
key | Value |
---|---|
attributes |
Comma-separated list of attributes. |
level1 |
A comma-separated set of values representing the attributes for profile 1, which may include various characteristics such as color, size, and features. |
level2 |
A comma-separated set of values representing the attributes for profile 2, which may include various characteristics such as color, size, and features. |
image1 |
A file path pointing to an image associated with the level1, used to visually represent the product or service feature in the survey. |
image2 |
A file path pointing to an image associated with the level2, used to visually represent the product or service feature in the survey. |
lebels |
label for the the pair of profiles profiles. |
Example:
Here is an example appearance for your text field that uses this field plug-in:
`custom-conjoint-table-bn(attributes = ${attributes}, level1 = ${levels_array1}, level2 = ${levels_array2}, image1=${c1_mbl_img}, image2=${c2_mbl_img}, labels='Mobile 1, Mobile 2')`
Email: mehrab.ali@arced.foundationn
Email: tasmin.pritha@arced.foundation
- sample form You can find a form defination in this repo here: sample form
- Developer documentation More instruction for developing and using field plug-ins can be found here: https://github.com/surveycto/Field-plug-in-resources
- User documentation: How to get started using field plug-ins in your SurveyCTO form. https://docs.surveycto.com/02-designing-forms/03-advanced-topics/06.using-field-plug-ins.html