Bookmark and Share

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: egen anycount


From   Nick Cox <[email protected]>
To   "'[email protected]'" <[email protected]>
Subject   RE: st: egen anycount
Date   Tue, 24 May 2011 18:20:46 +0100

The problem can thus be traced upstream. Don't reduce such a variable to 1.2, 0.8, 1.5; if you really need such a variable map to integers with value labels. 

Nick 
[email protected] 

Thomas Speidel

 Nick, these values represent metabolic equivalent (MET) which is a 
 measure of energy consumption.  
 http://en.wikipedia.org/wiki/Metabolic_equivalent
 In this context I need to separate sedentary activities (</=1.5MET) 
 from non-sedentary activities (>1.5MET)

On Thu, 19 May 2011 13:21:48 +0100, Nick Cox <[email protected]> 
 wrote:
> I would advise circumspection here.
>
> First off, wanting to know if something is equal to one of 1.2, 0.8,
> 1.5 sounds an unusual kind of problem and it would be interesting to
> know the context. For example, if these are codes in some
> classification system, you might be better off holding the variable 
> as
> string or mapped to integers with value labels.
>
> Second, Daniel's hack solves one problem only to create another. The
> code looks OK for -float- variables but for -double- variables it 
> will
> often give the wrong answer. This can be seen directly with the
> examples given:
>
> . di 1.2 == float(1.2)
> 0
>
> . di 0.8 == float(0.8)
> 0
>
> . di 1.5 == float(1.5)
> 1
>
> 1.5 _can_ be held as an exact binary in both -float- and -double-,
> but most decimals can't. So, Daniel's program wouldn't catch 1.2 or
> 0.8 in a -double- variable.
>
> The bug is fixable and would require a branch in which a call
> -float()- was not used if the variable was -double-.
>
> On the whole, comparisons with decimals are best avoided, so seeking
> work-arounds is, in my view, not a good strategy. For every program
> like _ganycount where the file is short and a user-programmer is
> willing to show you how to change it, there are many more where the
> opposite is true.
>
> Nick
> [email protected]
>
> daniel klein
>
> I am not aware of a command, but it should not be hard changing the
> existing -anycount-. Here's an ad hoc step-by-step
>
> 1. locate -anycount- and open it in the do-file editor
>
> . findfile _ganycount.ado
> . doedit "`r(fn)'"
>
> 2. change the file (don't save the changes yet)
>
> 2.1 change line 2 form
>
> "program define _ganycount"
> to
> "program define _ganycount2"
>
> 2.2 change line 7 from
>
> "[...] , Values(numlist int) /*"
> to
> "[...] ,Values(numlist) /*"
>
> 2.3 change line 26 from
>
> "*/ if ``i'' == `nj' & `touse'"
> to
> */ if ``i'' == float(`nj') & `touse'
>
> 3. save the file as _ganycount2.ado to your "personal" folder
> (to locate type: -di c(sysdir_personal)-) or alternatively to your
> "plus/_/" folder (locate: -di c(sysdir_personal)-)
>
> 4. -discard- Stata
>
> 5. use your -anycount2- function
> . egen somevar = anycount2(varlist), values(1.2 0.8 1.5)
>

*
*   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–2018 StataCorp LLC   |   Terms of use   |   Privacy   |   Contact us   |   Site index