Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: st: Using a loop to calculate vector differences
From 
 
"Heidi M Pitts" <[email protected]> 
To 
 
[email protected] 
Subject 
 
Re: st: Using a loop to calculate vector differences 
Date 
 
Fri, 21 Sep 2012 09:12:26 -0600 
Thank you very much.  I will try both suggestions.
Many thanks.
Heidi
On Fri, 21 Sep 2012 00:59:15 +0100
 Nick Cox <[email protected]> wrote:
As you want to use Stata's matrix language, a program 
-matgop-
published in 1999 is a direct solution. See dm69 and as 
context a
prequel and a sequel.
STB-56  dm79  . . . . . . . . . . . . . . . . . . Yet 
more new matrix commands
       (help matcorr, matewmf, matvsort, svmat2 if 
installed)  . .  N. J. Cox
       7/00    pp.4--8; STB Reprints Vol 10, pp.17--23
       commands to produce a correlation matrix, 
elementwise monadic
       function of another matrix, selected subsets of 
matrix rows
       and columns, vec or vech of a matrix, elements 
sorted within
       a vector, matrix from a vector, and commands to 
save matrices
       see mata matrix language incorporated into Stata 
9.0
STB-50  dm69  . . . . . . . . . . . . . . . . . . 
Further new matrix commands
       (help matdelrc, matewm, matmad, matpow if 
installed)  . . .  N. J. Cox
       7/99    pp.5--9; STB Reprints Vol 9, pp.29--34
       collection of new matrix commands providing 
additional matrix
       checking, management, element-wise operators, 
maximum absolute
       difference, and power
STB-39  dm49  . . . . . . . . . . . . . . . . . . . . 
Some new matrix commands
       (help matfunc, varfunc if installed)  . . . . . . 
. . . . .  J. Weesie
       9/97    pp.17--20; STB Reprints Vol 7, pp.43--48
       collection of new matrix commands; several for 
explicit matrices
       and a few for implicit matrices (i.e., variables)
       see mata matrix language incorporated into Stata 
9
You can get clickable links to install by typing
. search matrix, historical stb
The code could be
. mat M=[0, 0, 0, 0, 0, 0, 0, .1, .4, .4, .1]'
. mat F=[0, 0, 0, 0, 0, .05, .3, .6, .05, 0, 0]
. matgop M F diff, op(-)
diff[11,11]
        c1      c2      c3      c4      c5      c6 
    c7      c8
 c9     c10     c11
r1   0.000   0.000   0.000   0.000   0.000  -0.050 
-0.300  -0.600
-0.050   0.000   0.000
r2   0.000   0.000   0.000   0.000   0.000  -0.050 
-0.300  -0.600
-0.050   0.000   0.000
r3   0.000   0.000   0.000   0.000   0.000  -0.050 
-0.300  -0.600
-0.050   0.000   0.000
r4   0.000   0.000   0.000   0.000   0.000  -0.050 
-0.300  -0.600
-0.050   0.000   0.000
r5   0.000   0.000   0.000   0.000   0.000  -0.050 
-0.300  -0.600
-0.050   0.000   0.000
r6   0.000   0.000   0.000   0.000   0.000  -0.050 
-0.300  -0.600
-0.050   0.000   0.000
r7   0.000   0.000   0.000   0.000   0.000  -0.050 
-0.300  -0.600
-0.050   0.000   0.000
r8   0.100   0.100   0.100   0.100   0.100   0.050 
-0.200  -0.500
0.050   0.100   0.100
r9   0.400   0.400   0.400   0.400   0.400   0.350 
 0.100  -0.200
0.350   0.400   0.400
r10   0.400   0.400   0.400   0.400   0.400   0.350 
 0.100  -0.200
0.350   0.400   0.400
r11   0.100   0.100   0.100   0.100   0.100   0.050 
-0.200  -0.500
0.050   0.100   0.100
Here -...gop- is generalized outer product, and the 
generalisation
inspired by APL
http://en.wikipedia.org/wiki/APL_(programming_language)
is to allow binary operators other than multiplication.
In your code you loop around
gen y=x_male`i'-y_female
and when the macro `i' is 1 this becomes
gen y = x_male1 - y_female
and -- as Stata does tell you -- it can't find -x_male1- 
(which in
this context can _only_ be a variable with that name or 
failing that a
scalar with that name). You want the first element of 
the Stata vector
-x_male- which would be -x_male[1,1]-. So, the problem 
is that
-x_male1- doesn't exist, not that it is something other 
than what you
want.
If that bug were fixed, there is another in the loop: 
second time
around the loop the -generate- statement would fail as 
-y- already
exists.
Your code shows other problems, as you appear to want to 
store a
matrix in the variable -diff-.
All that said, my reference to -matgop- is largely just 
parental
indulgence. It's best just to use some Mata:
mata :
M= (0, 0, 0, 0, 0, 0, 0, .1, .4, .4, .1)'
F= (0, 0, 0, 0, 0, .05, .3, .6, .05, 0, 0)
len = length(F)
diff = J(0, len, .)
for(j = 1; j <= len; j++) {
       diff = diff \ (M[j] :- F)
}
diff
          1      2      3      4      5      6      7 
    8      9
 10     11
    +------------------------------------------------------------------------------+
  1 |     0      0      0      0      0   -.05    -.3 
  -.6   -.05
  0      0  |
  2 |     0      0      0      0      0   -.05    -.3 
  -.6   -.05
  0      0  |
  3 |     0      0      0      0      0   -.05    -.3 
  -.6   -.05
  0      0  |
  4 |     0      0      0      0      0   -.05    -.3 
  -.6   -.05
  0      0  |
  5 |     0      0      0      0      0   -.05    -.3 
  -.6   -.05
  0      0  |
  6 |     0      0      0      0      0   -.05    -.3 
  -.6   -.05
  0      0  |
  7 |     0      0      0      0      0   -.05    -.3 
  -.6   -.05
  0      0  |
  8 |    .1     .1     .1     .1     .1    .05    -.2 
  -.5    .05
 .1     .1  |
  9 |    .4     .4     .4     .4     .4    .35     .1 
  -.2    .35
 .4     .4  |
 10 |    .4     .4     .4     .4     .4    .35     .1 
  -.2    .35
 .4     .4  |
 11 |    .1     .1     .1     .1     .1    .05    -.2 
  -.5    .05
 .1     .1  |
    +------------------------------------------------------------------------------+
Nick
On Thu, Sep 20, 2012 at 10:45 PM, Heidi M Pitts 
<[email protected]> wrote:
Can anyone help fix my code for the following issue:
I have two vectors:
M=[0, 0, 0, 0, 0, 0, 0, .1, .4, .4, .1]
F=[0, 0, 0, 0, 0, .05, .3, .6, .05, 0, 0]
so n=11 obs for each vector.
I?m trying to calculate the vector difference between 
each element `i? in M
and the whole vector F.    So the first vector of 
differences would be [M1=0
minus 0,0,0,0,0,.05,.3,.6,.05,0,0].  Then I would 
calculate a second set of
differences, M2=0 - same F vector, and stack it under 
the diff vector.
I have written a simple loop to calculate each 
difference. But the error
message I get is: ?x_male1 not found?. Seems that my 
code is not recognizing
that I want the first element of M to subtract each 
element of F and
populate the vector ?diff?.  Can anyone help?  Seems 
that the first issue is
that ?x_male1? is not equal to 0, the first element in 
the vector.
/************  program to calculate difference of
distributions***************/
set matsize 100
mkmat x_male
mkmat y_female
mkmat y_fem_inv
set obs 11
gen n=_n
gen diff=.
mkmat diff
forvalues i=1(1)11 {
        gen y=x_male`i'-y_female
        replace diff=y if `i'< n
}
*
*   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/
Heidi M. Pitts
Graduate Student
Department of Economics
University of New Mexico
*
*   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/