Announcement

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

  • Tobit vs Double hurdle model

    Dear Statalist members,
    I want to use a double hurdle model (Churdle) for my analysis and compare if it fits better than the Tobit model.
    The literature have used sometimes used LR test for nested models to compare the two. When I tried using LR test, I get the following error:


    . lrtest dhmodel1 tobit1
    test involves different estimators: churdle vs. tobit
    r(498);


    I have same variables in both the models, how can i compare these two on which model fits my data well?

    Any help and suggestions are welcome.

  • #2
    Ashish Chouhan I have the same problem with you about select between Tobit and DH (churdle). How did you handle it, can you tell me, please

    Comment


    • #3
      Perhaps this.

      Code:
      webuse fitness , clear
      
      ** Tobit model
      tobit hours age i.smoke distance i.single commute whours, ll(0)
      scalar ll_tobit = e(ll)
      scalar k_tobit = e(rank)
      
      ** Churdle model
      churdle linear hours age i.smoke distance i.single, select(commute whours age) ll(0)
      scalar ll_churdle = e(ll)
      scalar k_churdle = e(rank)
      
      ** LR test
      scalar lr_stat = 2 * (ll_churdle - ll_tobit)
      scalar df = k_churdle - k_tobit
      scalar p_value = chi2tail(df, lr_stat)
      
      di "LR statistic: " lr_stat
      di "Degrees of freedom: " df  
      di "P-value: " p_value

      Comment


      • #4
        George Ford I appreciate your answer it helps me a lots, but some papers I found say that if 2 models are non-nested, then Vuong test should be used to choose between them! I'm very confused about that, I still haven't done Vuong test for Tobit and Churdle
        In my case:
        tobit ln_THE a b c d, ll(0)
        churdle linear ln_THE b c d, select (b c d e) ll(0)
        Last edited by LEE CHAN; 27 Oct 2025, 09:59.

        Comment


        • #5
          This might help get you started.

          Code:
          webuse fitness, clear
          
          * Estimate Tobit model
          tobit hours age i.smoke distance i.single commute whours, ll(0)
          predict xb_tobit, xb
          scalar ll_tobit = e(ll)
          scalar n = e(N)
          
          * Calculate individual log-likelihoods for Tobit
          tempvar ll_i_tobit sigma_tobit y_std phi_std Phi_std
          scalar `sigma_tobit' = sqrt(_b[/:var(e.hours)])
          
          gen double `y_std' = (hours - xb_tobit) / `sigma_tobit'
          gen double `phi_std' = normalden(`y_std')
          gen double `Phi_std' = normal(-xb_tobit/`sigma_tobit')
          
          gen double `ll_i_tobit' = cond(hours > 0, ///
              ln(`phi_std'/`sigma_tobit'), ///
              ln(`Phi_std'))
          
          * Estimate Churdle model
          churdle linear hours age i.smoke distance i.single, select(commute whours age) ll(0)
          scalar ll_churdle = e(ll)
          
          * Main equation prediction
          tempvar xb_churdle xb_select ll_i_churdle sigma_churdle
          predict `xb_churdle', xb
          
          * Calculate selection equation linear prediction using actual coefficient names
          gen double `xb_select' = _b[selection_ll:commute]*commute + ///
                                   _b[selection_ll:whours]*whours + ///
                                   _b[selection_ll:age]*age + ///
                                   _b[selection_ll:_cons]
          
          * Get sigma from lnsigma (need to exponentiate)
          scalar `sigma_churdle' = exp(_b[lnsigma:_cons])
          
          * Churdle likelihood
          gen double `ll_i_churdle' = cond(hours > 0, ///
              ln(normalden((hours - `xb_churdle')/`sigma_churdle')/`sigma_churdle') + ln(normal(`xb_select')), ///
              ln(1 - normal(`xb_select')))
          
          * Vuong test statistic
          gen double ll_diff = `ll_i_tobit' - `ll_i_churdle'
          quietly sum ll_diff
          scalar mean_diff = r(mean)
          scalar sd_diff = r(sd)
          scalar vuong_stat = sqrt(n) * mean_diff / sd_diff
          
          scalar p_value = 2 * normal(-abs(vuong_stat))
          
          * Display results
          display _newline "Vuong Test: Tobit vs Churdle Linear"
          display "--------------------------------------"
          display "Vuong statistic: " vuong_stat
          display "P-value: " p_value
          display ""
          if vuong_stat > 1.96 {
              display "Tobit is preferred (p < 0.05)"
          }
          else if vuong_stat < -1.96 {
              display "Churdle is preferred (p < 0.05)"
          }
          else {
              display "Models are indistinguishable"
          }

          Comment


          • #6
            I've updated tobcm (normality test). Can't post here for some reason (JSON error). Send me a message and I'll share the code.

            Comment


            • #7
              George Ford one more question: can it apply to select Churdle and Heckman, since when using Heckman i have to change ln_THE to che (binary: 1=join,0=not). and how we choose between Heckman two-step and LM, some studies i've read told that when Mill ratio is significant, two-step is prefered, but some said LM is better

              Comment


              • #8
                I guess it depends on the DGP. Do 0's mean "not selected into the market" (Heckman) or "in the market but choose 0" (Churdle).

                I think Vuong can be used to compare the two models, though the code might need some changes.

                Comment


                • #9
                  The Tobit model is nested within Cragg's truncated normal two-part model. In Stata, this is, I believe, the "churdle lin" option. So you can use the usual likelihood ratio statistic. If you use "churdle exp" then they aren't nested.

                  Comment

                  Working...
                  X