
Hurdle Poisson Regression Inference for Count Responses
Source:R/inference_count_hurdle.R
InferenceCountHurdlePoisson.RdFits a hurdle Poisson regression for count responses: a binary hurdle
submodel \(P(Y_i > 0) = \mathrm{logit}^{-1}(X_i^{h\top} \gamma^h)\) (fit
jointly with the count submodel) crossed with a zero-truncated Poisson
count submodel for \(Y_i \mid Y_i > 0\): \(\log E[Y_i \mid Y_i > 0,
w_i, x_i] = \beta_0 + \beta_T w_i + x_i^\top \gamma\). The hurdle and count
submodels may use different covariate formulas
(model_formula/model_formula_hurdle). The reported treatment
effect is the coefficient from the conditional (truncated, \(Y > 0\))
count component, on the log-rate scale, conditional on clearing
the hurdle: it is not the effect on the unconditional mean \(E[Y]\),
which also depends on how treatment shifts the hurdle-crossing
probability, under the default estimand = "conditional".
likelihood_tier = "full": Wald, gradient, and (bootstrap-calibrated)
likelihood-ratio tests are available for the count submodel's treatment
coefficient under that estimand; a plain score test is not exposed.
Jackknife inference is not supported: delete-one refits of this
two-part model are numerically unstable, so
compute_jackknife_estimate() and related methods report explicit
non-estimability rather than attempting delete-one refits. Unlike
InferenceCountHurdleNegBin,
the count submodel here assumes Poisson (equidispersion) conditional on
clearing the hurdle, with no separate dispersion parameter.
Marginal (unconditional-mean) estimand. Via
set_estimand(), this class
also supports estimand = "marginal_mean_diff" and
"marginal_ratio": the g-computation average, over the empirical
covariate distribution, of the model-implied unconditional mean
\(E[Y_i \mid w_i, x_i] = (1 - \pi(x_i)) \cdot \lambda(x_i) / (1 -
e^{-\lambda(x_i)})\) — the hurdle-crossing probability times the
zero-truncated Poisson mean, \(E[Y \mid Y>0] = \lambda / (1 -
e^{-\lambda})\) (exact for Poisson: truncating at \(0\) changes the
normalizing constant but not the rate parameter \(\lambda\); see
Cameron and Trivedi, Regression Analysis of Count Data, ch. 4.2) —
at \(w_i = 1\) vs. \(w_i = 0\). A pure post-fit transform of the same
maximum-likelihood fit (no refit), with a delta-method standard error
against the sandwich-robust covariance matrix already used for this
class's conditional Wald inference. Only "wald"-type inference is
available under a marginal estimand.
References
Mullahy, J. (1986). "Specification and Testing of Some Modified Count Data Models." Journal of Econometrics, 33(3), 341-365, doi:10.1016/0304-4076(86)90002-3 , for the hurdle count-model framework.
See also
InferenceCountPoisson for
the single-part Poisson model this class's count submodel generalizes to
two parts; InferenceCountHurdleNegBin
for the overdispersion-robust negative-binomial variant (does not
support a marginal estimand — the mean-function derivation here is
Poisson-specific).
Super classes
Inference -> InferenceCountZeroAugmentedPoissonAbstract -> InferenceCountHurdlePoisson
Methods
+ inherited public methods from InferenceCountZeroAugmentedPoissonAbstract
InferenceCountZeroAugmentedPoissonAbstract$approximate_bayesian_bootstrap_distribution_beta_hat_T()InferenceCountZeroAugmentedPoissonAbstract$approximate_bootstrap_distribution_beta_hat_T()InferenceCountZeroAugmentedPoissonAbstract$approximate_jackknife_distribution_beta_hat_T()InferenceCountZeroAugmentedPoissonAbstract$approximate_m_out_of_n_bootstrap_distribution_beta_hat_T()InferenceCountZeroAugmentedPoissonAbstract$approximate_rand_bootstrap_distribution_beta_hat_T()InferenceCountZeroAugmentedPoissonAbstract$approximate_randomization_distribution_beta_hat_T()InferenceCountZeroAugmentedPoissonAbstract$approximate_subsampling_distribution_beta_hat_T()InferenceCountZeroAugmentedPoissonAbstract$compute_bayesian_bootstrap_confidence_interval()InferenceCountZeroAugmentedPoissonAbstract$compute_bayesian_bootstrap_two_sided_pval()InferenceCountZeroAugmentedPoissonAbstract$compute_bootstrap_confidence_interval()InferenceCountZeroAugmentedPoissonAbstract$compute_bootstrap_two_sided_pval()InferenceCountZeroAugmentedPoissonAbstract$compute_estimate_with_bootstrap_weights()InferenceCountZeroAugmentedPoissonAbstract$compute_gradient_confidence_interval()InferenceCountZeroAugmentedPoissonAbstract$compute_gradient_two_sided_pval()InferenceCountZeroAugmentedPoissonAbstract$compute_jackknife_bias_estimate()InferenceCountZeroAugmentedPoissonAbstract$compute_jackknife_estimate()InferenceCountZeroAugmentedPoissonAbstract$compute_jackknife_std_error()InferenceCountZeroAugmentedPoissonAbstract$compute_jackknife_wald_confidence_interval()InferenceCountZeroAugmentedPoissonAbstract$compute_jackknife_wald_two_sided_pval()InferenceCountZeroAugmentedPoissonAbstract$compute_lik_ratio_bartlett_approx_confidence_interval()InferenceCountZeroAugmentedPoissonAbstract$compute_lik_ratio_bartlett_approx_two_sided_pval()InferenceCountZeroAugmentedPoissonAbstract$compute_lik_ratio_bartlett_confidence_interval()InferenceCountZeroAugmentedPoissonAbstract$compute_lik_ratio_bartlett_exact_confidence_interval()InferenceCountZeroAugmentedPoissonAbstract$compute_lik_ratio_bartlett_exact_two_sided_pval()InferenceCountZeroAugmentedPoissonAbstract$compute_lik_ratio_bartlett_two_sided_pval()InferenceCountZeroAugmentedPoissonAbstract$compute_lik_ratio_bootstrap_confidence_interval()InferenceCountZeroAugmentedPoissonAbstract$compute_lik_ratio_bootstrap_two_sided_pval()InferenceCountZeroAugmentedPoissonAbstract$compute_lik_ratio_confidence_interval()InferenceCountZeroAugmentedPoissonAbstract$compute_lik_ratio_two_sided_pval()InferenceCountZeroAugmentedPoissonAbstract$compute_m_out_of_n_bootstrap_confidence_interval()InferenceCountZeroAugmentedPoissonAbstract$compute_m_out_of_n_bootstrap_two_sided_pval()InferenceCountZeroAugmentedPoissonAbstract$compute_param_bootstrap_confidence_interval()InferenceCountZeroAugmentedPoissonAbstract$compute_param_bootstrap_estimate()InferenceCountZeroAugmentedPoissonAbstract$compute_param_bootstrap_pval()InferenceCountZeroAugmentedPoissonAbstract$compute_rand_bootstrap_confidence_interval()InferenceCountZeroAugmentedPoissonAbstract$compute_rand_bootstrap_two_sided_pval()InferenceCountZeroAugmentedPoissonAbstract$compute_rand_confidence_interval()InferenceCountZeroAugmentedPoissonAbstract$compute_rand_two_sided_pval()InferenceCountZeroAugmentedPoissonAbstract$compute_score_confidence_interval()InferenceCountZeroAugmentedPoissonAbstract$compute_score_two_sided_pval()InferenceCountZeroAugmentedPoissonAbstract$compute_subsampling_confidence_interval()InferenceCountZeroAugmentedPoissonAbstract$compute_subsampling_sensitivity()InferenceCountZeroAugmentedPoissonAbstract$compute_subsampling_two_sided_pval()InferenceCountZeroAugmentedPoissonAbstract$compute_wald_confidence_interval()InferenceCountZeroAugmentedPoissonAbstract$compute_wald_two_sided_pval()InferenceCountZeroAugmentedPoissonAbstract$get_information_preference()InferenceCountZeroAugmentedPoissonAbstract$get_information_source_used()InferenceCountZeroAugmentedPoissonAbstract$get_last_param_bootstrap_diagnostics()InferenceCountZeroAugmentedPoissonAbstract$get_last_param_bootstrap_estimate_diagnostics()InferenceCountZeroAugmentedPoissonAbstract$get_mod()InferenceCountZeroAugmentedPoissonAbstract$get_summary()InferenceCountZeroAugmentedPoissonAbstract$get_supported_bayesian_bootstrap_ci_types()InferenceCountZeroAugmentedPoissonAbstract$get_supported_bayesian_bootstrap_pval_types()InferenceCountZeroAugmentedPoissonAbstract$get_supported_bootstrap_ci_types()InferenceCountZeroAugmentedPoissonAbstract$get_supported_bootstrap_pval_types()InferenceCountZeroAugmentedPoissonAbstract$get_supported_information_preferences()InferenceCountZeroAugmentedPoissonAbstract$get_supported_rand_bootstrap_ci_types()InferenceCountZeroAugmentedPoissonAbstract$get_supported_rand_bootstrap_pval_types()InferenceCountZeroAugmentedPoissonAbstract$get_supported_testing_types()InferenceCountZeroAugmentedPoissonAbstract$get_testing_type()InferenceCountZeroAugmentedPoissonAbstract$select_optimal_b_subsampling()InferenceCountZeroAugmentedPoissonAbstract$select_optimal_m_out_of_n_bootstrap()InferenceCountZeroAugmentedPoissonAbstract$set_custom_randomization_statistic_cpp()InferenceCountZeroAugmentedPoissonAbstract$set_custom_randomization_statistic_function()InferenceCountZeroAugmentedPoissonAbstract$set_information_preference()InferenceCountZeroAugmentedPoissonAbstract$set_testing_type()InferenceCountZeroAugmentedPoissonAbstract$supports_rand_pval_for_incidence()+ inherited public methods from Inference
Inference$capabilities()Inference$compute_exact_confidence_interval()Inference$compute_exact_two_sided_pval_for_treatment_effect()Inference$duplicate()Inference$get_analysis_data()Inference$get_covariates()Inference$get_design_object()Inference$get_model_formula()Inference$get_nonestimable_reason()Inference$get_nonestimable_stage()Inference$get_optimization_alg()Inference$get_response()Inference$get_response_type()Inference$get_treatment()Inference$is_nonestimable()Inference$set_optimization_alg()Inference$set_seed()Inference$supports()
InferenceCountHurdlePoisson$new()
Initialize inference for the hurdle Poisson model (binary
hurdle submodel plus zero-truncated Poisson count submodel); see
InferenceCountHurdlePoisson
for the model form. Does not fit the model; the fit is deferred to the
first call to compute_estimate() or a method that requires it.
Usage
InferenceCountHurdlePoisson$new(
des_obj,
model_formula = NULL,
model_formula_hurdle = NULL,
use_rcpp = TRUE,
verbose = FALSE,
smart_cold_start_default = NULL,
optimization_alg = NULL
)Arguments
des_objA completed
Designobject with a count response.model_formulaOptional formula for the count submodel.
model_formula_hurdleFormula for the hurdle submodel. If
NULL(default), it uses the same formula asmodel_formula.use_rcppLogical. If
TRUE(default), use the internal Rcpp implementation. IfFALSE, use glmmTMB.verboseWhether to print progress messages.
smart_cold_start_defaultWhether to use smart cold start values.
optimization_algOptimization algorithm. Default is dispatched via policy.
InferenceCountHurdlePoisson$compute_estimate()
Fits the hurdle Poisson model. Under the default
estimand = "conditional", returns \(\hat\beta_T\), the
treatment log-rate coefficient from the zero-truncated count
submodel (conditional on clearing the hurdle). Under
estimand = "marginal_mean_diff" or "marginal_ratio"
(set via set_estimand()), returns the g-computation
marginal mean difference or log-scale marginal ratio of the
unconditional mean instead — see the class-level @details
for the formula. A pure post-fit transform of the same cached
fit, no refit.
InferenceCountHurdlePoisson$compute_asymp_confidence_interval()
Asymptotic confidence interval. Under the conditional
estimand, delegates to the shared zero-augmented count-model Wald/
bootstrap-fallback contract; under a marginal estimand, the
delta-method interval computed by compute_estimate(). Calls
self$compute_estimate() first (not private$shared()
directly) so the estimand-aware cache is always current regardless
of call order.
InferenceCountHurdlePoisson$compute_asymp_two_sided_pval()
Asymptotic two-sided p-value, dispatched exactly as
compute_asymp_confidence_interval(); see that method's
description for the marginal-estimand path.
Examples
# \donttest{
seq_des = DesignSeqOneByOneBernoulli$new(n = 10, response_type = 'count')
for (i in 1:10) {
seq_des$add_one_subject_to_experiment_and_assign(data.frame(x1 = rnorm(1)))
}
seq_des$add_all_subject_responses(rpois(10, 2))
inf = InferenceCountHurdlePoisson$new(seq_des)
inf$compute_estimate()
#> [1] -0.2241285
# }