Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.
From | Austin Nichols <austinnichols@gmail.com> |
To | statalist@hsphsun2.harvard.edu |
Subject | Re: st: dot product across many variables |
Date | Tue, 29 Nov 2011 14:26:39 -0500 |
Nick-- clear all set obs 10 forval i = 2000/2010 { gen f`i' = runiform() > (`i'-2000)/10 loc f `f' f`i' gen s`i' = runiform() < (`i'-2000)/10 loc s `s' s`i' } mata:st_store(.,st_addvar("long","dp"),rowsum(st_data(.,"`f'"):*st_data(.,"`s'"))) On Tue, Nov 29, 2011 at 2:08 PM, Nick Cox <n.j.cox@durham.ac.uk> wrote: > 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/