Page 1 of 1
Undefined MNL D-error
Posted:
Wed Sep 04, 2024 3:24 am
by dgverissimo
Dear Ngene Community,
I am struggling with an issue related to Undefined MNL D-error. My code is below. I understand from past posts that this is linked with the constrains imposed by the design but it seems to me that there are enough possible designs that this should not be an insurmountable issue.
Any input as to how to overcome this obstacle is greatly appreciated.
Many thanks,
Diogo
Design
;alts = alt1, alt2, alt3
;rows = 24
;eff = (mnl,d)
;alg = mfederov
;bdraws = halton(200)
;require:
alt1.leopard + alt1.serval + alt1.genet + alt1.synthetic = 1,
alt2.leopard + alt2.serval + alt2.genet + alt2.synthetic = 1
;model:
U(alt1) = b_price [(n,1,0.5)] * price [30, 85, 245, 700, 2000, 5725]
+ b_leopard [(n,1,0.1)] * leopard [0,0.25,0.5,0.75]
+ b_serval [(n,0.05,0.01)] * serval [0,0.25,0.5,0.75]
+ b_genet [(n,0.01,0.001)] * genet [0,0.25,0.5,0.75]
+ b_synthetic [(n,0.05,0.01)] * synthetic [0,0.25,0.5,0.75] /
U(alt2) = b_price * price [30, 85, 245, 700, 2000, 5725]
+ b_leopard * leopard [0,0.25,0.5,0.75]
+ b_serval * serval [0,0.25,0.5,0.75]
+ b_genet * genet [0,0.25,0.5,0.75]
+ b_synthetic * synthetic [0,0.25,0.5,0.75] $
Re: Undefined MNL D-error
Posted:
Wed Sep 04, 2024 8:07 am
by Michiel Bliemer
Having a quick look at your script I notice that your prior for price (1) is extremely large compared to your attribute levels [5725], which creates huge utilities. This is a mis-specified model in which all choice probabilities will be either 0 or 1 and the model becomes unidentified.
I suggest you either use near-zero priors for all parameters, eg -0.00001 for price, or use priors where your parameters come from a pilot study and you have actually estimated them. Setting them manually is not a good idea and will lead to very bad designs.
Note that you will need to use ;alts = alt1*, alt2*, alt3 to let Ngene remove dominant alternatives. Also, you will need to specify a constant since you have an optout alternative, so you either specify
U(alt3) = b0[0]
or you add b0 to alt1 and alt2.If you use informative priors from a pilot study, you will also need to estimate the prior for the constant.
Michiel
Re: Undefined MNL D-error
Posted:
Wed Sep 04, 2024 11:43 pm
by dgverissimo
Thank you very much for the quick reply Michiel!
These priors were obtained indirectly from a previous survey which did not include a choice experiment but did include questions around price and past use of products, which was hoping could provide an indication of what preferences for different attributes could look like. Is that kind of leap not advisable?
I changed the design to have much smaller priors but still get the same error, do you have any further advice?
Thank you in advance!
Design
;alts = alt1*, alt2*, alt3
;rows = 24
;eff = (mnl,d)
;alg = mfederov
;bdraws = halton(200)
;require:
alt1.leopard + alt1.serval + alt1.genet + alt1.synthetic = 1,
alt2.leopard + alt2.serval + alt2.genet + alt2.synthetic = 1
;model:
U(alt1) = b_price [(n,-0.001,0.005)] * price [30, 85, 245, 700, 2000, 5725]
+ b_leopard [(n,0.001,0.001)] * leopard [0,0.25,0.5,0.75]
+ b_serval [(n,0.00005,0.0001)] * serval [0,0.25,0.5,0.75]
+ b_genet [(n,0.00001,0.00001)] * genet [0,0.25,0.5,0.75]
+ b_synthetic [(n,0.00005,0.0001)] * synthetic [0,0.25,0.5,0.75] /
U(alt2) = b_price * price [30, 85, 245, 700, 2000, 5725]
+ b_leopard * leopard [0,0.25,0.5,0.75]
+ b_serval * serval [0,0.25,0.5,0.75]
+ b_genet * genet [0,0.25,0.5,0.75]
+ b_synthetic * synthetic [0,0.25,0.5,0.75] /
U(alt3) = b0[0] $
Re: Undefined MNL D-error
Posted:
Thu Sep 05, 2024 8:26 am
by Michiel Bliemer
It is only advisable for experienced choice modellers since it requires correcting for different units, different model scale, etc.
Note that -0.001 * 5725 = -5.725, which is still a very large utility, and when using a standard deviation of 0.005 around this prior, the parameter for price is probably still too large.
I now had a closer look at your script as it is not standard with the constraints, and I can indeed confirm that the issue is with the constraint that attributes need to sum to 1. This creates multicollinearity because if you know leopard, serval and genet then you can calculate synthetic, or more generally, if you know 3 of the 4 attributes, you can calculate the fourth. This means that your model is not identifiable.
There are two options to make the model identifiable:
1. You remove one of the attributes. This would be somewhat similar to dummy coding whereby you need to set one of the levels as the base. You will need to think about the interpretation of the model in this case, e.g. if you omit 'leopard' then all estimated parameters will be relative to 0 for leopard perhaps? I have not seen this situation before so you may want to look into the literature if others have done this previously.
2. You make interactions instead of main effects. If you interact all attributes with price then the model becomes identified. The interpretation of the coefficients would then be that the parameters indicate the impact of leopard etc on the sensitivity for price. But this is maybe not what you want.
So think about model identifiability and formulate utility functions that can be estimated. This can sometimes be tricky, as in your case.
Michiel