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

RE: RE: st: string functions on the name of a variable


From   "Nick Cox" <n.j.cox@durham.ac.uk>
To   <statalist@hsphsun2.harvard.edu>
Subject   RE: RE: st: string functions on the name of a variable
Date   Sun, 27 Nov 2005 17:55:38 -0000

Wow! How many data points? How many parameters? 
How much collinearity? 

The correct name is Fourier, as already 
pointed out. Apart from that pedantic 
correction, I regret that this is too 
complex a question for me in the time available. 

Nick 
n.j.cox@durham.ac.uk 

Dev Vencappa

> Nick, thanks for the solution you provided. I have tried it 
> but got stuck and on second thoughts I realised it may be 
> better to explain more clearly what I want exactly.
> 
> Suppose I have the following equation to estimate:
> 
> to=f(clli, clnl, ca, te, re)
> 
> We want to estimate a flexible fourier representation of the 
> above. The final equation will have the first five terms, 
> translog terms and trigonometric terms, as follows:
> 
> to= clli + clnl + ca + te + re + Translog terms + Fourier terms
> where Translog terms are:  (0.5*clli^2)+(0.5*clnl^2) + 
> (0.5*ca^2)+(0.5*te^2)+(0.5*ro^2)+ (clli * clnl) +  (clli * 
> ca)+ (clli * te) + (clli * ro) +  (clnl * ca)+ (clnl * te) + 
> (clnl * ro)+ (ca*te) + (ca*ro) + (te*ro) 
> 
> where Fourier terms are 
> 
> sin(clli) + cos (clli)+ sin (clnl) + cos (clnl) + sin(ca) + 
> cos (ca) + sin (te) + cos (te) + sin (ro) + cos (ro)
> 
> By flexible fourrier I mean that one can have more layers of 
> trigonometric terms that combine these variables in different 
> ways, eg. combining two variables as follows:
> 
> sin(clli+ clnl) + cos (clli+clnl)+ sin (clli+ca) + cos 
> (cli+ca) + sin (clli+te) + cos (clli+te) + sin (clli+ro) + 
> cos (clli+ro) + sin (clnl+ca) + cos (clnl+ca) + sin (clnl+te) 
> + cos (clnl +te) + sin(clnl+ro) + cos (clnl + ro) + sin 
> (ca+te) + cos (ca+te) + sin (ca+ro) + cos (ca+ro) + sin 
> (te+ro) + cos (te+ro)
> 
> Another layer of this function would be combining three 
> variables in the same way, four variables and five variables 
> (five would be the highest combination of variables one can 
> create because there are only five right hand side variables)
> 
> Now, each of these right hand side variables is rescaled 
> using a particular formulae (e.g. see  paper by A.  Kasnan 
> (2002) Central Bank Review 1, pp. 1-20). I have copied below 
> how I created the variables and the rescaling used.
> 
> gen to=lntoen
> gen pro=lnprof
> gen clli=lnclli
> gen clnl=lnclnl
> gen ca=lnca
> gen te=lntech
> gen ro=lnroin
> gen pril=lnpril
> gen prinl=lnprinl
> 
> local var "to pro clli clnl ca te ro"
> foreach j of local var{
> sum `j'
> gen x=(1.6*_pi)/(r(max)-r(min))
> gen z=(0.2*_pi)-(x*r(min))+(x*`j')
> *z is the rescaling to be applied to each variable 
> gen R`j'=z
> *create trigonometric terms for these rescaled variables
> gen sin`j'=sin(R`j')
> gen cos`j'=cos(R`j')
> *create squared terms of the rescaled variable
> gen `j'sqr=0.5*R`j'^2
> drop x z
> }
> 
> local z "clnl ca te ro"
> foreach x of local z{
> gen clli`x'=Rclli*R`x'
> gen sinclli`x'=sin(Rclli+R`x')
> gen cosclli`x'=cos(Rclli+R`x')
> }
> 
> local z "ca te ro"
> foreach x of local z{
> gen clnl`x'=Rclnl*R`x'
> }
> 
> gen cate=Rca*Rte
> gen caro=Rca*Rro
> gen tero=Rte*Rro
> 
> local z "prinl ca te ro"
> foreach x of local z{
> gen pril`x'=Rpril*R`x'
> gen sinpril`x'=sin(Rpril+R`x')
> gen cospril`x'=cos(Rpril+R`x')
> }
> 
> local z "ca te ro"
> foreach x of local z{
> gen prinl`x'=Rprinl*R`x'
> gen sinprinl`x'=sin(Rprinl+R`x')
> gen cosprinl`x'=cos(Rprinl+R`x')
> }
> 
> *create third layer of FF function
> local z "sin cos"
> foreach x of local z{
> gen `x'clliclnlca=`x'(Rclli+Rclnl+Rca)
> gen `x'clliclnlte=`x'(Rclli+Rclnl+Rte)
> gen `x'clliclnlro=`x'(Rclli+Rclnl+Rro)
> gen `x'cllicate=`x'(Rclli+Rca+Rte)
> gen `x'cllicaro=`x'(Rclli+Rca+Rro)
> gen `x'clnlcate=`x'(Rclnl+Rca+Rte)
> gen `x'clnlcaro=`x'(Rclnl+Rca+Rro)
> gen `x'clnltero=`x'(Rclnl+Rte+Rro)
> gen `x'catero=`x'(Rca+Rte+Rro)
> gen `x'prilprinlca=`x'(Rpril+Rprinl+Rca)
> gen `x'prilprinlte=`x'(Rpril+Rprinl+Rte)
> gen `x'prilprinlro=`x'(Rpril+Rprinl+Rro)
> gen `x'prilcate=`x'(Rpril+Rca+Rte)
> gen `x'prilcaro=`x'(Rpril+Rca+Rro)
> gen `x'prinlcate=`x'(Rprinl+Rca+Rte)
> gen `x'prinlcaro=`x'(Rprinl+Rca+Rro)
> gen `x'prinltero=`x'(Rprinl+Rte+Rro)
> *create fourth layer of FF function
> gen `x'clliclnlcate=`x'(Rclli+Rclnl+Rca+Rte)
> gen `x'clliclnlcaro=`x'(Rclli+Rclnl+Rca+Rro)
> gen `x'clliclnltero=`x'(Rclli+Rclnl+Rte+Rro)
> gen `x'cllicatero=`x'(Rclli+Rca+Rte+Rro)
> gen `x'clnlcatero=`x'(Rclnl+Rca+Rte+Rro)
> *fifth layer
> gen `x'clliclnlcatero=`x'(Rclli+Rclnl+Rca+Rte+Rro)
> }
> 
> To make it easier for estimation, I store the Translog terms 
> in a global macro, and same for each of the layers of the 
> fourier terms (i.e. first layer, second layer, etc)
> 
> My first question is how I find a shortcut way of creating 
> these different combinations of fourier terms?
> Clearly, somehow, Stata will need to be told that if two 
> variables are combined once through a sine and cosine of 
> their additions, then they cannot be combined a second time. 
> 
> Second, suppose I have estimated an equation. Suppose I want 
> to differentiate the above with respect to all variables that 
> have clli in their names and add all these partial 
> derivatives. This would be the addition of all these terms 
> retrieved from the estimated coefficients. When there are 
> interaction of terms,I am not too sure how to handle this in 
> an automated function in Stata.
> 
> Suppose I have a translog term cllica which is the product of 
> clli and ca. differentiating lntoen with respect to clli will 
> be the coefficient of cllica multiplied by ca (I will 
> evaluate this at mean values of the variables). Any thoughts 
> on how I would go about doing this automatically please?
> 
> It gets a little bit more complicated for me when I try with 
> the fourrier terms. Suppose my variable is 
> 
> sincllica =sin (Rclli+Rca). The derivative with respect to 
> clli is _b[sincllica]*cos(clli+ca)
> 
> or if
> 
> coscllica =cos (Rclli+Rca). The derivative with respect to 
> clli is _b[coscllica]* - sin(Rclli+Rca)
> 
> How would I tell Stata to automatically deal with that (i.e 
> recognise where there are sin and cosine variables (I guess 
> wildcards will provide the solution here but I can't figure 
> out how to write this)? The solution to this will be the 
> solution for the third layers, fourth layers and fifth layers as well.
> 
> Apologies for this long email, but I would really be grateful 
> if a shortcut solution to this problem were available as I am 
> finding myself writing a very long do file to work this out.
> Many thanks in advance.
> 
> Dev
> 
> >>> n.j.cox@durham.ac.uk 11/21/05 11:14 am >>>
> I don't see that you need a function here. 
> 
> The set of variables with "clli" as part of
> their names is given by the wildcard  *clli*
> and so can be put into a macro by 
> 
> unab clli : *clli* 
> 
> Presumably you know what variables appear 
> on the RHS of your regression and can manufacture 
> a local macro containing them, say rhs. 
> 
> The intersection is then 
> 
> local cllirhs : list clli & rhs 
> 
> and you can cycle over these with 
> 
> foreach v of local cllirhs { 
> 	... = ... + _b[`v'] 
> } 
> 
> Assuming that by Fourrier you mean Fourier, I don't see why 
> handling a set of Fourier terms need be messy. The utility 
> -fourier- from -circular- on SSC provides one way of getting 
> a bunch of them. 
> 
> Alternatively, in one recent program I needed to generate a bunch 
> of them on the fly. Here is the code generalised mildly: 
> 
> 	// regression in terms of sin j theta, cos j theta 
> 	local sc 
> 	local terms = <plug in your own> 
> 
> 	forval j = 1/`terms' { 
> 		tempvar S C
> 		gen `S' = sin(`j' * `theta') 
> 		gen `C' = cos(`j' * `theta') 
> 		local sc `sc' `S' `C'
> 	}
> 
> 	// regression will fail if data points too few 
> 	// or response missing 
> 	// assumes a `touse' marking observations to be used 
> 
> 	capture regress <response to be plugged in> `sc' if `touse' 
> 	if _rc gen `sm' = . if `touse' 
> 	else predict `sm' if `touse' 
> 
> 	drop `sc' 
> 		
> On the other hand, quite what a "Flexible" Fourier analysis
> is I don't know. 
> 
> Nick 
> n.j.cox@durham.ac.uk 
> 
> Dev Vencappa
> 
> >  I have the following problem and would be grateful if you 
> > could provide some help:
> > 
> > Suppose I have a regression equation with lntoen as my 
> > dependent variable and a lot of right hand side variables 
> > called lncllisqr lncllica lncllite lncaclli (and there are 
> > more variables like these which contain the word "clli" in 
> > their name as well as other variables named differently). 
> > After estimation, I am trying to add the coefficients of all 
> > variables in an estimation that have "clli" in their names.  
> > While I can do this manually by using _b[variablename],  I am 
> > faced with a problem as I am estimating a Flexible Fourrier 
> > function, which tends to be very messy in terms of the 
> > addition of trigonometric terms. 
> > 
> > I am trying to differentiate lntoen with respect to all 
> > variables that contain "clli" in their names. I am trying to 
> > automate this process by asking stata to add the coefficients 
> > of all variables that contain "clli" in their names. 
> > 
> > Does anybody know if there is an equivalent to one of the 
> > list of string functions (such as e.g. substr) that can allow 
> > me to write some condition to check if the variable contains 
> > the characters "clli" in its name and then add their 
> > coefficients please?
> > 
> > Apologies if a similar posting has been up on the list before 
> > and escaped my attention.
> 
> *
> *   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/
> 
> This message has been checked for viruses but the contents of 
> an attachment
> may still contain software viruses, which could damage your 
> computer system:
> you are advised to perform your own checks. Email 
> communications with the
> University of Nottingham may be monitored as permitted by UK 
> legislation.
> 
> 
> *
> *   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/
> 

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