[Date Prev][Date Next][Thread Prev][Thread Next][Date index][Thread index]

From |
"Nick Cox" <n.j.cox@durham.ac.uk> |

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

Subject |
st: RE: loop (please ignore previous) |

Date |
Sun, 9 Feb 2003 18:44:10 -0000 |

Jun Xu posted twice, here labelled (1) and (2): > (1) > > > puzzled by a problem when writing an ado file. Suppose I have > > var1 var2 var3 var4 var5......vark, and I want to do the > > following loop: > > ************************************************************ > > ********* > > var1 > > var2 > > var3 > > ... > > ... > > ... > > vark > > var1 var2 > > var1 var3 > > var1 var4 > > ... > > ... > > var1 vark > > var2 var3 > > var2 var4 > > ... > > ... > > var(k-1) vark > > ... > > ... > > var1 var2 var3 > > var1 var2 var4 > > var1 var2 var5 > > ... > > var1 var2 var3....vark > > ****************************************************************** > > Basically, what I want to do is like step wise exhausting > > all combinations > > in a systematic way from univariate, bivariate, trivariate, to > > multivariate....Or, I can say for every variable in the > > variable list, there > > is indicator variable associated with it. I either take > > this variable in or > > out in each run. And there should be 2^k possibilities. I > > have no idea how > > to handle that. COuld anyone give me some hint? Many > > thanks in advance. > > (2) > > I think I might not have explained my problems clearly. I > have k indicator > variables (coded as 1 or 0) and I would like to know the > response patterns > (for example for latent class analsis) to these k > variables. For example, > > var1 var2 var3 ....vark > 1 0 0 0 > 0 1 0 0 > ... > 1 1 0 0 > ... > ... > ... > 1 1 1 1 > > I would like to know for each response pattern, how many > cases are there, > and programmed into an ado file. My key problem here is > how to run through > all the combinations (univariate, bivariate, and trivariate) > > One posibility is that I used the following cods (or > reviced version to fit > into an ado file) > > ****************************************************************** > clear > for num 1/6: set obs 100\ gen xX=invnorm(uniform()) \ gen DxX=xX>0.6 > gen pattern=0 > local i=1 > while `i'<6 { > replace pattern=pattern+Dx`i'*10^(6-`i') > local i=`i'+1 > } > > aorder > list Dx1-Dx6 pattern > sort pattern > list pattern > gen count=1 > collapse (sum) count, by(pattern) > *********************************************************** > The resulting data matrix looks like: > > ============================ > pattern count > 0 16 > 10 10 > 100 5 > 110 6 > 1000 8 > 1010 7 > 1100 2 > 1110 1 > 10000 11 > 10010 3 > 10100 2 > 10110 2 > 11000 2 > 11010 2 > 11100 1 > 100000 7 > 100010 1 > 100100 2 > 101000 4 > 101010 1 > 110000 1 > 110010 2 > 110100 2 > 111000 1 > 111010 1 > ================================= > > > Here the problem is that it only presents the response > pattern that has at > least one case and it's hard to handle its order (now is > list in numerical > order: from small to big) > But what if I want to go through "each" combination (2^k > possible ways) in a > sysmatic way and list all response pattern freqeuncy though > some of them > have zero cases. What I meant by a systematic way is like: > > ************************************************************ > ********* > var1 > var2 > var3 > ... > ... > ... > vark > var1 var2 > var1 var3 > var1 var4 > ... > ... > var1 vark > var2 var3 > var2 var4 > ... > ... > var(k-1) vark > ... > ... > var1 var2 var3 > var1 var2 var4 > var1 var2 var5 > ... > var1 var2 var3....vark > ****************************************************************** > > or in binary coding > **************************************************************** > 1 0 0 0 0 .....0 > 0 1 0 0 0 .....0 > 0 0 1 0 0 .....0 > ... > ... > ... > 0 0 0 0 0 .....1 > 1 1 0 0 0 .....0 > 1 0 1 0 0 .....0 > 1 0 0 1 0 .....0 > ... > ... > 1 1 1 0 0 .....0 > 1 0 1 1 0 .....0 > ... > ... > ... > ... > 1 1 1 1 1 .....1 > *********************************************** > > Here I didn't present some summarize command that could > grab case number for > that response pattern. But basically I will run through > each combination > and calculate the frequency for that particular combination > though there > might be zero cases. Thanks a lot 1. To get a tabulation of patterns with some instances, egen all = concat(var1-vark) tab all 2. The following program suggests some possible lines of attack. program permlist, rclass version 8 syntax varlist tokenize `varlist' local nvars : word count `varlist' local imax = 2^`nvars' - 1 forval i = 1 / `imax' { qui inbase 2 `i' local which : di %0`nvars'.0f `r(base)' local vars forval j = 1 / `nvars' { local char = substr("`which'",`j',1) if `char' { local vars "`vars'``j'' " } } local vlist `"`vlist'"`vars'" "' } local varlist forval i = 1 / `nvars' { foreach w of local vlist { local nv : word count `w' if `i' == `nv' { local varlist `"`varlist'"`w'" "' } } } return local varlist `"`varlist'"' end I use the undocumented -inbase- command to get the binary equivalent of 1 ... 2^k - 1 (I omit the null case in which none of the variables are chosen). It is important to get leading zeros explicit. -inbase- is in Stata 8; for Stata 7 or Stata 6 type . findit inbase or use the search method of your choice to find it in Bill Gould's files. In Stata . type http://www.stata.com/users/wgould/inbase/inbase.ado Then each variable is or is not chosen according to whether each digit is 1 or 0. Then we need to sort for your purposes according to the number of variables chosen. The whole list is left behind in memory in the form (e.g. for a b c d) "d " "c " "b " "a " ... "a b c d " I think the above program should also work with very minor modifications in Stata 7. 3. For implementation of a different, and less general, technique see -allpossible- on SSC. Nick n.j.cox@durham.ac.uk * * 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/

**References**:**st: RE: loop***From:*"Nick Cox" <n.j.cox@durham.ac.uk>

- Prev by Date:
**st: RE: loop** - Next by Date:
**Re: st: RE: loop (please ignore previous)** - Previous by thread:
**st: RE: loop** - Next by thread:
**st: set varwindow and revwindow as nofloat permanently in Win98 ?** - Index(es):

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