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

st: RE: matrix programming problem


From   "Jiang, Tao" <TJiang@air.org>
To   "'statalist@hsphsun2.harvard.edu'" <statalist@hsphsun2.harvard.edu>
Subject   st: RE: matrix programming problem
Date   Fri, 22 Nov 2002 16:10:23 -0500

if you expand your matrix production, you can see that:

   M[i] =  A[i]*Sigma*A[i]'=(a,b\c,d), where for example,
a=(a11x1[i]+a12x2[i])x1[i]+(a12x1[i]+a22x2[i])x2[i]
so the determinant is ad-bc

so I'd do:
gen double a = (a11*x1+a12*x2)*x1+(a12*x1+a22*x2)*x2

do similar for b, c, and d

and then
gen double y = a*d-b*c

-----Original Message-----
From: Hung-Jen Wang [mailto:hjwang@econ.sinica.edu.tw]
Sent: Friday, November 22, 2002 12:49 PM
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