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]
Re: st: Could someone help me with my nl evaluation program? I update my program.
From
Nick Cox <[email protected]>
To
"[email protected]" <[email protected]>
Subject
Re: st: Could someone help me with my nl evaluation program? I update my program.
Date
Fri, 31 Jan 2014 23:55:50 +0000
You have
local dist17: word 17 of `varlist'
I think you meant "word 19".
Nick
[email protected]
On 31 January 2014 16:46, 张志强 <[email protected]> wrote:
> Dear Nick
> Thank you for your advices. My naive code for 31 region code are as follows:
> capture program drop nlwage3
> program nlwage3
> version 12
> syntax varlist(min=33 max=33) if, at(name)
> local lnwage : word 1 of `varlist'
> local income : word 2 of `varlist'
> local dist1: word 3 of `varlist'
> local dist2: word 4 of `varlist'
> local dist3:word 5 of `varlist'
> local dist4: word 6 of `varlist'
> local dist5: word 7 of `varlist'
> local dist6: word 8 of `varlist'
> local dist7: word 9 of `varlist'
> local dist8: word 10 of `varlist'
> local dist9: word 11 of `varlist'
> local dist10: word 12 of `varlist'
> local dist11: word 13 of `varlist'
> local dist12: word 14 of `varlist'
> local dist13: word 15 of `varlist'
> local dist14: word 16 of `varlist'
> local dist15: word 17 of `varlist'
> local dist16: word 18 of `varlist'
> local dist17: word 17 of `varlist'
> local dist18: word 20 of `varlist'
> local dist19: word 21 of `varlist'
> local dist20: word 22 of `varlist'
> local dist21: word 23 of `varlist'
> local dist22: word 24 of `varlist'
> local dist23: word 25 of `varlist'
> local dist24: word 26 of `varlist'
> local dist25: word 27 of `varlist'
> local dist26: word 28 of `varlist'
> local dist27: word 29 of `varlist'
> local dist28: word 30 of `varlist'
> local dist29: word 31 of `varlist'
> local dist30: word 32 of `varlist'
> local dist31: word 33 of `varlist'
>
>
>
> tempname k0 k1 k2
> scalar `k0' = `at'[1, 1]
> scalar `k1' = `at'[1, 2]
> scalar `k2' = `at'[1, 3]
> tempvar eterm
> gen double `eterm'=`income'*exp(-1*`k2'*`dist1') ///
> +`income'*exp(-1*`k2'*`dist2') ///
> +`income'*exp(-1*`k2'*`dist3') ///
> +`income'*exp(-1*`k2'*`dist4') ///
> +`income'*exp(-1*`k2'*`dist5') ///
> +`income'*exp(-1*`k2'*`dist6') ///
> +`income'*exp(-1*`k2'*`dist7') ///
> +`income'*exp(-1*`k2'*`dist8') ///
> +`income'*exp(-1*`k2'*`dist9') ///
> +`income'*exp(-1*`k2'*`dist10') ///
> +`income'*exp(-1*`k2'*`dist11') ///
> +`income'*exp(-1*`k2'*`dist12') ///
> +`income'*exp(-1*`k2'*`dist13') ///
> +`income'*exp(-1*`k2'*`dist14') ///
> +`income'*exp(-1*`k2'*`dist15') ///
> +`income'*exp(-1*`k2'*`dist16') ///
> +`income'*exp(-1*`k2'*`dist17') ///
> +`income'*exp(-1*`k2'*`dist18') ///
> +`income'*exp(-1*`k2'*`dist19') ///
> +`income'*exp(-1*`k2'*`dist20') ///
> +`income'*exp(-1*`k2'*`dist21') ///
> +`income'*exp(-1*`k2'*`dist22') ///
> +`income'*exp(-1*`k2'*`dist23') ///
> +`income'*exp(-1*`k2'*`dist24') ///
> +`income'*exp(-1*`k2'*`dist25') ///
> +`income'*exp(-1*`k2'*`dist26') ///
> +`income'*exp(-1*`k2'*`dist27') ///
> +`income'*exp(-1*`k2'*`dist28') ///
> +`income'*exp(-1*`k2'*`dist29') ///
> +`income'*exp(-1*`k2'*`dist30') ///
> +`income'*exp(-1*`k2'*`dist31') `if'
>
> replace `lnwage' = `k0' +`k1'*ln(`eterm') `if'
> end
> nl wage3 @ lnwage income dist1 dist2 dist3 dist4 dist5 dist6 dist7
> dist8 dist9 dist10 dist11 dist12 dist13 dist14 dist15 dist16 dist17
> dist18 dist19 dist20 dist21 dist22 dist23 dist24 dist25 dist26
> dist27 dist28 dist29 dist30 dist31 , parameters(k0 k1 k2 )
> initial(k0 10 k1 0.34 k2 0.02)
>
> this code return error
> nlwage3 returned 199
> verify that nlwage3 is a function evaluator program
>
> the problem is that if I reduce the dist variables to 20, this code
> working very well.
> Does that mean the initial value of my nl program is wrong if I
> increase the dist variables?
> Is my program is suitable for estimate the summation over variables equation?
> Is there some method to guess the initial values for converge?
> I sincerely hope that you can help me!
>
> Zhiqiangzhang
>
> 2014-01-31 Nick Cox <[email protected]>:
>> "did not work" is difficult to evaluate here. You don't show the code
>> you used or explain how it did not work, so hoping for good advice is
>> optimistic. Macro length is unlikely to be an issue providing that you
>> define your macros appropriately.
>>
>> What you may be experiencing is just that more complicated models with
>> more adjustable parameters are typically (much) more difficult to fit.
>> Nonlinear least squares is beautifully attractive when it works
>> directly, but it may need very good guesses at parameter values to
>> converge well even when the model is suitable.
>>
>> Nick
>> [email protected]
>>
>> On 31 January 2014 13:37, 张志强 <[email protected]> wrote:
>>> Thanks Scott.
>>> My program is working well if the dyadic of individual distance is
>>> smaller than 20. is there a limitation for local macro number in nl
>>> command in stata ?
>>> I mean if the dist variables is larger than 20, my nl command did not work.
>>> I sincerely hope that you can help me!
>>>
>>>
>>>
>>> 2014-01-30 Scott Merryman <[email protected]>:
>>>> It looks like the -`if'- is on a different line following the -gen
>>>> double...- statement.
>>>>
>>>> The example below works:
>>>>
>>>>
>>>> sysuse auto,clear
>>>> gen lnprice = ln(price)
>>>> gen lowweight = (weight < 3000)
>>>> gen lowgear = (gear < 3)
>>>>
>>>> capture program drop nlwage1
>>>> program nlwage1
>>>> version 12
>>>> syntax varlist(min=5 max=5) if, at(name)
>>>> local lnwage : word 1 of `varlist'
>>>> local income : word 2 of `varlist'
>>>> local dist1: word 3 of `varlist'
>>>> local dist2: word 4 of `varlist'
>>>> local dist3:word 5 of `varlist'
>>>> tempname k0 k1 k2
>>>> scalar `k0' = `at'[1, 1]
>>>> scalar `k1' = `at'[1, 2]
>>>> scalar `k2' = `at'[1, 3]
>>>> tempvar eterm
>>>> gen double `eterm'=`income'*exp(`k2'*`dist1') ///
>>>> +`income'*exp(`k2'*`dist2') ///
>>>> +`income'*exp(`k2'*`dist3') `if'
>>>> replace `lnwage' = `k0' +`k1'*ln(`eterm') `if'
>>>> end
>>>>
>>>> nl wage1 @ lnprice mpg foreign lowweight lowgear, ///
>>>> parameters(k0 k1 k2 ) initial(k0 0.05 k1 0.02 k2 0.03)
>>
>> *
>> * For searches and help try:
>> * http://www.stata.com/help.cgi?search
>> * http://www.stata.com/support/faqs/resources/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/faqs/resources/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/faqs/resources/statalist-faq/
* http://www.ats.ucla.edu/stat/stata/