Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.

# RE: st: egen anycount

 From Nick Cox To "'statalist@hsphsun2.harvard.edu'" Subject RE: st: egen anycount Date Tue, 24 May 2011 20:08:01 +0100

```No; why would I suggest -reshape-? Your problems with looking for equality with fractions will bite regardless of long or wide form. It's soluble: as said, you use -float()- with floats and not with doubles.

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

Thomas Speidel

The reality is much less picture perfect: a MET value is assigned from
a published compendium of physical activities. This compendium has a
single decimal point of precision (just like the last page on the
Wikipedia article). Of course, if I had a choice I would do the
calculations myself, thus preserving more accuracy, but I have to rely
on published sources and work within its constraints.
I suspect you are going to suggest using reshape... :-)

Thomas

On Tue, 24 May 2011 18:20:46 +0100, Nick Cox <n.j.cox@durham.ac.uk>
wrote:
> 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
> n.j.cox@durham.ac.uk
>
> 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 <n.j.cox@durham.ac.uk>
>  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
>> n.j.cox@durham.ac.uk
>>
>> 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
>>
>> . 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'
>>
>> (to locate type: -di c(sysdir_personal)-) or alternatively to your
>> "plus/_/" folder (locate: -di c(sysdir_personal)-)
>>
>>
>> 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/
```