Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.

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

 From Antoine Terracol To statalist@hsphsun2.harvard.edu Subject Re: st: Guidance on matrix inversion for OLS in mata Date Tue, 27 Apr 2010 18:29:09 +0200

```Hi Thomas,

have a look at cross() in the mata help files.

invsym(cross(X,X)) produces (X'X)^-1

Antoine

On 27/04/2010 18:17, Thomas Jacobs wrote:
```
```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/

```
```
--
Ce message a ete verifie par MailScanner
pour des virus ou des polluriels et rien de
suspect n'a ete trouve.

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