{smcl}
{* 29aug2003/21nov2004/14nov2005/11june2006}{...}
{hline}
help for {hi:makematrix}
{hline}

{title:Make a matrix of results from other commands}

{p 4 4 2}
Outline syntax:

{p 8 17 2}
{cmd:makematrix} [{it:matrix_name}] {cmd: ,}{break}
{cmd:from(}{it:results_list}{cmd:)} [{it:production_options}] [{it:list_options}] {cmd::}{break}
[{cmd:"}]{it:command}[{cmd:"}] [{it:varlist}] ... [, {it:options} ]

{p 4 4 2}
A matrix name {it:matrix_name} may be specified. If so, a matrix with
that name will be produced and remain in memory.

{p 4 4 2}{it:command} must be specified together with whatever elements
from [{it:varlist}] [{cmd:if} {it:exp}] [{cmd:in} {it:range}]
[{it:weight}] [, {it:options} ] are appropriate.

{p 4 4 2} 
Strictly, {it:command} is the first token following the colon {cmd::}. 
Hence bind commands specified by two or more words in double quotes. 
Thus if {it:command} were {cmd:run mydo.do}, specify it as 
{cmd:"run mydo.do"}. 


{title:Description}

{p 4 4 2}
{cmd:makematrix} runs {it:command} repeatedly for a specified variable
list (optionally, two variable lists) to produce a matrix of results. As
usual, a matrix could be a vector. The matrix will be listed using
{cmd:matrix list}, unless the {cmd:list} option is specified, in which
case it will be listed using the {cmd:list} command. 

{p 4 4 2} 
There are various modes of operation, which are best appreciated by
studying the detailed examples discussed in the next section.


{title:Remarks} 

{p 4 4 2}
First, some terminology. We call a Stata (statistical) command
essentially univariate if it requires only one variable; it may repeat
itself if supplied with two or more variables.  {cmd:summarize} is an
essentially univariate command; it does work for two or more variables,
by repeating its operation for those variables. We call such a command
essentially bivariate if it requires only two variables, and may repeat
itself otherwise.  {cmd:correlate} is an essentially bivariate command;
it does work for three or more variables, by repeating its operation for
pairs of those variables.  {cmd:spearman} is also an essentially
bivariate command, although it does not in fact accept more than two
variables. Finally, we call such a command essentially multivariate if
it produces just one set of results even if supplied with three or more
variables.  {cmd:regress} is an essentially multivariate command. From
now on the word "essentially" is not used, but should be understood. 

{p 4 4 2}
The output of {cmd:correlate} given a {it:varlist} of two or more
variables is a matrix of correlations for every pair of variables in
{it:varlist}. How could we produce an equivalent directly for 
{help spearman}? We need to find out that {cmd:spearman} leaves a correlation
behind in {cmd:r(rho)}: 

{p 4 8 2}{cmd:. makematrix, from(r(rho)) : spearman head trunk length displacement weight} 

{p 4 4 2}
The result is displayed using {cmd:matrix list} and we will normally
want to tidy up the presentation, say by

{p 4 8 2}{cmd:. makematrix, from(r(rho)) format(%4.3f) : spearman head trunk length displacement weight} 

{p 4 4 2}
However, let us leave these details of presentation on one side. In this
case, given a bivariate command, and a {it:varlist}, and a single result
from which to compile the matrix, {cmd:makematrix} takes each pair of
variables from {it:varlist}, runs a bivariate command for that pair, and
puts a single result in the cell defined by each pair of variables. So
both rows and columns are specified by {it:varlist}.

{p 4 4 2}
Alternatively, we might want different sets of variables on the rows and
the columns, perhaps specifying a submatrix of the full matrix.  The
option {cmd:cols()} can be used to specify variables to appear as
columns. The variables in the {it:varlist} of {it:command} will then
appear as rows.  Say we did a principal component analysis of five
variables and followed with calculation of scores:

{p 4 8 2}{cmd:. pca head trunk length displacement weight}{p_end}
{p 4 8 2}{cmd:. score score1-score5}{p_end}
{p 4 8 2}{cmd:. makematrix, from(r(rho)) cols(score?) : correlate head trunk length displacement weight}

{p 4 4 2}Here the full correlation matrix of variables and scores, 
as would be produced by {cmd:correlate}, is 10 X 10, and the submatrix 
produced by {cmd:makematrix} is only 5 X 5. 

{p 4 4 2}We can show two or more scalar results from each command run. 
This is possible in various ways. A univariate command can be repeated, 
each time yielding two or more scalars: 

{p 4 8 2}{cmd:. makematrix, from(r(mean) r(sd) r(skewness)) : su}
{cmd:head trunk length displacement weight, detail}

{p 4 4 2} {cmd:makematrix} reasons in this way: The user wants three
scalars, which I will show in three columns. So I must run the command
specified in turn on each variable supplied, which I will show on the
rows. So  for each variable in {it:varlist}, {cmd:makematrix} runs a
univariate command, and puts two or more scalars in the cells of each
row.   

{p 4 4 2} A bivariate command can be repeated, each time yielding two or
more scalars: 

{p 4 8 2}
{cmd:. makematrix, from(r(rho) r(p)) lhs(rep78-foreign) : spearman mpg} 

{p 4 4 2}
{cmd:makematrix} reasons in this way: The user wants two scalars, which
I will show in two columns. So I must run the command specified in turn
on the variable supplied. The option {cmd:lhs()} is also specified, so
that must be used to supply the other variable. Whenever {cmd:lhs()} is
specified, it specifies the rows of the matrix.  That is, in this case,
the rows show the results of {cmd:spearman rep78 mpg} ... 
{cmd:spearman foreign mpg}. Notice how the variables specified in {cmd:lhs()} 
appear on the {cmdab:l:}eft-{cmdab:h:}and {cmdab:s:}ide of the {it:varlist} which
{cmd:spearman} runs.  ({cmd:lhs()} also names the left-hand side of the
matrix, but that is a happy accident.) This is also allowed: 

{p 4 8 2}
{cmd:. makematrix, from(r(rho) r(p)) rhs(rep78-foreign) : spearman mpg} 

{p 4 4 2} 
In this case, the rows show the results of {cmd:spearman mpg rep78} ...
{cmd:spearman mpg foreign}, and are exactly the same as in the previous
example. Again, whenever {cmd:rhs()} is specified, it specifies the rows
of the matrix.  Notice how the variables specified in {cmd:rhs()} appear
on the {cmdab:r:}ight-{cmdab:h:}and {cmdab:s:}ide of the {it:varlist} which
{cmd:spearman} runs.  (By a small stretch, you can also think of it as
naming the right-hand side of the matrix, given that we could repeat the
row names on that side.) In other cases, which is used may well matter: 

{p 4 8 2}
{cmd:. makematrix, from(e(r2) e(rmse) _b[_cons] _b[mpg]) lhs(rep78-foreign) : regress mpg} 

{p 4 8 2}
{cmd:. makematrix, from(e(r2) e(rmse) _b[_cons] _b) rhs(rep78-foreign) : regress mpg} 

{p 4 4 2} 
The first series of regressions predicts {cmd:rep78} ... {cmd:foreign}
in turn from {cmd:mpg}. The second series predicts {cmd:mpg} from
{cmd:rep78} ...  {cmd:foreign} in turn. The r-square results will be the
same, but not the root mean square errors, or the intercepts or slopes. 
Note that {cmd:_b} by itself has the interpretation of {cmd:_b[}{it:row_variable}{cmd:]}. 

{p 4 4 2} 
In fact {cmd:lhs()} and {cmd:rhs()} can be used to produce a series of
multivariate results. Suppose we have {cmd:weightsq = weight^2}. 

{p 4 8 2}
{cmd:. makematrix, from(e(r2) e(rmse)) lhs(mpg-trunk length-foreign) :}
{cmd:regress weight weightsq}

{p 4 4 2} 
This series predicts {cmd:mpg} ... {cmd:foreign} in turn from
{cmd:weight} and {cmd:weightsq}. When either {cmd:lhs()} or {cmd:rhs()}
is specified they define the varying rows, while the {it:varlist}
supplied is fixed for each run of {it:command}. 

{p 4 4 2}
There is one more nuance to be explained. Say you want a table of sums
for a set of variables. You might try 

{p 4 8 2}{cmd:. makematrix, from(r(sum)): su head trunk length displacement weight, meanonly} 

{p 4 4 2}However, {cmd:makematrix} cannot distinguish between this and a
similar problem with a bivariate command, so it will attempt to run
{cmd:summarize} on all distinct pairs of variables. This will succeed,
except that what is left behind in {cmd:r(sum)} will be the sum of the
second of each pair of variables. What you will prefer is a
{cmd:vector}, and that is the option to specify: 

{p 4 8 2}{cmd:. makematrix, from(r(sum)) vector: su head trunk length displacement weight, meanonly} 


{title:Options}

{p 4 4 2} 
{cmd:from(}{it:results_list}{cmd:)} is required. The {it:results_list}
may in particular contain names of e-class results containing scalars
(such as {cmd:e(rmse)}); names of r-class results containing scalars
(such as {cmd:r(rho)}); estimates of intercepts, slopes or standard
errors such as {cmd:_b[_cons]}, {cmd:_b[mpg]} or {cmd:_se[mpg]}; or
names of globals (such as {cmd:S_1}).  Do not prefix global names with
{cmd:$}. {cmd:_b} or {cmd:_se} by itself has the interpretation of
{cmd:_b[}{it:row_variable}{cmd:]} or {cmd:_se[}{it:row_variable}{cmd:]}.
Expressions such as {cmd:r(rho)^2} or {cmd:log10(r(p))} are also allowed. 
However, note that no spaces must occur within any individual expression
and that the more complicated the expression you use, the more likely 
it is that it will not be acceptable as a matrix column name. 

{p 4 4 2} 
{it:production_options} are

{p 8 8 2}{cmd:cols(}{it:column_varlist}{cmd:)} specifies a list of
variables to appear on the columns of the matrix. ({it:varlist} then
defines the rows only.}

{p 8 8 2}{cmd:lhs(}{it:lhs_varlist}{cmd:)} specifies a list of variables
to appear on the left-hand side of the variable list supplied to
{it:command}. These will appear on the rows of the matrix. (The list of
results in {cmd:from()} then defines the columns of the matrix.)

{p 8 8 2}{cmd:rhs(}{it:rhs_varlist}{cmd:)} specifies a list of variables
to appear on the right-hand side of the variable list supplied to
{it:command}. These will appear on the rows of the matrix. (The list of
results in {cmd:from()} then defines the columns of the matrix.)  

{p 8 8 2}{cmd:vector} specifies that the results are to be compiled as a
single vector. This option is necessary when, and only when, (1) there
is a single result in {cmd:from()}; (2) there is no {cmd:cols()},
{cmd:lhs()} or {cmd:rhs()}; (3) {it:command} is a univariate command.
Without {cmd:vector}, {cmd:makematrix} would otherwise attempt to treat
{it:command} as a bivariate command and carry out calculations for all
pairs of variables.

{p 8 8 2}Only one of {cmd:cols()}, {cmd:lhs()}, {cmd:rhs()} and
{cmd:vector} may be specified.

{p 8 8 2}{cmd:listwise} specifies that the results of {it:cmd} should be
determined for as many observations as possible.  Note that as a
consequence the number of observations used in each calculation may
differ. By default casewise deletion is used to ensure consistency in
observations selected.

{p 4 4 2}{it:list_options} control the presentation of the matrix.

{p 8 8 2}{cmd:list} specifies that the {help list} command be used to
present the matrix. 

{p 8 8 2}{cmdab:la:bel} specifies that an attempt be made to show variable
labels wherever variables specify the rows of the matrix. Unless the
{cmd:list} option is also specified, variable labels longer than 32
characters will not be shown and periods which {cmd:matrix list} does
not construe as time series operators will be suppressed.

{p 8 8 2}{cmdab:f:ormat(}{it:format}{cmd:)} specifies the format to be
used for columns with {cmd:list}. As an extension of standard format
options, multiple formats may be specified, one for each column.
For example, {cmd:format(%3.2f %4.3f %5.4f)} specifies that 
the columns of the matrix have the specified formats. 

{p 8 8 2}{cmd:dp(}{it:#} [ {it:#} [  ... ] ]{cmd:)} is an alternative
to {cmd:format()} and specifies the number of decimal places to be shown
with {cmd:list}. Note that, for example, {cmd:dp(2 3 4)} is equivalent
to {cmd:format(%3.2f %4.3f %5.4f)}.

{p 8 8 2}{cmdab:right:justify} specifies that row names are to be shown
right-justified with {cmd:list}. The default is to present them
left-justified. 

{p 8 8 2}Other options may be specified that are options of {cmd:list}
if the {cmd:list} option is specified or of {cmd:matrix list} otherwise.


{title:Examples} 

{p 4 8 2}{cmd:. sysuse auto, clear }

{p 4 8 2}{cmd:. makematrix, from(r(rho)) : spearman head trunk length displacement weight}{p_end}
{p 4 8 2}{cmd:. makematrix, from(r(rho)) format(%4.3f) : spearman head trunk length displacement weight}

{p 4 8 2}{cmd:. pca head trunk length displacement weight}{p_end}
{p 4 8 2}{cmd:. score score1-score5}{p_end}
{p 4 8 2}{cmd:. makematrix, from(r(rho)) cols(score?) : correlate head trunk length displacement weight}{p_end}
{p 4 8 2}{cmd:. makematrix R, from(r(rho)) cols(score?) : correlate head trunk length displacement weight}{p_end}
{p 4 8 2}{cmd:. matrix colnames R = "score 1" "score 2" "score 3" "score 4" "score 5"}{p_end}
{p 4 8 2}{cmd:. matrix li R, format(%4.3f)}

{p 4 8 2}{cmd:. makematrix , from(r(rho) r(p)) label cols(price) : spearman mpg-foreign}{p_end}
{p 4 8 2}{cmd:. makematrix , from(r(rho) r(p)) list label format(%4.3f %6.5f) sep(0) cols(price) : spearman mpg-foreign}

{p 4 8 2}{cmd:. makematrix, from(r(mean) r(sd) r(skewness)) : su head trunk length displacement weight, detail}{p_end}
{p 4 8 2}{cmd:. makematrix, from(r(mean) r(sd) r(skewness)) list format(%2.1f %2.1f %4.3f) sep(0) : su head trunk length displacement weight, detail}

{p 4 8 2}{cmd:. makematrix, from(r(rho) r(p)) lhs(rep78-foreign) : spearman mpg}{p_end}
{p 4 8 2}{cmd:. makematrix, from(r(rho) r(p)) rhs(rep78-foreign) : spearman mpg}{p_end}
{p 4 8 2}{cmd:. makematrix, from(e(r2) e(rmse) _b[_cons] _b[mpg]) lhs(rep78-foreign) : regress mpg}{p_end}
{p 4 8 2}{cmd:. makematrix, from(e(r2) e(rmse) _b[_cons] _b[mpg]) lhs(rep78-foreign) list dp(3 2 2 3) abb(9) sep(0) divider : regress mpg}{p_end}
{p 4 8 2}{cmd:. makematrix, from(e(r2) e(rmse) _b[_cons] _b) rhs(rep78-foreign) : regress mpg}{p_end}
{p 4 8 2}{cmd:. makematrix, from(e(r2) e(rmse) _b[_cons] _b) rhs(rep78-foreign) list dp(3 2 2 3) abb(9) sep(0) divider : regress mpg}

{p 4 8 2}{cmd:. gen weightsq = weight^2}{p_end}
{p 4 8 2}{cmd:. makematrix, from(e(r2) e(rmse)) lhs(mpg-trunk length-foreign) : regress weight weightsq}{p_end}
{p 4 8 2}{cmd:. makematrix, from(e(r2) e(rmse)) lhs(mpg-trunk length-foreign) list dp(3 2) sep(0) divider : regress weight weightsq}

{p 4 8 2}{cmd:. makematrix, from(r(sum)) vector: su head trunk length displacement weight, meanonly}{p_end}


{title:Author}

{p 4 4 2}Nicholas J. Cox, Durham University, U.K.{break} 
n.j.cox@durham.ac.uk


{title:Acknowledgments}

{p 4 4 2}Ken Higbee made valuable comments on this help file.  
Eric Uslaner pointed towards a bug. Herv{c e'} Stolowy pointed towards 
another bug, and Alan Riley explained it. Lisa Gilmore alerted me
to a problem with handling double quotes. 


{title:Also see}

{p 4 13 2}On-line:  help for {help list}, {help matutil:matrix list};
                             {help statsby}, {help tabstat}

