
G-Computation Risk-Difference Inference for KK Designs with Binary Responses
Source:R/inference_incidence_KK_marginal.R
InferenceIncidKKGCompRiskDiff.RdFits an all-subject logistic working model \(\mathrm{logit}\,P(Y=1\mid w,x) = \beta_0 + \beta_T w + \beta_X^\top x\) for a KK incidence outcome using treatment \(w\) and, optionally, all recorded covariates \(x\), then estimates the marginal (standardized, g-computation) risk difference \(\hat\theta = n^{-1}\sum_i \{\hat p(1, x_i) - \hat p(0, x_i)\}\) by averaging the fitted-model predicted risks under all-treated and all-control assignments over the empirical covariate distribution (Robins 1986). Matched pairs are treated as clusters and reservoir subjects are treated as singletons when computing the sandwich covariance of the standardized estimator (the delta-method variance of the empirical mean of the two counterfactual-risk contrasts, not the naive logistic-regression coefficient variance).
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.
Details
This estimator has likelihood_tier = "none": the fitted logistic model
is a working model for standardization only, and reported inference is
sandwich/bootstrap-based, not likelihood-based. compute_estimate() fits
the model and returns \(\hat\theta\) on the risk-difference (probability)
scale; compute_estimate_with_bootstrap_weights() refits under
Bayesian-bootstrap subject weights for compute_bayesian_bootstrap_confidence_interval().
Those weights affect the working-model fit only: the resulting predictions
are still averaged equally over the retained empirical covariate rows, so
every g-computation implementation in EDI targets the same
sample-conditional standardized estimand.
Jackknife deletes one cluster (matched pair or singleton reservoir subject) at
a time. If the working model fails to converge or the design has no
treatment-arm variation, the estimate is marked non-estimable via
is_nonestimable().
References
Robins, J. (1986). A new approach to causal inference in mortality studies with a sustained exposure period. Mathematical Modelling, 7(9-12), 1393-1512. doi:10.1016/0270-0255(86)90088-6
See also
InferenceIncidKKGCompRiskRatio
for the risk-ratio analog on the same standardization machinery.
Super class
Inference -> InferenceIncidKKGCompRiskDiff
Methods
+ inherited public methods from Inference
Inference$capabilities()Inference$compute_asymp_confidence_interval()Inference$compute_asymp_two_sided_pval()Inference$compute_estimate()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$initialize()Inference$is_nonestimable()Inference$set_optimization_alg()Inference$set_seed()Inference$supports()
InferenceIncidKKGCompRiskDiff$approximate_randomization_distribution_beta_hat_T()
Usage
InferenceIncidKKGCompRiskDiff$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
rNumber of randomization vectors. Default 501.
deltaThe null difference. Default 0.
transform_responsesType of transformation. Default "none".
show_progressShow progress bar. Default TRUE.
permutationsPre-computed permutations. Default NULL.
debugIf
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. DefaultFALSE.zero_one_logit_clampThe clamping amount for exact 0 and 1 values when logging
Examples
# \donttest{
seq_des = DesignSeqOneByOneKK14$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), x2 = rnorm(1)))
}
seq_des$add_all_subject_responses(rbinom(10, 1, 0.5))
inf = InferenceIncidKKGCompRiskDiff$new(seq_des)
inf$compute_estimate()
#> [1] -0.1763281
# }