
Weibull AFT Inference for Survival Responses
Source:R/inference_survival_weibull.R
InferenceSurvivalWeibullRegr.RdFits a Weibull Accelerated Failure Time (AFT) model for survival responses:
\(\log T_i = \beta_0 + \beta_T W_i + X_i^\top \gamma + \sigma \epsilon_i\),
\(\epsilon_i \sim\) standard extreme-value (Gumbel-minimum), so that
\(T_i\) is marginally Weibull-distributed with shape \(1/\sigma\) and
treatment-dependent scale, by maximum likelihood
(fast_weibull_regression_cpp). \(\hat\beta_T\) is a
log-time-ratio (log acceleration factor): \(\exp(\hat\beta_T)\)
is the estimated multiplicative effect of treatment on survival time (an
AFT model, not a proportional-hazards model — the Weibull distribution is
the one location where AFT and proportional-hazards parameterizations
coincide, since \(\exp(-\beta_T/\sigma)\) also equals the treatment
hazard ratio). likelihood_tier = "full": likelihood-ratio, score,
gradient, and Wald tests are all available when the model converges, plus
parametric-likelihood-bootstrap calibration of the likelihood-ratio test.
Right-censored and interval-censored observations enter the likelihood via
their appropriate survival/density contributions. Validity requires the
Weibull shape assumption for the (log-)survival-time distribution and,
when interpreted causally, the usual design-based/model-based assumptions.
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
Kalbfleisch, J. D., and Prentice, R. L. (2002). The
Statistical Analysis of Failure Time Data (2nd ed.). Wiley, for the
Weibull AFT model and its equivalence to a proportional-hazards model.
For the randomization confidence interval
(compute_rand_confidence_interval()), which inverts an AFT sharp
null by rescaling the recorded times of treated units — event and
censoring times alike, censoring indicators unchanged — the residual
construction and its validity under independent censoring are from
Tsiatis, A. A. (1990). Estimating regression parameters using linear rank
tests for censored data. The Annals of Statistics, 18(1), 354-372,
doi:10.1214/aos/1176347504
; Wei, L. J., Ying, Z., and Lin, D. Y. (1990).
Linear regression analysis of censored survival data based on rank tests.
Biometrika, 77(4), 845-851, doi:10.1093/biomet/77.4.845
; and Jin,
Z., Lin, D. Y., Wei, L. J., and Ying, Z. (2003). Rank-based inference for
the accelerated failure time model. Biometrika, 90(2), 341-353,
doi:10.1093/biomet/90.2.341
.
See also
Comparable Python API: lifelines WeibullAFTFitter. See also: Proportional hazards model (Wikipedia, for the AFT/PH equivalence note).
Super class
Inference -> InferenceSurvivalWeibullRegr
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()
InferenceSurvivalWeibullRegr$approximate_randomization_distribution_beta_hat_T()
Usage
InferenceSurvivalWeibullRegr$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 = DesignSeqOneByOneBernoulli$new(n = 10, response_type = 'survival')
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(runif(10))
inf = InferenceSurvivalWeibullRegr$new(seq_des)
inf$compute_estimate()
#> [1] 0.2039519
# }
# \donttest{
inf$set_seed(1)
inf$compute_lik_ratio_bootstrap_two_sided_pval(delta = 0, B = 9, show_progress = FALSE)
#> [1] 0.6
# }