Bookmark and Share

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


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

st: RE: RE: RE: looping / refering to multiple variables


From   Nick Cox <[email protected]>
To   "'[email protected]'" <[email protected]>
Subject   st: RE: RE: RE: looping / refering to multiple variables
Date   Thu, 6 Oct 2011 10:54:11 +0100

If your variables are never negative, then 

max(0, varname) 

is another way to get missings in varname treated as zeros and non-missing non-negatives to be treated as is. 

Nick 
[email protected] 


-----Original Message-----
From: [email protected] [mailto:[email protected]] On Behalf Of Nick Cox
Sent: 06 October 2011 10:41
To: '[email protected]'
Subject: st: RE: RE: looping / refering to multiple variables

Remember, as earlier, that you need to trap missings: 


gen P_nt = 0 
foreach i of global code {
     replace P_nt = P_nt + cond(missing(l_avgp`i'), 0, l_avgp`i') * ///
                           cond(missing(exp_share`i'), 0, exp_share`i') 
}

Nick 
[email protected] 


-----Original Message-----
From: [email protected] [mailto:[email protected]] On Behalf Of Nick Cox
Sent: 06 October 2011 10:04
To: '[email protected]'
Subject: st: RE: looping / refering to multiple variables

You'll go "Yes, of course" in your preferred language: 

foreach i of global item_code {
	local multiple `multiple' (l_avgp`i'*exp_share`i') 
}

local multiple : subinstr local multiple " " "+", all 

The tricks are 

1. to leave precisely one space between elements 
2. to leave no spaces elsewhere e.g. none around "*"
3. to know that Stata will not add any terminal spaces to the macro each time round the loop
4. to blank out -multiple- before starting a new definition. 

Your -egen- code

foreach i of global code {
     egen P_nt = sum (l_avgp`i' * exp_share`i')
}

wouldn't work, as second time around the loop -P_nt- already exists. But this would work 

gen P_nt = 0 
foreach i of global code {
     replace P_nt = P_nt + l_avgp`i' * exp_share`i'
}


Nick 
[email protected] 

Tomáš Houška

I am facing a problem that intuitively probably has an easy solution,
but I cannot find it.

I have panel data describing sales of products (i) in time (t) and
stores (n). I woud like to compute a sum P_nt = SUM (p_int *
exp_share_int) where p_int is a price of a given product in a time _t
and store _n, and exp_share is an expenditure share for product _i
from total expenditure in that week and store for all products.

As was adviced to be here earlier (see
http://www.stata.com/statalist/archive/2011-10/msg00082.html ), my
situation could be resolved by this:

egen P_nt = total(expression), by(store week)

where expression =
exp_share9401000* avgp9401000+
exp_share9401870* avgp9401870+ exp_share9402500* avgp9402500+
exp_share9402600* avgp9402600+ exp_share9405400* avgp9405400+
exp_share9408160* avgp9408160+ exp_share9410100* avgp9410100+
exp_share9410200* avgp9410200+ exp_share9450850* avgp9450850+
exp_share9451200* avgp9451200+ exp_share9451000* avgp9451000

number at the end of the variable is a code for the product the
variable refers to. My problem is that I am using different lists of
products and I would like to be able to change my do file easily
without having to rewrite all of the expressions like the one here
that I am using.

with a macro containing list of product codes (i.e. global item_code
"9401000 9401870...."), I was able to come up with this:

foreach i of global item_code {
	local multiple (l_avgp`i'*exp_share`i') + `multiple'
}

the problem is that at the first instance, the "+" sign is created
with the first "multiple" and then the plus sign gets transfered to
the whole expression - I end up if expression with "+" at the end. The
problem is that I need "i" cycles but only "i-1" plus signs in the
expression.

But I feel there has to be a simple way how to do that. I am not very
happy with haveing to create an expression that is just a string and
then having to insert it into the actual calculation --egen-- command.
Is something like this possible?

foreach i of global code {
     egen P_nt = sum (l_avgp`i' * exp_share`i')
}

the problem is that this would create i variables P_nt, one for each i....


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

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

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


© Copyright 1996–2018 StataCorp LLC   |   Terms of use   |   Privacy   |   Contact us   |   Site index