Stata The Stata listserver
[Date Prev][Date Next][Thread Prev][Thread Next][Date index][Thread index]

st: RE: matrix programming problem


From   "FEIVESON, ALAN H. (AL) (JSC-SD) (NASA)" <alan.h.feiveson@nasa.gov>
To   "'statalist@hsphsun2.harvard.edu'" <statalist@hsphsun2.harvard.edu>
Subject   st: RE: matrix programming problem
Date   Fri, 22 Nov 2002 15:01:22 -0600

Hung-Jen -

Since you onl y need the determinant of a 2 x 2 matrix, the fastest and
easiest way is to calculate it by hand. First, 

det(M) = det(A)*det(A)*det(Sigma). 

det(Sigma) = a11*a22-a12*a12
det(A) = x1*x3-x2*x2

Thus, (assuming the a's are stored as scalars or constant Stata variables)

gen d = (a11*a22-a12*a12)*(x1*x3-x2*x2)^2

should do the trick.

Al Feiveson



-----Original Message-----
From: Hung-Jen Wang [mailto:hjwang@econ.sinica.edu.tw]
Sent: Friday, November 22, 2002 11:49 AM
To: statalist@hsphsun2.harvard.edu
Subject: st: matrix programming problem


Hi,

Suppose I have a dataset of m observations and three
variables x1, x2, and x3. I need to create a new variable y
in such a way that, for each of the ith observation of y,
i=1,2,..m, the value of y[i] is the determinant of the
following 2x2 matrix M[i]:

   M[i] =  A[i]*Sigma*A[i]'
where

   A[i] is a 2x2 symmetric matrix taking values from x1 to x3:

       A[i]=  x1[i], x2[i]
              x2[i], x3[i]

   and Sigma is a 2x2 symmetric matrix of constant elements:

       Sigma = a11, a12
               a12, a22


My question: What is the most efficient way (fast code) to
do the calculation. I looked at -mat accum-, -mat glsaccm-,
and -mat vecaccum-, but do not see how they can be applied
here.

Currently, I loop over the observations to create the matrix
and the determinant. It is, however, quit slow. Any
suggestion that help speed up the computation will be
appreciated!

HJW
ps. matsize or computer memory will not be a constraint for me.

-------------- slow code begin ------

   mat Sigma = (2, 1 \ 1, 3) /* an arbitrary example */
   quie gen double y = .

   forvalues k = 1/n {  /* n is the total number of observations */

      mat Amat = (x1[`k'], x2[`k'] \ x2[`k'], x3[`k'])

      mat Mmat = Amat*Sigma*Amat   /* a 2x2 matrix */

      quie replace y = det(Mmat) in `k'/`k'

   }

-------------- slow code end -------

*
*   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/
*
*   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/



© Copyright 1996–2014 StataCorp LP   |   Terms of use   |   Privacy   |   Contact us   |   What's new   |   Site index