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: dot product across many variables


From   Nick Cox <n.j.cox@durham.ac.uk>
To   "'statalist@hsphsun2.harvard.edu'" <statalist@hsphsun2.harvard.edu>
Subject   RE: st: dot product across many variables
Date   Tue, 29 Nov 2011 19:08:28 +0000

Two line solution, FWIW. 

gen dotproduct = . 
mata: st_store(., "dotproduct", rowsum(st_data(., "first1 first2 first3"):*st_data(., "second1 second2 second3")))

Any one-liners? 

Nick 
n.j.cox@durham.ac.uk 

Nick Cox

Talking of which, 

. edit

. set obs 10
obs was 0, now 10

. forval i = 1/3 {
  2. gen first`i' = runiform() > `i' * 0.2
  3. gen second`i' = runiform() < `i' * 0.2
  4. }

. l

     +--------------------------------------------------------+
     | first1   second1   first2   second2   first3   second3 |
     |--------------------------------------------------------|
  1. |      0         0        0         0        1         1 |
  2. |      1         1        0         0        0         0 |
  3. |      1         0        1         1        0         1 |
  4. |      1         0        1         1        0         1 |
  5. |      1         0        1         0        1         1 |
     |--------------------------------------------------------|
  6. |      0         0        1         1        0         1 |
  7. |      1         0        1         0        0         1 |
  8. |      0         0        1         1        1         1 |
  9. |      1         0        0         0        0         1 |
 10. |      1         0        1         1        1         0 |
     +--------------------------------------------------------+

. mata
------------------------------------------------- mata (type end to exit) --------------------------------------------------------------------
: x = st_data(., "first1 first2 first3")

: y = st_data(., "second1 second2 second3")

: x :* y
        1   2   3
     +-------------+
   1 |  0   0   1  |
   2 |  1   0   0  |
   3 |  0   1   0  |
   4 |  0   1   0  |
   5 |  0   0   1  |
   6 |  0   1   0  |
   7 |  0   0   0  |
   8 |  0   1   1  |
   9 |  0   0   0  |
  10 |  0   1   0  |
     +-------------+

: rowsum(x :* y)
        1
     +-----+
   1 |  1  |
   2 |  1  |
   3 |  1  |
   4 |  1  |
   5 |  1  |
   6 |  1  |
   7 |  0  |
   8 |  2  |
   9 |  0  |
  10 |  1  |
     +-----+

Nick 
n.j.cox@durham.ac.uk 


-----Original Message-----
From: owner-statalist@hsphsun2.harvard.edu [mailto:owner-statalist@hsphsun2.harvard.edu] On Behalf Of Paul Burkander
Sent: 29 November 2011 18:12
To: statalist@hsphsun2.harvard.edu
Subject: Re: st: dot product across many variables

ah, that's great.  Much better than having to learn mata in day.

Thanks!

On Tue, Nov 29, 2011 at 1:03 PM, Nick Cox <njcoxstata@gmail.com> wrote:
> Consider a loop
>
> gen newdummy = 0
>
> forval j = 2000/2010 {
> replace newdummy = newdummy + firstdummy`j' * seconddummy`j'
> }
>
> On Tue, Nov 29, 2011 at 5:11 PM, Paul Burkander <paul@burkander.com> wrote:
>
>> I have a data set that has two binary variables in each of several
>> years.  I'd like to create a new variable that is the sum across all
>> years of the product of the two within year.
>>
>> For example,
>> firstdummy2000=1
>> seconddummy2000=0
>> firstdummy2001=1
>> seconddummy2001=1
>>
>> newdummy=(firstdummy2000*seconddummy2000+firstdummy2001*seconddummy2001)=1
>>
>> There are so many years that it seems cumbersome to do it as above,
>> moreover the years might change over time and I'd like to be flexible.
>>
>> I thought perhaps a matrix command would work, doing a dot product?

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