Bookmark and Share

Notice: On March 31, it was announced that Statalist is moving from an email list to a forum. The old list will shut down at the end of May, and its replacement, statalist.org is already up and running.


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: st: Guidance on matrix inversion for OLS in mata


From   Thomas Jacobs <thomasjacobs@gmail.com>
To   statalist@hsphsun2.harvard.edu
Subject   Re: st: Guidance on matrix inversion for OLS in mata
Date   Tue, 27 Apr 2010 11:17:41 -0500

Austin,

Thanks for the reply.  I guess I have no choice but to do as you
suggest or else rewrite the program entirely in Stata.  I don't have
the days it always takes me to decipher how to do the stata mata data
transfer for this project at present.  Every time I sit down to do
something like this I always feel it a roll of the dice.  Do I go the
mata route and discover what should have been done in stata or go the
stata route and discover the opposite!

Here is a short excerpt of the problem.  I am simply trying to compute
x'x inverse for a 100 trading day time series of index returns and use
it to solve for betahat for a similar time series of firm returns
where the latter often has one or more missing values.

Here are the initial steps I take in mata and will use an example with
no missing values:

X=J(100,2,1)
X[.,2]=LnBAATreasSprd[800::899]
: X
                    1              2
      +-------------------------------+
    1 |             1    -.005838091  |
    2 |             1   -.0063325767  |
    3 |             1    .0100309728  |
    4 |             1    .0040479107  |
    5 |             1     .000136131  |
    6 |             1      .00040839  |
    7 |             1   -.0148075884  |
    8 |             1   -.0107393684  |
    9 |             1    -.002842935  |
   10 |             1    .0066983248  |
   11 |             1   -.0093153818  |
   12 |             1   -.0502348617  |
   13 |             1   -.0178726967  |
   14 |             1    .0145704737  |
   15 |             1   -.0073333359  |
   16 |             1   -.0029384219  |
   17 |             1   -.0095219389  |
   18 |             1   -.0128216762  |
   19 |             1   -.0150571838  |
   20 |             1     .005833914  |
   21 |             1    .0069765295  |
   22 |             1    .0038266596  |
   23 |             1   -.0067447214  |
   24 |             1   -.0082368711  |
   25 |             1    .0079292208  |
   26 |             1   -.0185827948  |
   27 |             1   -.0081839114  |
   28 |             1    .0103758555  |
   29 |             1    -.007115229  |
   30 |             1   -.0043146866  |
   31 |             1    .0007379653  |
   32 |             1   -.0010016384  |
   33 |             1    .0068858997  |
   34 |             1   -.0044625248  |
   35 |             1    .0031520503  |
   36 |             1   -.0554844476  |
   37 |             1    .0113020828  |
   38 |             1    .0031746107  |
   39 |             1    .0117888227  |
   40 |             1   -.0010267079  |
   41 |             1    .0095236665  |
   42 |             1    .0261100251  |
   43 |             1   -.0126527818  |
   44 |             1   -.0114778923  |
   45 |             1    .0066052717  |
   46 |             1   -.0084775724  |
   47 |             1   -.0032715374  |
   48 |             1   -.0015591006  |
   49 |             1    .0142634539  |
   50 |             1    .0003712231  |
   51 |             1   -.0077179475  |
   52 |             1    .0082479911  |
   53 |             1    .0071813553  |
   54 |             1    .0058756177  |
   55 |             1   -.0082988022  |
   56 |             1   -.0003692649  |
   57 |             1   -.0046538925  |
   58 |             1   -.0049419519  |
   59 |             1    .0040403828  |
   60 |             1   -.0099174296  |
   61 |             1    .0231989622  |
   62 |             1   -.0097859399  |
   63 |             1   -.0028060512  |
   64 |             1   -.0028140107  |
   65 |             1    .0092088645  |
   66 |             1    .0032609063  |
   67 |             1    .0080019441  |
   68 |             1    .0002604046  |
   69 |             1    .0027563504  |
   70 |             1   -.0134371053  |
   71 |             1    .0051452187  |
   72 |             1    .0188821666  |
   73 |             1    .0129679879  |
   74 |             1    .0097926175  |
   75 |             1    .0015559109  |
   76 |             1   -.0006521898  |
   77 |             1    .0055551799  |
   78 |             1    .0016954662  |
   79 |             1              0  |
   80 |             1   -.0011965502  |
   81 |             1   -.0123975417  |
   82 |             1    .0008581794  |
   83 |             1    .0113398973  |
   84 |             1   -.0044504236  |
   85 |             1   -.0101748193  |
   86 |             1    .0006073291  |
   87 |             1    .0028294155  |
   88 |             1   -.0016158026  |
   89 |             1    -.009393123  |
   90 |             1   -.0073215333  |
   91 |             1    .0056367237  |
   92 |             1   -.0044041635  |
   93 |             1    .0046085101  |
   94 |             1    .0162160564  |
   95 |             1    .0047139199  |
   96 |             1   -.0005505134  |
   97 |             1    .0033981025  |
   98 |             1     .034180887  |
   99 |             1   -.0102245966  |
  100 |             1   -.0060580331  |
      +-------------------------------+

and the inverse step with a partial excerpt (all values are zero save
for three cells):
: invsym(X*X')
[symmetric]
                    1              2              3              4
         5
      +----------------------------------------------------------------------------
    1 |             0
    2 |             0              0
    3 |             0              0              0
    4 |             0              0              0              0
    5 |             0              0              0              0
         0
    6 |             0              0              0              0
         0
    7 |             0              0              0              0
         0
    8 |             0              0              0              0
         0
    9 |             0              0              0              0
         0
   10 |             0              0              0              0
         0
   11 |             0              0              0              0
         0
   12 |             0              0              0              0
         0
   13 |             0              0              0              0
         0
   14 |             0              0              0              0
         0
   15 |             0              0              0              0
         0
   16 |             0              0              0              0
         0
   17 |             0              0              0              0
         0
   18 |             0              0              0              0
         0
   19 |             0              0              0              0
         0
   20 |             0              0              0              0
         0
   21 |             0              0              0              0
         0
   22 |             0              0              0              0
         0
   23 |             0              0              0              0
         0
   24 |             0              0              0              0
         0
   25 |             0              0              0              0
         0
   26 |             0              0              0              0
         0
   27 |             0              0              0              0
         0
   28 |             0              0              0              0
         0
   29 |             0              0              0              0
         0
   30 |             0              0              0              0
         0
   31 |             0              0              0              0
         0
   32 |             0              0              0              0
         0
   33 |             0              0              0              0
         0
   34 |             0              0              0              0
         0
   35 |             0              0              0              0
         0
   36 |             0              0              0              0
         0
   37 |             0              0              0              0
         0
   38 |             0              0              0              0
         0
   39 |             0              0              0              0
         0
   40 |             0              0              0              0
         0

qrinv gives something similar with a few more non-zero values while
cholinv and luinv produce nulls.  pinv does work in this case.
Suffice it to say I have no problem regressing a similar single firm
return series on this index for the time period in question using
regress.

If I am missing something, please let me know.  Otherwise, I guess I
need to go to stata or do a better job of reproducing regress!  Thanks
again.

Tom
On Tue, Apr 27, 2010 at 10:23 AM, Austin Nichols
<austinnichols@gmail.com> wrote:
>
> Thomas Jacobs <thomasjacobs@gmail.com>:
> Zero is not a problem, but you should expunge the missings first;
> however you seem to be trying to rewrite -regress- as you go, which is
> far from a good idea. Why *not* export your vectors to Stata and run
> -regress- and let Stata handle the sample selection and matrix
> inversion for you?
>
> Maybe if you give us a simple example with real numbers, the problem
> will be clearer and you can get better guidance...
>
> On Tue, Apr 27, 2010 at 12:45 AM, Thomas Jacobs <thomasjacobs@gmail.com> wrote:
> > Hi,
> >
> > I am trying to perform a lengthy series of simulations to examine some
> > event study methodologies.  I have moved to mata for the bulk of the
> > work but find that for those cases where I wish to use a market model
> > approach requiring an OLS regression to establish abnormal returns I
> > am unable to generate an inverse for x'x in seeking to solve for beta
> > hat.  I am typically working with vectors that have 1. missing values,
> > 2. zero values, and 3. very small values close to zero (within a
> > couple of decimal places such as -.01 or .005).  I have tried mata's
> > cholinv, invsym, pinv, luinv, and qrinv (I realize that some of these
> > are probably inappropriate for my problem but I am no expert) and
> > generally get an inverse matrix of missing values or bizarre results
> > like a single populated row.
> >
> > I would prefer not to go back and forth between stata and mata to use
> > the stata regress function unless that is the only way to accomplish
> > this effort.
> >
> > Can anyone offer general guidance on how to proceed here?  Thanks.
> >
> > Tom
>
> *
> *   For searches and help try:
> *   http://www.stata.com/help.cgi?search
> *   http://www.stata.com/support/statalist/faq
> *   http://www.ats.ucla.edu/stat/stata/



--
Thomas Jacobs

*
*   For searches and help try:
*   http://www.stata.com/help.cgi?search
*   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   |   Site index