like.gms : Maximum Likelihood Estimation

**Description**

This application from the biomedical area tests the hypothesis that a population of systolic blood pressure can be separated into three distinct groups.

**Reference**

- Bracken, J, and McCormick, G P, Chapter 8.5. In Selected Applications of Nonlinear Programming. John Wiley and Sons, New York, 1968, pp. 90-92.

**Small Model of Type :** NLP

**Category :** GAMS Model library

**Main file :** like.gms

```
$title Maximum Likelihood Estimation (LIKE,SEQ=25)
$onText
This application from the biomedical area tests the hypothesis
that a population of systolic blood pressure can be separated into
three distinct groups.
Bracken, J, and McCormick, G P, Chapter 8.5. In Selected Applications of
Nonlinear Programming. John Wiley and Sons, New York, 1968, pp. 90-92.
Keywords: nonlinear programming, maximum likelihood estimation, econometrics
$offText
Set
i 'observations' / 1*31 /
g 'groups' / one, two, three /;
Table data(*,i) 'systolic blood pressure data'
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
pressure 95 105 110 115 120 125 130 135 140 145 150 155 160 165 170
frequency 1 1 4 4 15 15 15 13 21 12 17 4 20 8 17
+ 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
pressure 175 180 185 190 195 200 205 210 215 220 225 230 235 240 245 260
frequency 8 6 6 7 4 3 3 8 1 6 0 5 1 7 1 2;
Parameter
y(i) 'pressure'
w(i) 'frequency weight'
c 'constant';
y(i) = data("pressure",i);
w(i) = data("frequency",i);
c = 1/sqrt(2*3.14159);
display y, w, c;
Positive Variable
p(g) 'proportion of population'
m(g) 'population mean'
s(g) 'population standard deviation';
Variable mlf 'maximum likelihood value';
Equation
like
pdef
rank;
like.. mlf =e= sum(i, w(i)*log(c*sum(g, p(g)/s(g)*exp(-.5*sqr((y(i)-m(g))/s(g))))));
pdef.. sum(g, p(g)) =e= 1;
rank(g+1).. m(g+1) =g= m(g);
Model
ml1 'maximum likelihood - ordered' / like, pdef, rank /
ml2 'maximum likelihood - unordered' / like, pdef /;
p.l(g) = 1/3;
m.l(g) = 100 + 30*ord(g); s.l(g) = 15;
p.lo(g) =.1;
s.lo(g) =.1;
* reported solution below gives a nonoptimal solution
* p.fx('one') = .365;
* p.fx('two') = .475;
* p.fx('three') = .160;
option domLim = 1e3;
ml1.workFactor = 1.5;
solve ml1 maximizing mlf using nlp;
```