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

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/

- Prev by Date:
**st: RE: loop (please ignore previous)** - Next by Date:
**st: Graph in 7/8** - Previous by thread:
**st: infile - multiple lines** - Next by thread:
**st: RE: loop (please ignore previous)** - Index(es):

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