Bookmark and Share

Notice: On March 31, it was announced that Statalist is moving from an email list to a forum. The old list will shut down on April 23, and its replacement, statalist.org is already up and running.


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

st: Re: forvalues, panel data


From   Christopher Baum <kit.baum@bc.edu>
To   "statalist@hsphsun2.harvard.edu" <statalist@hsphsun2.harvard.edu>
Subject   st: Re: forvalues, panel data
Date   Fri, 1 Oct 2010 04:03:16 -0400

<>
On Oct 1, 2010, at 2:33 AM, Nick wrote:

> Your -forvalues- scaffolding is completely redundant, and in fact causes the same changes to be executed 11 times. But your problem does call for a loop over a varlist.
> 
> foreach v of var <whatever> {
>        gen d`v' = .
>        replace d`v' = `v' if fyear == 1980
>        replace d`v' = `v' * 0.967059 if fyear == 1981
>        <etc>
> }
> 
> Nick
> n.j.cox@durham.ac.uk
> 
> Biljana Dlab
> 
> I have panel data (companies, fiscal years) and need to deflate numbers
> to US$ 1980
> 
> tsset  gvkey_n  fyear
> 
> I used forvalues function and did it like this:
> 
> First I created variable just with dots:
> 
> gen dI2=.
> 
> Then simple forvalues loop
> 
> .forvalues fyear = 1980/1990 {
> .replace dI2=I2*1 if fyear==1980
> .replace dI2=I2*0.967059 if fyear==1981
> .replace dI2=I2*0.421106 if fyear==1982
> ...
> .replace dI2=I2*0.307175 if fyear==1990
> }
> 
> So that works, but since I have 10 variables (from I1 to I10) that need
> to be deflated, repeating the whole procedure is time consuming... so I
> tried by using var i=I1-I10, etc... but always got reply invalid
> syntax...

Rather than having an error-prone replace statement for each year (with all of those if conditions), better to merge the additional characteristics onto each observation, as described in the FAQ
http://www.stata.com/support/faqs/data/characteristics.html

For example, using the Grunfeld panel data, let's say we have a price deflator for each year and want to apply it to each of 10 investment series:

clear all
// fake deflator data in a separate file
set obs 20
g year = 1934 + _n
g defl = exp(_n/100)
save defl, replace

// apply to panel data
webuse grunfeld, clear
// make up some numbered vars
forv i=1/10 {
	g invest`i' = invest + runiform()
}
su invest?
// bring in the deflator
merge n:1 year using defl
// deflate each of the numbered variables in place
forv i=1/10 {
	qui replace invest`i' = invest`i' / defl
}
su defl invest?

Kit



Kit Baum   |   Boston College Economics & DIW Berlin   |   http://ideas.repec.org/e/pba1.html
                              An Introduction to Stata Programming  |   http://www.stata-press.com/books/isp.html
   An Introduction to Modern Econometrics Using Stata  |   http://www.stata-press.com/books/imeus.html


*
*   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–2014 StataCorp LP   |   Terms of use   |   Privacy   |   Contact us   |   Site index