Stata The Stata listserver
[Date Prev][Date Next][Thread Prev][Thread Next][Date index][Thread index]

RE: st: Year to start 1st April


From   "Nick Cox" <n.j.cox@durham.ac.uk>
To   <statalist@hsphsun2.harvard.edu>
Subject   RE: st: Year to start 1st April
Date   Mon, 8 Mar 2004 09:31:09 -0000

There is a standard trade-off here. It is discussed
at some length in Stata Journal 2(4):411--427 (2002)
with reference to issues like that here, in which there 
are direct solutions making use of Stata's built-in functions
and canned solutions making use of an -egen- function. 

Broadly speaking, 

*  Most problems in this area can be solved in a few 
lines with calls to Stata's built-in functions, although 
it can take some rummaging through the documentation 
and some experience to become fluent with this approach. 
It also helps to be fluent with -by:-, -_n- and -_N-, 
and Stata's handling of true and false. 

* An -egen- function, when available, also often offers 
the convenience of sensible labelling, attention to missing
values and handles for -if- and -in-. These too are applicable
directly, but some problems can get very messy with these
extra complications. 

* However, if you rely on there being a canned solution 
to each problem, you will often be sorely disappointed. 
There is inevitably some capriciousness in whether 
someone has decided that a problem is worth writing an 
-egen- function for. (Users cannot write their own built-ins.) 

I don't think portability is a major issue provided the 
functions concerned are identifiable through -search- 
or -findit-, although the need to explain where you got
something can easily be overlooked. 

Nick 
n.j.cox@durham.ac.uk 

> -----Original Message-----
> From: owner-statalist@hsphsun2.harvard.edu
> [mailto:owner-statalist@hsphsun2.harvard.edu]On Behalf Of Richard
> Williams
> Sent: 07 March 2004 21:43
> To: statalist@hsphsun2.harvard.edu
> Subject: Re: st: Year to start 1st April
> 
> 
> At 03:46 PM 3/7/2004 -0500, Nick Winter wrote:
> >At 11:20 PM 3/5/2004 -0500, Richard Williams wrote:
> >>Whoops.  I think the original solution I posted quickly gets off a 
> >>day.  I think it is fixable, but how about this instead:
> >>
> >>. gen finyear = year(datevisit)
> >>
> >>. replace finyear = finyear - 1 if month(datevisit) < 4
> >
> >Just a quick note to note, as it were, that this approach 
> can be done in 
> >one line:
> >
> >    . gen finyear = year(datevisit) - (month(datevisit)<4)
> >
> >(This works because the logical condition will evaluate to 0 
> or 1, as 
> >appropriate.
> >
> >--Nick Winter
> 
> I had tried to do something like that but it wasn't working because I 
> didn't have the parentheses on the final part of the 
> expression right.  For 
> those determined to use as few lines as possible, here is yet another 
> spacesaver:
> 
> . gen finyear = cond(month(datevisit) < 
> 4,  year(datevisit)-1,  year(datevisit))
> 
> The -cond- option seems like a nice alternative to a 
> generate/replace combo 
> of commands.
> 
> My favorite solution so far is the ncyear solution suggested 
> by Nick Cox - 
> not so much because it saves typing but because it saves you 
> a lot of time 
> figuring out what to type.  But, I suppose there is something 
> to be said 
> for avoiding the use of addons for relatively simple tasks, 
> e.g. if the 
> code will be run on different machines then portability is 
> easier if you 
> stick to built-in functions.
> 
> *
> *   For searches and help try:
> *   http://www.stata.com/support/faqs/res/findit.html
> *   http://www.stata.com/support/statalist/faq
> *   http://www.ats.ucla.edu/stat/stata/
> 

*
*   For searches and help try:
*   http://www.stata.com/support/faqs/res/findit.html
*   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   |   What's new   |   Site index