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: AW: alternative to forvalues combined with bysort, by
From
Kaspar Dardas <[email protected]>
To
[email protected]
Subject
Re: st: AW: alternative to forvalues combined with bysort, by
Date
Tue, 29 Jun 2010 08:16:41 +0200
Hello Martin,
I have solved the problem and do not want to leave it open. It was
actually very easy and in the same line where I have made the
copy/paste mistake in my last email. So thanks again for bringing this
to my attention. Nevertheless, I have tried all sort of combinations
with the "by" command but I always recieved an erorr message.
Thanks & best,
Kaspar
So for variations of
http://www.stata.com/statalist/archive/2008-08/msg00107.html, see
solutions below.
* This loop counts the number of transaction in one firm 365 days
prior (and including) the respective transaction. (where gvkey ==
companyid)
local N = _N
gen count = .
qui forval i = 1/`N' {
egen tag = tag(transactionid) if gvkey == gvkey[`i'] &
inrange(eventdate, eventdate[`i'] - 365, eventdate[`i'])
count if tag
replace count = r(N) in `i'
drop tag
}
* This loop counts the number of all transaction, in all firm, in one
country 365 days prior (and including) the respective transaction.
(where COUNTRY == numerical values for each country)
local N = _N
gen count_all_trades = .
qui forval i = 1/`N'{
egen tag = tag(transactionid) if COUNTRY == COUNTRY[`i'] &
inrange(eventdate, eventdate[`i'] - 365, eventdate[`i'])
count if tag
replace count_all_trades = r(N) in `i'
drop tag
}
2010/6/28 Kaspar Dardas <[email protected]>:
> Hey,
>
> all right, sorry. This was just a copy & paste mistake in the last
> email. Unfortunately, my problem is not still not solved.
>
> Thanks & best,
>
> Kaspar
>
> 2010/6/28 Martin Weiss <[email protected]>:
>>
>> <>
>>
>>
>> The message http://www.stata.com/statalist/archive/2008-08/msg00107.html you are citing contains an -if-, though, while your code in http://www.stata.com/statalist/archive/2010-06/msg01525.html
>>
>> " egen tag = tag(transactionid) & inrange(eventdate, eventdate[`i']
>> - 365, eventdate[`i'])
>> "
>>
>> does not. Hence the confusion.
>>
>>
>>
>>
>>
>>
>> HTH
>> Martin
>>
>>
>> -----Ursprüngliche Nachricht-----
>> Von: [email protected] [mailto:[email protected]] Im Auftrag von Kaspar Dardas
>> Gesendet: Montag, 28. Juni 2010 14:43
>> An: [email protected]
>> Betreff: Re: st: AW: alternative to forvalues combined with bysort, by
>>
>> Hey Martin,
>>
>>
>> -egen, tag()- takes a -varlist-, as far as I can see from its help
>> file, but does Stata allow you to add the "& inrange()..." part w/o
>> error?
>>
>> Yep, absolutely. I get exactly what I need with this code but
>> unfortunately only for the entire datatset. I have taken the code
>> from:
>>
>> http://www.stata.com/statalist/archive/2008-08/msg00107.html
>>
>> Maybe bysort does not work because of this. However, for one single
>> dataset it works absolutely fine.
>> Do you think (egen, tag()- takes a -varlist-, as far as I can see
>> from its help file, but does Stata allow you to add the "&
>> inrange()...") is the problem, after all?
>>
>> Thanks Martin and best,
>>
>>
>> Kaspar
>>
>> 2010/6/28 Martin Weiss <[email protected]>:
>>>
>>> <>
>>>
>>>
>>> " By the way, your
>>> solution "(forv i=1/`=_N'{" gets the exact same results as "quietly
>>> forvalues i = 1/`N' {""
>>>
>>>
>>>
>>> Again sorry, you defined a -local- up there which contained _N. But still, my line does it all in one, while you need two.
>>>
>>>
>>>
>>> " The easiest way would be to drop the remaining seven countries and do
>>> all this eight times. However, I would like to find a better solution.
>>> Maybe you have one last advice on this for me. Thanks for all of your
>>> help again!"
>>>
>>>
>>> This is not the easiest way, and I do not know of a single problem that requires you to -drop- outright. As I said earlier, the solution to this kind of problem is -bysort-, as described by NJC in http://www.stata-journal.com/sjpdf.html?articlenum=pr0004. Looping over all rows of the data, as in
>>>
>>> -forv i=1/`=_N'-
>>>
>>> is rarely necessary in Stata.
>>>
>>>
>>>
>>> " In each country 10000.
>>>
>>> --> egen tag = tag(transactionid) & inrange(eventdate, eventdate[`i']
>>> - 365, eventdate[`i'])"
>>>
>>>
>>> -egen, tag()- takes a -varlist-, as far as I can see from its help file, but does Stata allow you to add the "& inrange()..." part w/o error?
>>>
>>>
>>> HTH
>>> Martin
>>>
>>>
>>> -----Ursprüngliche Nachricht-----
>>> Von: [email protected] [mailto:[email protected]] Im Auftrag von Kaspar Dardas
>>> Gesendet: Montag, 28. Juni 2010 14:28
>>> An: [email protected]
>>> Betreff: Re: st: AW: alternative to forvalues combined with bysort, by
>>>
>>> Hi Martin,
>>>
>>> thanks for all the help and effort. You definitely do not have to be
>>> sorry. Its me who doesn't understand this stuff. Well, I am still
>>> struggling with it. I think, however, I know where the problem is but
>>> my Stata knowledge is just too bad to solve it. By the way, your
>>> solution "(forv i=1/`=_N'{" gets the exact same results as "quietly
>>> forvalues i = 1/`N' {"
>>>
>>> My actual problem is that I want to tag all "transactionsids" in ONE
>>> country 365 days prior to the current transaction. There are about
>>> 80000 transactions. In each country 10000.
>>>
>>> --> egen tag = tag(transactionid) & inrange(eventdate, eventdate[`i']
>>> - 365, eventdate[`i'])
>>>
>>> All of this works fine for one country (whenever I drop the other 7
>>> countries). However, whenever I try to use double loop version I still
>>> get the results for my entire datasample. Thus, (very simply speaking)
>>> all eight countries are treated as one. I think this has something do
>>> with
>>>
>>> local N = _N
>>> qui forval i = 1/`N' { (or your version forv i=1/`=_N)
>>>
>>> the _N refers to the entire dataset but I need somehow to apply the _N
>>> for each country separately so not for 80000 but rather for 8*10000
>>> observations. Stata also does not allow to use
>>>
>>> bysort location: local N = _N
>>>
>>> The easiest way would be to drop the remaining seven countries and do
>>> all this eight times. However, I would like to find a better solution.
>>> Maybe you have one last advice on this for me. Thanks for all of your
>>> help again!
>>>
>>>
>>> Best,
>>>
>>> Kaspar
>>>
>>> 2010/6/28 Martin Weiss <[email protected]>:
>>>>
>>>> <>
>>>>
>>>> Re your assertion that -bysort- and -forvalues- do not work together: This has never been a problem for me, since -bysort- is so incredibly useful and versatile. For an intro, see NJC`s http://www.stata-journal.com/sjpdf.html?articlenum=pr0004
>>>>
>>>>
>>>>
>>>> HTH
>>>> Martin
>>>>
>>>>
>>>> -----Ursprüngliche Nachricht-----
>>>> Von: [email protected] [mailto:[email protected]] Im Auftrag von Martin Weiss
>>>> Gesendet: Montag, 28. Juni 2010 13:19
>>>> An: [email protected]
>>>> Betreff: AW: st: AW: alternative to forvalues combined with bysort, by
>>>>
>>>>
>>>> <>
>>>>
>>>> Sorry about my mistake, I never noticed you had a loop nested in there, b/c of the -quietly- command in front of it. One of the problems in your code is
>>>>
>>>> *************
>>>> quietly forvalues i = 1/`N' {
>>>> *************
>>>>
>>>> which should be - forv i=1/`=_N'{-
>>>>
>>>>
>>>> HTH
>>>> Martin
>>>>
>>>> -----Ursprüngliche Nachricht-----
>>>> Von: [email protected] [mailto:[email protected]] Im Auftrag von Kaspar Dardas
>>>> Gesendet: Montag, 28. Juni 2010 12:30
>>>> An: [email protected]
>>>> Betreff: Re: st: AW: alternative to forvalues combined with bysort, by
>>>>
>>>> Martin,
>>>>
>>>> thanks for the prompt reply. Nesting two forvalues loops in a similar
>>>> fashion as my second solution which includes "foreach" ? I think you
>>>> are referring to something that I have already tried and showed in my
>>>> firs email, correct? Or did you mean something else? I think my first
>>>> email might have been not very precise. Again, my first command in the
>>>> below email should run over 8 countries. My second command is my
>>>> (failed) approach to solve it (which I think is similar to nesting two
>>>> forvalues loops)
>>>>
>>>> Best,
>>>>
>>>> Kaspar
>>>>
>>>> 2010/6/28 Martin Weiss <[email protected]>:
>>>>>
>>>>> <>
>>>>>
>>>>>
>>>>> You may want to nest two -forvalues- loops...
>>>>>
>>>>>
>>>>>
>>>>> HTH
>>>>> Martin
>>>>>
>>>>>
>>>>> -----Ursprüngliche Nachricht-----
>>>>> Von: [email protected] [mailto:[email protected]] Im Auftrag von Kaspar Dardas
>>>>> Gesendet: Montag, 28. Juni 2010 12:11
>>>>> An: [email protected]
>>>>> Betreff: st: alternative to forvalues combined with bysort, by
>>>>>
>>>>> Hello,
>>>>>
>>>>> I would like to run the below forvalues loop for several countries
>>>>> ("locations") in one large dataset. Thus, I simply need to repeat this
>>>>> loop for subsets in one large dataset in the same fashion as the
>>>>> bysort: command would provide. "bysort:" , however, cannot be combined
>>>>> with forvalues.
>>>>>
>>>>> local N = _N
>>>>> gen count = .
>>>>> qui forval i = 1/`N' {
>>>>> egen tag = tag(transactionid) if gvkey == gvkey[`i'] &
>>>>> inrange(eventdate, eventdate[`i'] - 365, eventdate[`i'])
>>>>> count if tag
>>>>> replace count = r(N) in `i'
>>>>> drop tag
>>>>> }
>>>>>
>>>>> Therefore, I have tried a foreach loop:
>>>>>
>>>>> foreach x in location {
>>>>> gen count_all_trades = . if location == `x'
>>>>> quietly forvalues i = 1/`N' {
>>>>> egen tag = tag(transactionid) if location == `x' &
>>>>> inrange(eventdate, eventdate[`i'] - 365, eventdate[`i'])
>>>>> count if tag & location == `x'
>>>>> replace count_all_trades = r(N) in `i' if location == `x'
>>>>> drop tag
>>>>> }
>>>>> }
>>>>>
>>>>> However, this does not give me the correct solution. Is there anything
>>>>> similar to the "bysort:" command which can be used in combination with
>>>>> the forvalues command?
>>>>> Again, I simply need to rerun the first command for 8 different
>>>>> countries in one large dataset. Alliteratively, I could also split my
>>>>> dataset into 8 subsamples and run the above code 8 times. However, I
>>>>> would like to find a more "elegant" way to solve this problem.
>>>>>
>>>>> Best regards,
>>>>>
>>>>> Kaspar
>>>>> *
>>>>> * 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/
>>>>>
>>>>>
>>>>> *
>>>>> * 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/
>>>>>
>>>>
>>>> *
>>>> * 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/
>>>>
>>>>
>>>> *
>>>> * 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/
>>>>
>>>>
>>>> *
>>>> * 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/
>>>>
>>>
>>> *
>>> * 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/
>>>
>>>
>>> *
>>> * 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/
>>>
>>
>> *
>> * 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/
>>
>>
>> *
>> * 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/
>>
>
*
* 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/