# Re: st: bys and [_N] within replace

 From Eva Poen To statalist@hsphsun2.harvard.edu Subject Re: st: bys and [_N] within replace Date Wed, 18 Mar 2009 13:51:29 +0000

```Alexander,

your original code does not work because you check for the last and
second last observation only, within Id. If you code

bysort Id (Commdate) : ... if result2[_N] != "TM FAILURE" &
result2[_N-1] != "TM FAILURE"

, Stata looks up the value of result2 in the in the last (_N) and
second last (_N-1) observation for each Id. _N always denotes the last
observation within each group, and _n denotes the current observation.
The above expression evaluates to true if, in the two last
observations in a group, result2 does not equal "TM FAILURE". You
would have to check _all_ observations within Id, though.

Generally, this is a very cumbersome way of checking things because
you have to explicitely spell all other possible values apart from "TM
Ei-svar", which is never a good idea because it is prone to errors. It
is unnecessary, too, even with your approach, since you could just as
well code

bysort Id (Commdate) : ... if result2[_N] == "TM Ei-svar" &
result2[_N-1] == "TM Ei-svar"

Still, this is very complicated because you would have to add many
more conditions, right up to result2[1]=="TM Ei-svar", in order to
make sure only pick the cases you want.

It gets yet more complicated with unbalanced panels, since _N will
vary between groups, and, say, _N-7 might not be defined in all
groups, in which case result2[_N-7] would evaluate to missing in
groups with less than 8 observations.

Many reasons to take the easy route :-)

Eva

2009/3/18, Alexander.Severinsen@telenor.com <Alexander.Severinsen@telenor.com>:
> Johannes, thanks for this.
>
> Eva Poen gave me this code,
>
> gen other =  Result2 != "TM Ei-svar"
> bysort Id (Commdate) : replace other = sum(other)
> by      Id (Commdate) : gen dummy = other[_N]==0
> drop other
>
> which works fine.
>
> I tried your code as well, but it does not replicate the above solution,
> most likely because my statement of the problem was unclear. Sorry about
> that.
>
> I am still puzzled about why my code did not work. I thought that I could
> use _N to look forward and _N-1 to look backwards, within Id and Commdate.
>
> Anyway, problem solved. Thanks for the help.
>
> Best wishes,
> Alexander Severinsen
>
>
> -----Opprinnelig melding-----
> Fra: owner-statalist@hsphsun2.harvard.edu
> [mailto:owner-statalist@hsphsun2.harvard.edu] På vegne av Johannes Geyer
> Sendt: 18. mars 2009 11:28
> Til: statalist@hsphsun2.harvard.edu
> Emne: Re: st: bys and [_N] within replace
>
> you could do the following:
>
> bys Id Result2: gen helpvar = _n == 1
> egen kun_eisvar = total(helpvar), by(Id)
> replace kun_eisvar = kun_eisvar == 1
> drop helpvar
>
>
> Hope this helps,
>
> Johannes
>
>
>
>
>
> ----------------------
> Johannes Geyer
> Deutsches Institut für Wirtschaftsforschung (DIW Berlin)
> German Institute for Economic Research
> Department of Public Economics
> DIW Berlin
> Mohrenstraße 58
> 10117 Berlin
> Tel: +49-30-89789-258
>
> owner-statalist@hsphsun2.harvard.edu schrieb am 18/03/2009 11:05:24:
>
>> I have the following panel.
>>
>>
>> Id   Commdate   Result2
>> 400   05may2008   TM FAILURE
>> 400   29may2008   DM FAILURE
>> 400   05oct2008   TM Ei-svar
>> 400   27oct2008   TM Ei-svar
>> 400   30nov2008   TM Ei-svar
>> 400   04jan2009   TM Ei-svar
>>
>> I would like to generate a binary variable that equals 1 if a
>> category "TM Ei-svar" within result2 occurs. But I only want this to
>> happen if no other category in Result2 is present within Id, either
>> onwards are backwards in time (Commdate). Nick Cox and Martin Weiss
>> gave excellent advice on an earlier related problem pointing me to
>> 'bys' and using [_N] within replace statements. Nick also refered me
>> to further free 'by' tricks at
>>
>> http://www.stata-journal.com/sjpdf.html?articlenum=pr0004
>>
>> However, I am still unable to solve the above problem. I tried
>>
>> gen kun_eisvar=0
>> bys Id (Commdate):replace kun_eisvar=1 if ///
>>    (result2=="TM Ei-svar"& ///
>>    result2[_N]!="TM FAILURE"&result2[_N-1]!="TM FAILURE"& ///
>>    result2[_N]!="TM SUCCESS"&result2[_N-1]!="TM SUCCESS"& ///
>>    result2[_N]!="SUCCESS DM SMS 1999"&result2[_N-1]!="SUCCESS DM
> SMS1999"& ///
>>    result2[_N]!="DM SUCCESS NY BIND"&result2[_N-1]!="DM SUCCESS NY
> BIND"& ///
>>    result2[_N]!="DM SUCCESS"&result2[_N-1]!="DM SUCCESS"& ///
>>    result2[_N]!="DM FAILURE"&result2[_N-1]!="DM FAILURE")
>>
>> though, this does not work. See an example below.
>>
>> Id   Commdate   Result2   kun_eisvar
>> 400   05may2008   TM FAILURE   0
>> 400   29may2008   DM FAILURE   0
>> 400   05oct2008   TM Ei-svar   1
>> 400   27oct2008   TM Ei-svar   1
>> 400   30nov2008   TM Ei-svar   1
>> 400   04jan2009   TM Ei-svar   1
>>
>> Because Result2 has other categories than 'TM Ei-svar' for Id=400
>> this observation should not equal 1.
>>
>> Any advice on where I went wrong is appreciated.
>>
>>
>> Best wishes,
>> Alexander
>>
>>
>>
>>
>>
>> *
>> *   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/
>

--
Von meinen Mobilgerät aus gesendet

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