Skip to contents

Fits Zou's (2004) modified Poisson regression for binary (incidence) responses: \(\log E[Y_i \mid w_i, x_i] = \beta_0 + \beta_T w_i + x_i^\top \gamma\), fit by maximizing the ordinary Poisson log-likelihood treating the binary \(Y_i\) as if it were Poisson-distributed (a valid estimating equation for the conditional mean regardless of the true outcome distribution, exactly as InferencePropFractionalLogit's quasi-binomial fit is for fractional responses). \(\hat\beta_T\) is a log risk ratio: \(\exp(\hat\beta_T)\) is the estimated treatment relative risk, the same estimand as InferenceIncidLogBinomial's log-binomial model, but modified Poisson never produces a fit failure from the \([0,1]\)-probability constraint that a genuine binomial log-link model can hit. Standard errors use Zou's (2004) robust/sandwich correction, not the ordinary (model-based) Poisson Fisher information: the misspecified Poisson working model assumes \(\mathrm{Var}(Y_i) = \mu_i\), but \(Y_i\) is actually Bernoulli with \(\mathrm{Var}(Y_i) = p_i(1 - p_i) \le \mu_i\), so the naive Fisher-information SE materially overstates the true sampling variance. The sandwich correction is computed in R from quantities fast_poisson_regression_with_var_cpp already returns (mu and the unrestricted Fisher information fisher_information), not a change to the underlying kernel. Changed 2026-10: earlier versions of this class used the naive Fisher-information SE directly, which measured at roughly 0.26 Type-I error against a nominal 5 Bernoulli design, model_formula = ~., asymptotic Wald test); every standard error, confidence interval, and p-value this class has ever returned differs from this version's. likelihood_tier = "full" metadata is set for component-composition purposes, but private$supports_likelihood_tests() is hard FALSE — only Wald inference is exposed (get_supported_testing_types_impl() returns "wald" only), not likelihood-ratio/score/gradient tests. Fits with implausible coefficients or fitted linear predictors (checked via private$is_modified_poisson_fit_reasonable(), capped by max_abs_reasonable_coef/max_abs_reasonable_linear_predictor) are cached as nonestimable rather than returned.

Computes the randomization distribution of the treatment effect estimate under the sharp null.

Whether compute_rand_two_sided_pval() is actually usable on this instance right now – FALSE exactly when it would stop(): an incidence-response instance with no custom randomization statistic and a design not eligible for design-randomization-based incidence inference (see private$should_use_design_randomization_for_incidence()). TRUE for every other case, including every non-incidence response type. Public, self-contained (only reads already-set instance state, no side effects), so InferenceSuite can check this before attempting the sentinel instead of relying on the stop() being silently swallowed into a pval = NA "ok" row – the single source of truth for both this check and compute_rand_two_sided_pval()'s own guard, so the two can never drift apart.

Value

When debug = FALSE (default), a numeric vector of length r. When debug = TRUE, a list with: values, errors (list of character vectors, one per iteration), warnings (list of character vectors, one per iteration), num_errors, num_warnings, prop_iterations_with_errors, prop_iterations_with_warnings, and prop_illegal_values.

A single logical.

References

Zou, G. (2004). "A Modified Poisson Regression Approach to Prospective Studies with Binary Data." American Journal of Epidemiology, 159(7), 702-706, doi:10.1093/aje/kwh090 .

See also

InferenceIncidLogBinomial for the genuine log-binomial alternative with the same log-risk-ratio estimand. Comparable Python API: statsmodels discrete models (Poisson family on binary data). See also: Poisson regression (Wikipedia).

Super class

Inference -> InferenceIncidModifiedPoisson

Methods

+ inherited public methods from Inference


InferenceIncidModifiedPoisson$approximate_randomization_distribution_beta_hat_T()

Usage

InferenceIncidModifiedPoisson$approximate_randomization_distribution_beta_hat_T(
  r = 501,
  delta = 0,
  transform_responses = "none",
  show_progress = TRUE,
  permutations = NULL,
  debug = FALSE,
  zero_one_logit_clamp = .Machine$double.eps
)

Arguments

r

Number of randomization vectors. Default 501.

delta

The null difference. Default 0.

transform_responses

Type of transformation. Default "none".

show_progress

Show progress bar. Default TRUE.

permutations

Pre-computed permutations. Default NULL.

debug

If TRUE, return a list with the distribution values and per-iteration diagnostics including error messages, warning messages, counts of each, and summary proportions for iterations with errors, warnings, and illegal (non-finite) values. Runs serially. Default FALSE.

zero_one_logit_clamp

The clamping amount for exact 0 and 1 values when logging


InferenceIncidModifiedPoisson$supports_rand_pval_for_incidence()

Usage

InferenceIncidModifiedPoisson$supports_rand_pval_for_incidence()


InferenceIncidModifiedPoisson$clone()

The objects of this class are cloneable with this method.

Usage

InferenceIncidModifiedPoisson$clone(deep = FALSE)

Arguments

deep

Whether to make a deep clone.

Examples

# \donttest{
seq_des = DesignSeqOneByOneBernoulli$new(n = 10, response_type = 'incidence')
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(rbinom(10, 1, 0.5))
inf = InferenceIncidModifiedPoisson$new(seq_des)
inf$compute_estimate()
#> [1] 0.6606907
# }