Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.
From | Nick Cox <njcoxstata@gmail.com> |
To | statalist@hsphsun2.harvard.edu |
Subject | Re: st: Creating a dummy variable under certain conditions |
Date | Mon, 4 Jun 2012 13:31:33 +0100 |
Earlier in the thread Abhimanyu mentioned -tsspell- (SSC). -tsspell- can indeed be used here, but first you must reverse time. That is you are looking for spells that are at least four 0s long ending with a 1. First creating a sandpit with similar data: clear input str6 date gvkey viol 1997q1 1004 0 1997q2 1004 0 1997q3 1004 0 1997q4 1004 0 1998q1 1004 1 1998q2 1004 0 1998q3 1004 0 1998q4 1004 0 1999q1 1004 0 1999q2 1004 1 1999q3 1004 0 1999q4 1004 0 2000q1 1004 1 2000q2 1004 0 2000q3 1004 0 2000q4 1004 1 2001q1 1004 0 2001q2 1004 0 2001q3 1004 0 2001q4 1004 0 2002q1 1004 0 2002q2 1004 1 end gen numdate = yq(real(substr(date,1,4)), real(substr(date,6,1))) Now I reverse time gen negdate = -numdate tsset gvkey negdate Then spells start with 1. (And 1s start spells.) tsspell , fcond(viol == 1) And a spell must be at least 5 obs long. egen length = max(_seq), by(gvkey _spell) gen OK = _seq == 1 & length >= 5 Restore usual direction of time: tsset gvkey numdate On Mon, Jun 4, 2012 at 1:15 PM, sebas nicaise <sebasnicaise@hotmail.com> wrote: > Thank you very much Nick, it worked! > > Thank you to for your effort Abhimanyu, your code gives me this: > date gvkey viol new_viol_dummy > 1997q1 1004 0 0 > 1997q2 1004 0 0 > 1997q3 1004 0 0 > 1997q4 1004 0 0 > 1998q1 1004 0 1 > 1998q2 1004 0 0 > 1998q3 1004 0 0 > 1998q4 1004 0 0 > 1999q1 1004 0 0 > 1999q2 1004 0 1 > 1999q3 1004 0 0 > 1999q4 1004 0 0 > 2000q1 1004 0 0 > 2000q2 1004 0 0 > 2000q3 1004 0 0 > 2000q4 1004 0 1 > 2001q1 1004 0 0 > 2001q2 1004 0 0 > 2001q3 1004 0 0 > 2001q4 1004 0 0 > 2002q1 1004 0 0 > 2002q2 1004 0 1 > > So now it gave too many :) > > > > ---------------------------------------- >> Date: Mon, 4 Jun 2012 12:19:23 +0100 >> Subject: Re: st: Creating a dummy variable under certain conditions >> From: njcoxstata@gmail.com >> To: statalist@hsphsun2.harvard.edu >> >> Thanks. As my previous three solutions were all quite wrong, I had >> some distance to make up. >> >> Nick >> >> On Mon, Jun 4, 2012 at 12:11 PM, Abhimanyu Arora >> <abhimanyu.arora1987@gmail.com> wrote: >> > All I can say to Nick's ingenious solution iswow (shouldn't come as a >> > surprise though) >> > >> > Sebas, instead of -replacing- 2 times you could further shorten the >> > alternative solution by >> > >> > replace new_viol_dummy=0 if ceil(_seq/6)!=floor(_seq/6) & _seq!=1 & viol==0 >> > >> > In order to get a clear, detailed understanding of things, would you >> > mind listing out why this gives too few ones, given your requirements? >> > >> > Thanks >> > >> > Abhimanyu >> > >> > >> > On Mon, Jun 4, 2012 at 12:06 PM, Nick Cox <njcoxstata@gmail.com> wrote: >> >> Quite so. Let's try something different. >> >> >> >> gen history = "" >> >> bysort gvkey (date) : replace history = string(viol) + history[_n-1] >> >> gen OK = substr(history, 1, 5) == "10000" >> >> >> >> Nick >> >> >> >> On Mon, Jun 4, 2012 at 10:38 AM, sebas nicaise <sebasnicaise@hotmail.com> wrote: >> >>> >> >>> Nick your code is almost right. Only it gives a 1 for these cases while it should not: >> >>> >> >>> date gvkey viol myindicator >> >>> 2000q3 1045 0 0 >> >>> 2000q4 1045 0 0 >> >>> 2001q1 1045 0 0 >> >>> 2001q2 1045 0 0 >> >>> 2001q3 1045 1 1 >> >>> 2001q4 1045 1 0 >> >>> 2002q1 1045 0 0 >> >>> 2002q2 1045 0 0 >> >>> 2002q3 1045 0 0 >> >>> 2002q4 1045 1 1 >> >>> 2003q1 1045 1 0 >> >>> 2003q2 1045 0 0 >> >>> >> >>> You see, because viol is 1 again after the new viol reported a 1. So it is wrong because there are only 3 quarters of 0 in the viol dummy. >> >>> >> >>> >> >>> Abrihmanyu, in your code it gives to few 1's But if it reports a 1 it is right. I do not see the error in the code... >> >>> >> >>> >> >>> >> >>> >> >>> ---------------------------------------- >> >>>> Date: Mon, 4 Jun 2012 09:41:24 +0100 >> >>>> Subject: Re: st: Creating a dummy variable under certain conditions >> >>>> From: njcoxstata@gmail.com >> >>>> To: statalist@hsphsun2.harvard.edu >> >>>> >> >>>> bysort gvkey (date) : gen cuviol = sum(viol) >> >>>> by gvkey : gen myindicator = (viol == 1) & (cuviol[_n-1] == >> >>>> cuviol[_n-4]) & _n> 4 >> >>>> >> >>>> Nick >> >>>> >> >>>> On Mon, Jun 4, 2012 at 9:22 AM, sebas nicaise <sebasnicaise@hotmail.com> wrote: >> >>>> >> >>>>> It is important that new viol dummy can only be 1 if viol is 1 and in the previous 4 quarters viol is 0. * * 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/