Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Loop in mata (forvalues)

    Dear Stata users,

    I would like to use a loop to run the code for GMM estimation following De Locker. I need the loop because I would like to run my code for every industry in my data.

    The code I am using without a loop works well:

    Code:
    mata:
    void GMM_DLW(todo,betas,crit,g,H)
    {
        PHI=st_data(.,("phi"))
        PHI_LAG=st_data(.,("phi_lag"))
        Z=st_data(.,("const","l_lag","k"))
        X=st_data(.,("const","l","k"))
        X_lag=st_data(.,("const","l_lag","k_lag"))
        Y=st_data(.,("y"))
        C=st_data(.,("const"))
    
        OMEGA=PHI-X*betas'
        OMEGA_lag=PHI_LAG-X_lag*betas'
        OMEGA_lag_pol=(C,OMEGA_lag)
        g_b = invsym(OMEGA_lag_pol'OMEGA_lag_pol)*OMEGA_lag_pol'OMEGA
        XI=OMEGA-OMEGA_lag_pol*g_b
        crit=(Z'XI)'(Z'XI)
    }
    
    void GMM_DLW_TL(todo,betas,crit,g,H)
    {
        PHI=st_data(.,("phi"))
        PHI_LAG=st_data(.,("phi_lag"))
        Z=st_data(.,("const","l_lag","k","l_lag2","k2","l_lagk"))
        X=st_data(.,("const","l","k","l2","k2","lk"))
        X_lag=st_data(.,("const","l_lag","k_lag","l_lag2","k_lag2","l_lagk_lag"))
        Y=st_data(.,("y"))
        C=st_data(.,("const"))
    
        OMEGA=PHI-X*betas'
        OMEGA_lag=PHI_LAG-X_lag*betas'
        OMEGA_lag_pol=(C,OMEGA_lag)
        g_b = invsym(OMEGA_lag_pol'OMEGA_lag_pol)*OMEGA_lag_pol'OMEGA
        XI=OMEGA-OMEGA_lag_pol*g_b
        crit=(Z'XI)'(Z'XI)
    }
    
    
     void DLW()
        {
    S=optimize_init()
    optimize_init_evaluator(S, &GMM_DLW())
    optimize_init_evaluatortype(S,"d0")
    optimize_init_technique(S, "nm")
    optimize_init_nmsimplexdeltas(S, 0.1)
    optimize_init_which(S,"min")
    optimize_init_params(S,(1,0.8,0.2)) /**optimize_init_params(S,("OLS"))*/
    p=optimize(S)
    p
    st_matrix("beta_dlw",p)
    }
    
    void DLW_TRANSLOG()
        {
    S=optimize_init()
    optimize_init_evaluator(S, & GMM_DLW_TL())
    optimize_init_evaluatortype(S,"d0")
    optimize_init_technique(S, "nm")
    optimize_init_nmsimplexdeltas(S, 0.1)
    optimize_init_which(S,"min")
    optimize_init_params(S,(0,0,0,0,0,0))
    p=optimize(S)
    p
    st_matrix("beta_dlwtranslog",p)
    }
    end
    
    cap program drop dlw
    program dlw, rclass
    preserve
    sort ordinal year
    mata DLW()
    end
    
    cap program drop dlw_translog
    program dlw_translog, rclass
    preserve
    sort ordinal year
    mata DLW_TRANSLOG()
    end
    
    reg y l k i.year
    gen beta_lols=_b[l]
    gen beta_kols=_b[k]
    gen Markup_ols=_b[l]/alpha_l
    
    dlw
    gen beta_c1=beta_dlw[1,1]
    gen beta_l1=beta_dlw[1,2]
    gen beta_k1=beta_dlw[1,3]
    
    gen Markup_dlw1=beta_l1/alpha_l
    gen omega_dlw1=phi-beta_l1*l-beta_k1*k
    
    dlw_translog
    gen betal_tl1=beta_dlwtranslog[1,2]
    gen betal_tl2=beta_dlwtranslog[1,4]
    gen betak_tl1=beta_dlwtranslog[1,3]
    gen betak_tl2=beta_dlwtranslog[1,5]
    gen betalk_tl=beta_dlwtranslog[1,6]
    
    gen betal_tl=betal_tl1+2*betal_tl2*l+betalk_tl*k
    gen Markup_DLWTL=betal_tl/alpha_l
    gen mark1=Markup_dlw1
    gen mark12=Markup_DLWTL

    Adding the loop, however, did not work:

    Code:
    forvalues j=1/N {
    keep if UK_indus==`j'
    
    
    
    mata:
    void GMM_DLW(todo,betas,crit,g,H)
    {
        PHI=st_data(.,("phi"))
        PHI_LAG=st_data(.,("phi_lag"))
        Z=st_data(.,("const","l_lag","k"))
        X=st_data(.,("const","l","k"))
        X_lag=st_data(.,("const","l_lag","k_lag"))
        Y=st_data(.,("y"))
        C=st_data(.,("const"))
    
        OMEGA=PHI-X*betas'
        OMEGA_lag=PHI_LAG-X_lag*betas'
        OMEGA_lag_pol=(C,OMEGA_lag)
        g_b = invsym(OMEGA_lag_pol'OMEGA_lag_pol)*OMEGA_lag_pol'OMEGA
        XI=OMEGA-OMEGA_lag_pol*g_b
        crit=(Z'XI)'(Z'XI)
    }
    
    void GMM_DLW_TL(todo,betas,crit,g,H)
    {
        PHI=st_data(.,("phi"))
        PHI_LAG=st_data(.,("phi_lag"))
        Z=st_data(.,("const","l_lag","k","l_lag2","k2","l_lagk"))
        X=st_data(.,("const","l","k","l2","k2","lk"))
        X_lag=st_data(.,("const","l_lag","k_lag","l_lag2","k_lag2","l_lagk_lag"))
        Y=st_data(.,("y"))
        C=st_data(.,("const"))
    
        OMEGA=PHI-X*betas'
        OMEGA_lag=PHI_LAG-X_lag*betas'
        OMEGA_lag_pol=(C,OMEGA_lag)
        g_b = invsym(OMEGA_lag_pol'OMEGA_lag_pol)*OMEGA_lag_pol'OMEGA
        XI=OMEGA-OMEGA_lag_pol*g_b
        crit=(Z'XI)'(Z'XI)
    }
    
    
     void DLW()
        {
    S=optimize_init()
    optimize_init_evaluator(S, &GMM_DLW())
    optimize_init_evaluatortype(S,"d0")
    optimize_init_technique(S, "nm")
    optimize_init_nmsimplexdeltas(S, 0.1)
    optimize_init_which(S,"min")
    optimize_init_params(S,(1,0.8,0.2)) /**optimize_init_params(S,("OLS"))*/
    p=optimize(S)
    p
    st_matrix("beta_dlw",p)
    }
    
    void DLW_TRANSLOG()
        {
    S=optimize_init()
    optimize_init_evaluator(S, & GMM_DLW_TL())
    optimize_init_evaluatortype(S,"d0")
    optimize_init_technique(S, "nm")
    optimize_init_nmsimplexdeltas(S, 0.1)
    optimize_init_which(S,"min")
    optimize_init_params(S,(0,0,0,0,0,0))
    p=optimize(S)
    p
    st_matrix("beta_dlwtranslog",p)
    }
    end
    
    cap program drop dlw
    program dlw, rclass
    preserve
    sort ordinal year
    mata DLW()
    end
    
    cap program drop dlw_translog
    program dlw_translog, rclass
    preserve
    sort ordinal year
    mata DLW_TRANSLOG()
    end
    
    reg y l k i.year
    gen beta_lols=_b[l]
    gen beta_kols=_b[k]
    gen Markup_ols=_b[l]/alpha_l
    
    dlw
    gen beta_c1=beta_dlw[1,1]
    gen beta_l1=beta_dlw[1,2]
    gen beta_k1=beta_dlw[1,3]
    
    gen Markup_dlw1=beta_l1/alpha_l
    gen omega_dlw1=phi-beta_l1*l-beta_k1*k
    
    dlw_translog
    gen betal_tl1=beta_dlwtranslog[1,2]
    gen betal_tl2=beta_dlwtranslog[1,4]
    gen betak_tl1=beta_dlwtranslog[1,3]
    gen betak_tl2=beta_dlwtranslog[1,5]
    gen betalk_tl=beta_dlwtranslog[1,6]
    
    gen betal_tl=betal_tl1+2*betal_tl2*l+betalk_tl*k
    gen Markup_DLWTL=betal_tl/alpha_l
    gen mark1=Markup_dlw1
    gen mark12=Markup_DLWTL
    
    
    
    
    }
    The error would be like this:

    Code:
    . void DLW_TRANSLOG()
     51.         {
     52. S=optimize_init()
     53. optimize_init_evaluator(S, & GMM_DLW_TL())
     54. optimize_init_evaluatortype(S,"d0")
     55. optimize_init_technique(S, "nm")
     56. optimize_init_nmsimplexdeltas(S, 0.1)
     57. optimize_init_which(S,"min")
     58. optimize_init_params(S,(0,0,0,0,0,0))
     59. p=optimize(S)
     60. p
     61. st_matrix("beta_dlwtranslog",p)
     62. }
     63. end
    --Break--
    r(1);
    
    end of do-file
    
    --Break--
    r(1);
    
    .
    Please could help with this and let me know what is wrong with my loop?

    Thanks a lot,
    JL

  • #2
    I haven't tried to understand the Mata code here. But

    Code:
    forval j = 1/N {
    will fail as even if N is a Stata variable or scalar, forvalues won't evaluate it on the fly. For the loop to work, you need industries as coded in the variable UK_indus to be numbered 1 up and you need to use the actual maximum, not N. So,

    Code:
    forval j = 1/42 {
    would be correct if and only if industries were coded 1 2 ... 41 42.


    Each time round the loop you need to read in the original data, at least with the rather brutal approach of throwing out all other industries but the one which enters calculations.

    Comment


    • #3
      Dear Nick Cox,

      Thank you for your reply!
      I used the same code, but I changed
      Code:
       
       forval j = 1/N {
      to
      Code:
        
       forval j = 1/20{
      since I have 20 industries.

      But the error is still the same.
      Code:
       51.         {
       52. S=optimize_init()
       53. optimize_init_evaluator(S, & GMM_DLW_TL())
       54. optimize_init_evaluatortype(S,"d0")
       55. optimize_init_technique(S, "nm")
       56. optimize_init_nmsimplexdeltas(S, 0.1)
       57. optimize_init_which(S,"min")
       58. optimize_init_params(S,(0,0,0,0,0,0))
       59. p=optimize(S)
       60. p
       61. st_matrix("beta_dlwtranslog",p)
       62. }
       63. end
      --Break--
      r(1);
      
      end of do-file
      
      --Break--
      r(1);
      
      .
      Am I still doing something wrong? Actually, the code is correct and I have had all the estimates I have. I am just trying to do this for every industry using the loop because it is kind of cumbersome to do it for each industry separately.

      Thanks
      JLi

      Comment


      • #4
        Sorry, but I can't help further beyond repeating the comment

        Each time round the loop you need to read in the original data, at least with the rather brutal approach of throwing out all other industries but the one which enters calculations.

        Comment


        • #5
          Here is my copy-and-paste advice in circumstances like this.

          If you want
          • a block of Mata code terminated by end
          to run within
          • a Stata block surrounded by braces {} - typically a program, but in fact within any brace-enclosed block of code
          you need to
          • define your Mata code as a Mata function outside the brace-enclosed block
          • call the Mata function within the brace-enclosed block
          Even though your "end" is meant to terminate a Mata block, at the time Stata is parsing the loop, the fact that the "end" belongs to Mata and not to Stata is not recognized, and causes Stata to react incorrectly.

          Adapting it to your code, I think it means that moving the entire mata block, which serves only to define mata functions, before the forvalues loop, will solve your problem.

          Comment

          Working...
          X