Fellow Statalisters (especially StataCorp):
I have a query about Stata matrices (as distinct from Mata matrices). In
some of my programs, I store confidence intervals in Stata matrices with
1 row per confidence interval and columns containing the point
estimates, the lower limits and the upper limits. Sometimes, confidence
limits should be plus or minus infinity (eg the Clopper-Pearson CI for
the log odds, the Mehta CI for the log odds ratio, the Hodges-Lehmann
median difference). In a previous discussion with Nick Cox and Bill
Gould in the Stata 6 era, I was advised to use very high-magnitude
numbers (+1e+300 or -1e+300) to represent infinite confidence limits.
Under Stata 9, we presumably might prefer to use plus or minus
c(maxdouble), which is approximately 8.99e+307 in my Stata. These can be
inserted into Stata matrices, as in the following example (in the
2006/01/20 version of Stata 9.1 under Windows XP):
. matr list matti
matti[3,3]
c1 c2 c3
r1 1 2 3
r2 4 5 6
r3 7 8 9
. matr def matti[3,3]=c(maxdouble)
. matr list matti
matti[3,3]
c1 c2 c3
r1 1 2 3
r2 4 5 6
r3 7 8 8.99e+307
However, last night, I discovered an unexpected feature of Stata
matrices, using the following example:
. matr def matti=(1,2\3,4)
. matr list matti
matti[2,2]
c1 c2
r1 1 2
r2 3 4
. matr def matti[2,2]=c(maxdouble)
. matr list matti
symmetric matti[2,2]
c1 c2
r1 1
r2 3 8.99e+307
Note that, when I try to change one entry of the matrix matti, Stata
appears to note that the matrix is square and to do some kind of
unsolicited approximate-symmetry test, find the matrix to be
approximately symmetric, and then replace it with something exactly
symmetric in order to save space. The same thing happens when I use the
old Stata 6 magic number instead of the new Stata 9 magic number:
. matr def matti=(1,2\3,4)
. matr list matti
matti[2,2]
c1 c2
r1 1 2
r2 3 4
. matr def matti[2,2]=1e+300
. matr list matti
symmetric matti[2,2]
c1 c2
r1 1
r2 3 1.00e+300
This feature has got me worried. Unsurprisingly, it does not seem to be
found in Mata matrices, but reappears once the Mata matrix is converted
into a Stata matrix. The following example illustrates this feature:
. mata: mitzi=(1,2\3,4)
. mata:mitzi
1 2
+---------+
1 | 1 2 |
2 | 3 4 |
+---------+
. mata: maggi=st_numscalar("c(maxdouble)")
. mata:maggi
8.9885e+307
. mata:mitzi[2,2]=maggi
. mata:mitzi
1 2
+-----------------------------+
1 | 1 2 |
2 | 3 8.9885e+307 |
+-----------------------------+
. mata:st_matrix("muttli",mitzi)
. matr list muttli
symmetric muttli[2,2]
c1 c2
r1 1
r2 3 8.99e+307
An obvious fix to this feature is to represent infinite confidence
limits using Stata missing values, which seem to be allowed in Stata
matrices in Stata 9. We might use .a to represent minus infinity and .z
to represent plus infinity. The following example demonstrates Stata
missing values in Stata matrices:
. matr def matti=(2,1,3\5,4,6\8,7,9)
. matr list matti
matti[3,3]
c1 c2 c3
r1 2 1 3
r2 5 4 6
r3 8 7 9
. matr def matti[2,2]=.a
. matr def matti[3,3]=.z
. matr list matti
matti[3,3]
c1 c2 c3
r1 2 1 3
r2 5 .a 6
r3 8 7 .z
This might be the best solution to the immediate problem. However, these
unsolicited symmetry checks seem to raise a more general issue, namely
whether we should use Stata matrices in programs to store arbitrary
arrays of double-precision numbers, unless we know that these arrays of
numbers can never be square. For instance, I might want a Stata program
to pass an array of numbers as an option, or an argument, to another
Stata program. In these circumstances, is it safer to use Mata matrices
rather than Stata matrices? And would it be a good idea to rewrite the
Stata programs as Mata programs? (I note that Mata programs can call
Stata programs, as well as vice versa - see [M-5] stata().)
Best wishes (and thanks in advance)
Roger
Roger Newson
Lecturer in Medical Statistics
POSTAL ADDRESS:
Respiratory Epidemiology and Public Health Group
National Heart and Lung Institute at Imperial College London
St Mary's Campus
Norfolk Place
London W2 1PG
STREET ADDRESS:
Respiratory Epidemiology and Public Health Group
National Heart and Lung Institute at Imperial College London
47 Praed Street
Paddington
London W1 1NR
TELEPHONE: (+44) 020 7594 0939
FAX: (+44) 020 7594 0942
EMAIL: [email protected]
WEBSITE: http://www.kcl-phs.org.uk/rogernewson/
Opinions expressed are those of the author, not of the institution.
*
* For searches and help try:
* http://www.stata.com/support/faqs/res/findit.html
* http://www.stata.com/support/statalist/faq
* http://www.ats.ucla.edu/stat/stata/