MaxDiff Methodology Design
You'll find here the below example QEX file.
Definition
MaxDiff is an approach for obtaining preference/importance scores for multiple items (e.g. brand preferences, brand images, product features, advertising claims, etc.). Although MaxDiff shares much in common with conjoint analysis, it is easier to use and applicable to a wider variety of research situations. MaxDiff is also known as "best-worst scaling".
Research has shown that MaxDiff scores demonstrate greater discrimination among items and between respondents on the items. Since respondents make choices rather than expressing strength of preference using some numeric scale, there is no opportunity for scale use bias. This is an extremely valuable property for cross-cultural research studies.
The trade-off techniques used in MaxDiff are robust and easy to apply. The resulting item scores are also easy to interpret, as they can be placed on a 0 to 100 point common scale and sum to 100.
Example
In the example below we have:
- 55 statements about a supermarket
- 350 different arrangements of these statements
- 5 statements per screen to pick the least and most important (sentences)
- 35 screens per respondent (iterations)
- 350 arrangements are covered by 10 possible versions of the MaxDiff x 35 statements out of 55.
- We apply the MaxDiff ADC and add the shortcut of the "Least" question
Routings
- We are shown the questions Most & Least on each of the 35 occurrences of the Iteration loop – they show the same codes and you pick one for each.
- Duplication is avoided with a simple validation (show message) routing:
if ??Most??[Ci(1)] = ??Least??[Ci(1)] => (show message) routing:"You cannot give the same answer for most and least!"
- The routing used to make the correct selection is as follows:
GetParameter( ResponseText("items:" + (Ci(2) + (??version?? -1) * 35)) , Ci(1) )
- CI(1) is the inner-most loop from the point of view of the start question: sentences – so CI(1) will take values 1 to 5
- CI(2) is the next / second inner-most loop from the point of view of the start question: iterations – so CI(2) will take values 1 to 35
- If version = 1 and CI(1) = 1 and CI(2) = 1 then we will get parameter from the . . .
GetParameter( ResponseText("items:" + 1), 1) returning [15],10,44,24,36
- If version = 1 and CI(1) = 2 and CI(2) = 1 then we will get parameter from the . . .
GetParameter( ResponseText("items:" + 1), 2) returning 15,[10],44,24,36
- If version = 10 and CI(1) = 5 and CI(2) = 35 then we will get parameter from the . . .
GetParameter( ResponseText("items:" + 35 + (9 * 35), 5) =
GetParameter( ResponseText("items:" + 350, 5) returning 30,49,25,26,[12]
As you can see, putting the comma (or other) separated format and listing them in a variable makes this an easily adaptable process for different MaxDiff setups. We can use Excel to create these comma-separated lists and paste them into AskiaDesign.
Why not still make the routing more dynamic? You can probably spot that the hard coded value of 35 can be (and should) be replaced. Use: Iterations.Responses.Count
This means you won’t need to update the routing, but simply paste in your new:
- versions
- statements
- list of comma-separated arrangements of statement numbers
- iterations (pages to show)
- sentence numbers (sentences to show per screen)
Additional info
In order to prepare the MaxDiff analyse (utility calculation), we add some recoded questions (not visible during data entry) inside the Iterations loop:
Recode_most => Set Value => ??Selected??[??Most??[ci(1)]][ci(1)])
Recode_least => Set Value => ??Selected??[??Least??[ci(1)]][ci(1)])
Recode_Not_selected => Set value =>
dim i
dim valselected ={}
dim result = {}
for i=1 to Selected.iteration(Iterations:1).responses.count
valselected = valselected + Selected.iteration(i,Iterations.currentiteration)
next i
result = valselected - Recode_most.iteration(Iterations.currentIteration) - Recode_least.iteration(Iterations.currentIteration)
return result
Recode_offered => Set value =>
dim i
dim valselected ={}
dim result = {}
for i=1 to Selected.iteration(Iterations:1).responses.count
valselected = valselected + Selected.iteration(i,Iterations.currentiteration)
next i
result = valselected
return result
Vote loop with following 11 items and the rec_items sub-question:
1. Most /2. Least/3. Not selected / 4. Offered => Run askiascript
rec_items.iteration(Iterations:Iterations.currentiteration,Vote:1).setvalue(Recode_most.iteration(Iterations:Iterations.currentiteration))
rec_items.iteration(Iterations:Iterations.currentiteration,Vote:2).setvalue(Recode_least.iteration(Iterations:Iterations.currentiteration))
rec_items.iteration(Iterations:Iterations.currentiteration,Vote:3).setvalue(Recode_Not_selected.iteration(Iterations:Iterations.currentiteration))
rec_items.iteration(Iterations:Iterations.currentiteration,Vote:4).setvalue(Recode_offered.iteration(Iterations:Iterations.currentiteration))
5. Utility Like => only for Analyse purposes
6. Utility Dislike => only for Analyse purposes
7. Utility Item => only for Analyse purposes
8. Utility Scaled => only for Analyse purposes
9. Utility Transformed => only for Analyse purposes
10. Preference share => only for Analyse purposes
11. Index => only for Analyse purposes
There is an article in the Analyse section of our help centre explaining basic and advanced analysis of MaxDiff data, once collected.