**HP Prime: Gompertz Model**

The program GOMPERTZ fits the data {y_1, y_2, y_3, … , y_m }
to the curve:

**y = a*b^c^x**

where x = {0, 1, 2, 3, 4, … , m-1}. The program works best if the dimension
(size) of the data set is divisible by 3.
GOMPERTZ sorts the values into ascending order before calculation.

The results returned is a 3 x 1 matrix of the parameters: a,
b, and c.

GOMPERTZ estimates a, b, and c and runs through one iteration
to retrieve a better estimate, and may be modified by include additional
iterations should the user desire.

Process (in a nutshell):

1. Let y = list of
data to fit. Sort y to list all elements
in ascending order.

2. Let m =
size(y). Divide y into three equal-sized
sub-lists. For each sub-list, take the natural
logarithm of each element and add.
Hence:

n = m/3

s1 = Σ(ln y_k) for k=1 to n

s2 = Σ(ln y_k) for k=n+1 to 2n

s3 = Σ(ln y_k) for k=2n+1 to m

3. Calculate the
first estimate of a, b, and c:

c = ((s3 – s2)/(s2 –s1))^(1/n)

a = e^( 1/n * (s1 + (s2 – s1)/(1 – c^n))

b = e^( (s2 – s1)*(c – 1)/(1 – c^n)^2)

4. Create the matrix
v, where v = [[a],[b],[c]].

5. Develop the matrix
D and Y, where:

Each row of D consists of

[ b^c^I, b^c^I * a/b * c^I,
b^c^I * a/b * c^I * ln(b)* I]

And each row of Y consists of

[ y(I+1) – a*b^c^I ]

Where I = 0 to m-1

6. Calculate v’ by
setting v’ = (D^T*D)^-1 * D^T * Y.

7. Add v’ to v. v1 = v + v’.
The matrix v1 is the new estimate.

The equation is estimated to be: y ≈ a/100 * b^c^x

**HP Prime Program: GOMPERTZ**

EXPORT GOMPERTZ(yl)

BEGIN

LOCAL
y,m,n;

//
2nd STEP

y:=SORT(yl);

m:=SIZE(y);

n:=m/3;

LOCAL
y1:=SUB(y,1,n);

LOCAL
y2:=SUB(y,n+1,2*n);

LOCAL
y3:=SUB(y,2*n+1,m);

LOCAL
s1:=ΣLIST(LN(y1));

LOCAL
s2:=ΣLIST(LN(y2));

LOCAL
s3:=ΣLIST(LN(y3));

LOCAL
c:=((s3-s2)/(s2-s1))^(1/n);

LOCAL
b:=e^((s2-s1)*(c-1)/

(1-c^n)^2);

LOCAL
a:=e^(1/n*(s1+(s2-s1)/

(1-c^n)));

LOCAL
v:=[[a],[b],[c]];

//
Making dmat,ymat

LOCAL
dmat,ymat,I,k1,k2,k3,k4;

dmat:=[[0,0,0]];

ymat:=[[0]];

FOR
I FROM 0 TO m-1 DO

k1:=b^c^I;

k2:=k1*a/b*c^I;

k3:=k2*LN(b)*I;

k4:=y(I+1)-a*(b^c^I);

dmat:=ADDROW(dmat,[k1,k2,k3],

I+1);

ymat:=ADDROW(ymat,[k4],I+1);

END;

dmat:=DELROW(dmat,I+1);

ymat:=DELROW(ymat,I+1);

//
new param

LOCAL
vt:=(TRN(dmat)*dmat)*

TRN(dmat)*ymat;

LOCAL
v1:=v+vt;

RETURN
v1;

END;

**Example**

Data: {58, 66, 72.5, 78, 82, 85}

Result:

[[ 94.2216370902 ] , [ 0.615221033606 ] , [ 0.732101473203
]]

We can infer that curve is estimated to be:

y ≈ 94.2216370902 * 0.615221033606^0.732101473203^x

**Source**

ReliaWiki. “Gompertz
Models” http://reliawiki.org/index.php/Gompertz_Models Retrieved April 12, 2016

This blog is property of Edward Shore, 2016