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

Re: st: RE: loop (please ignore previous)


From   "Jun Xu" <mystata@hotmail.com>
To   statalist@hsphsun2.harvard.edu
Subject   Re: st: RE: loop (please ignore previous)
Date   Sun, 09 Feb 2003 13:29:47 -0600

Nick,

This helps a lot and I will try to work off that. Thank you so much for your great help.




From: "Nick Cox" <n.j.cox@durham.ac.uk>
Reply-To: statalist@hsphsun2.harvard.edu
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/

_________________________________________________________________
Add photos to your messages with MSN 8. Get 2 months FREE*. http://join.msn.com/?page=features/featuredemail

*
* 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