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 on April 23, and its replacement, statalist.org is already up and running.


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: st: Looping across observations (forwards and backwards)


From   Nick Cox <njcoxstata@gmail.com>
To   statalist@hsphsun2.harvard.edu
Subject   Re: st: Looping across observations (forwards and backwards)
Date   Sat, 24 Sep 2011 16:18:04 +0100

A different comment is that it is much easier to go forwards in Stata
than backwards. So, reversing the whole dataset, and defining spells
"started" in a certain way might be easier. When all is done you
reverse it again.

Reversing is easy

gen neworder = -_n
sort neworder

On Sat, Sep 24, 2011 at 4:07 PM, Nick Cox <njcoxstata@gmail.com> wrote:
> When your program gets to
>
>      replace sinalt=`sinal' in `i'
>
> evidently `sinal' is undefined so Stata sees
>
>      replace sinalt= in `i'
>
> It tries first to interpret -in- as the name of a variable or scalar,
> fails, and aborts with error.
>
> Perhaps when you coded
>
>  if cod[j]==1 {
>
> you meant
>
>  if cod[`j']==1 {
>
> On Sat, Sep 24, 2011 at 3:28 PM, pedromfn <nakashimapedro@gmail.com> wrote:
>
>> My database looks like:
>>
>> obs cod pr qt sinalt
>> 1 1 1.4 100 .
>> 2 2 1.5 100 .
>> 3 1 1.5 95 .
>> 4 1 1.4 100 .
>> 5 3 1.5 100 .
>>
>> and I want to replace observations of sinalt in which cod==3, according to
>> the following rule:
>> 1) Go across observations looking for observations in which cod=3
>> 2) In the above example, the first observation is observation 5, in which
>> pr[5]=1.5 and qt[5]=100. Once that observation was found, go backwards
>> through observations looking for the first observation j in which
>> pr[j]==pr[5] & qt[j]==qt[5]. In the example, j=2.
>> 3) Replace sinalt[5]=`sinal' , where the macro sinal is defined as:
>>     if cod[j]==1, store in the local sinal the value 1
>>     if cod[j]==2, store in the local sinal the value -1
>> 4) Once last replace was done, look for the next observation in which cod==3
>> and do the same thing.
>>
>> I wrote the following do-file, but it didn't work:
>>
>> forvalues i=1/`=_N' {
>>        if cod[`i']==3{
>>                local j=`i'-1
>>                if pr[`j']==pr[`i'] & qt[`j']==qt[`i'] {
>>                        if cod[j]==1 {
>>                                local sinal 1
>>                        }
>>                        else if cod[`j']==2 {
>>                                local sinal -1
>>                        }
>>                        else {
>>                                local sinal
>>                        }
>>                }
>>                else {
>>                        while pr[`j']!=pr[`i'] | qt[`j']!=qt[`i'] {
>>                                local --j
>>                        }
>>                }
>>        replace sinalt=`sinal' in `i'
>>        }
>> }
>>
>> ERROR:
>> in not found
>> r(111);
>

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