```.-
help for ^prod^
.-

Calculating the product of observations
---------------------------------------

^^egen^^ newvar = ^prod(^expression^)^ [^if^ exp] [^in^ range]
[^, by(^grouping varlist^) pm^iss^(ignore|missing|1)^]

Description
-----------

^prod^ provides a multiplicative function for ^^egen^^ analogous to the
additive ^sum^ function.  The product of observations of <expression>
meeting optional ^in^ and ^if^ conditions is returned in <newvar>.
<expression> would most commonly be an existing variable in the data set.

Options
-------

^by(^grouping varlist^)^ specifies the variables defining groups within
which the products are calculated.

^pm^iss^(ignore|missing|1)^ specifies what is to be the product of a group
at least one of whose observations is missing.

^pm^iss^(ignore)^, the default, ignores missing values and returns the
product of all non-missing values in the group. If all values are
missing, then missing is returned.
^pm^iss^(missing)^ returns missing for the product of observations in
a group if any observation in the group is missing.
^pm^iss^(1)^ returns 1 for the product of observations in a group
if all observations in the group are missing. Otherwise it
returns the product of all non-missing values. This choice would
rarely be made (see Appendix in STB insert).

Examples
--------

^use^ testprod1
^list^
score      gvar1      gvar2
1.         3          1          1
2.         4          1          1
3.         5          1          1
4.         1          1          2
5.         2          1          2
6.        10          1          2
7.         4          2          1
8.         5          2          1
9.         6          2          1
10.        -3          2          2
11.        -1          3          1
12.        -3          3          1
13.         4          3          1
14.         2          3          2
15.         5          3          2
16.         0          4          1
17.       -23          4          2

^egen^ px = ^prod(^score^)^
^egen^ px0 = ^prod(^score^)^ ^if^ score != 0
^egen^ px1 = ^prod(^score^), by(^gvar1^)^
^egen^ px12 = ^prod(^score^), by(^gvar1 gvar2^)^
^list^

score   gvar1   gvar2    px            px0     px1   px12
1.      3       1       1     0     1192000000    1200     60
2.      4       1       1     0     1192000000    1200     60
3.      5       1       1     0     1192000000    1200     60
4.      1       1       2     0     1192000000    1200     20
5.      2       1       2     0     1192000000    1200     20
6.     10       1       2     0     1192000000    1200     20
7.      4       2       1     0     1192000000    -360    120
8.      5       2       1     0     1192000000    -360    120
9.      6       2       1     0     1192000000    -360    120
10.     -3       2       2     0     1192000000    -360     -3
11.     -1       3       1     0     1192000000     120     12
12.     -3       3       1     0     1192000000     120     12
13.      4       3       1     0     1192000000     120     12
14.      2       3       2     0     1192000000     120     10
15.      5       3       2     0     1192000000     120     10
16.      0       4       1     0              .       0      0
17.    -23       4       2     0     1192000000       0    -23

Note that a missing value is returned for observations excluded
by ^if^ or ^in^ qualifiers. (See, for example, obs 16 on px0.)

^use^ testprod2
^li^

score2      group
1.         4          1
2.         2          1
3.        12          1
4.       .25          1
5.         2          2
6.         3          2
7.         .          2
8.         .          3
9.         .          3

^egen^ newp = ^prod(^score2^)^, ^by(^group^)^
^egen^ newpi = ^prod(^score2^)^, ^by(^group^)^ ^pmiss(ignore)^
^egen^ newpm = ^prod(^score2^)^, ^by(^group^)^ ^pmiss(missing)^
^egen^ newp1 = ^prod(^score2^)^, ^by(^group^)^ ^pmiss(1)^
^li^

score2      group        newp       newpi       newpm       newp1
1.         4          1          24          24          24          24
2.         2          1          24          24          24          24
3.        12          1          24          24          24          24
4.       .25          1          24          24          24          24
5.         2          2           6           6           .           6
6.         3          2           6           6           .           6
7.         .          2           6           6           .           6
8.         .          3           .           .           .           1
9.         .          3           .           .           .           1

Author
------

Philip Ryan
Department of Public Health
South Australia

Acknowledgements
----------------

Michael Blasnik substantially enhanced the efficiency of the code.
Clyde Schechter suggested the option to specify that the product of
observations in the empty set should be 1.
Nick Cox and Tom Steichen provided helpful suggestions.
Contributors to the Stata List provided an interesting thread on
handling missing values.

Also see
--------

Manual:  [R] ^egen^
On-line:  help for ^egen^

```