I have only very limited suggestions.
1. It may not matter here but in general I feel queasy when I see stuff
like
forval i = 0(0.001)1 {
I would rather cycle over integers and manipulate further within the loop.
When it ends up the same you lose nothing, but the other way round you can get bitten
a bit more often.
2. Relative tolerances are usually more versatile than absolute ones,
although I can't say whether this applies to your case.
3. It is largely cosmetic, but for a problem like this I prefer
-inrange()-.
if x - n*`i'^(n-1) + (n-1)*`i'^n < 0.0001 & x - n*`i'^(n-1) + (n-1)*`i'^n > -0.0001
then becomes
if inrange(x - n*`i'^(n-1) + (n-1)*`i'^n, -0.0001, 0.0001)
Alternatively,
if abs(x - n*`i'^(n-1) + (n-1)*`i'^n) < 0.0001
4. If this were my problem, I might move it into Mata.
Nick
[email protected]
Bob Hammond
> I would like to define a new variable based on two current variables,
> but the new variable cannot be expressed as an explicit
> function of the
> current variables. The relationship is:
>
> x = n*y^(n-1) - (n-1)*y^n
>
> where I have data on x and n and would like to create a new
> variable, y.
> x and y are restricted to the real numbers on the open interval (0,1)
> and n is restricted to being a positive integer. Under these
> restrictions, the function is well-behaved and provides a unique
> solution, but not an explicit formulation. I can generate y with the
> following loop:
>
> forvalues i=0(0.001)1 {
> replace y=`i' if x - n*`i'^(n-1) + (n-1)*`i'^n < 0.0001 & x -
> n*`i'^(n-1) + (n-1)*`i'^n > -0.0001
> }
>
> but I am wondering if there is a more efficient and precise
> way. If this
> type of loop is best, what precision would you recommend for
> the steps
> of `i’ and the tolerance (the ><0.0001)? (I’m on Intercooled
> Stata 9 for
> Windows if that matters.) Thanks in advance,
*
* 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/