[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

From |
"Kieran McCaul" <kamccaul@meddent.uwa.edu.au> |

To |
<statalist@hsphsun2.harvard.edu> |

Subject |
st: irecode problem |

Date |
Thu, 5 Mar 2009 08:31:15 +0900 |

My problem is concerned with using the -irecode- function in a program when the number of cutpoints (the xi used in the function) varies. I'm accumulating probabilities across a number of groups and then picking someone from these groups at random based on these probabilities. So I've approached this using the -irecode- function. I sum the probabilities in each group and then create a running cumulative probability which I then append to the -irecode- function that I've store in a local as a string. When someone is picked, I recalculate the cumulative probabilities excluding those who have already been picked. I need to generate the -irecode- function this way because, while I know how many groups there are to begin with (38), as I progressively pick individuals, the number of groups will diminish. The code is below. There is nothing wrong with it as far as I know and it will work with a small number of groups, but with a large number of groups, the string length exceeds the 244 character limit. So the comm macro ends up with only the first 244 characters of the command. * maxg is the total number of groups * prob is each person's probability local p = uniform() /* generate a probability from U(0,1) */ local p0 = 0 local comm = "irecode(`p', 0" /* The total number of groups is maxg This loop calculates the total probability in each group, adds it to the cumulative probability, and appends it to the string stored in the comm local */ forvalues i = 1/`maxg' { qui summ prob if picked==0 & group==`i' /* sum of probabilities in a group */ local pg`i' = r(sum) /* sum(prob) in group i */ local k = `i'-1 /* number of previous group */ local p`i' = `p`k'' + `pg`i'' /* add this sum to previous sum */ local comm = "`comm'" + ", `p`i''" } local comm = "`comm'" + ")" Now I can get around this, I suppose, by getting rid of the comm macro altogether and instead using a series of -if- statements. if `maxg' == 38 { local group = irecode(`p',0,`p1',`p2',`p3', ...,`p38') } else if `maxg' == 37 { local group = irecode(`p',0,`p1',`p2',`p3', ...,`p37') } else if `maxg' == 36 { local group = irecode(`p',0,`p1',`p2',`p3', ...,`p36') } else if `maxg' == 35 { local group = irecode(`p',0,`p1',`p2',`p3', ...,`p35') } etc, etc But this is a tad inelegant. Can anyone think of anything more efficient? Kieran ______________________________________________ Kieran McCaul MPH PhD WA Centre for Health & Ageing (M573) University of Western Australia Level 6, Ainslie House 48 Murray St Perth 6000 Phone: (08) 9224-2140 Fax: (08) 9224 8009 email: kamccaul@meddent.uwa.edu.au http://myprofile.cos.com/mccaul http://www.researcherid.com/rid/B-8751-2008 ______________________________________________ The fact that no one understands you doesn't make you an artist. * * 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/

**Follow-Ups**:**st: AW: irecode problem***From:*"Martin Weiss" <martin.weiss1@gmx.de>

- Prev by Date:
**Re: st: Biased estimates?** - Next by Date:
**st: IRT with GLLAMM** - Previous by thread:
**st: 64 bit MySQL 5.1 ODBC driver for Mac OS 10.5.6** - Next by thread:
**st: AW: irecode problem** - Index(es):

© Copyright 1996–2015 StataCorp LP | Terms of use | Privacy | Contact us | What's new | Site index |