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


© Copyright 1996–2014 StataCorp LP   |   Terms of use   |   Privacy   |   Contact us   |   Site index