
Dependent-Censoring Transformation Inference for Survival Responses
Source:R/inference_survival_dep_cens_transform.R
InferenceSurvivalDepCensTransformRegr.RdFits a joint bivariate log-normal transformation model for a latent event
time \(T^E_i\) and a latent censoring time \(T^C_i\) that are allowed
to be dependent (a violation of the usual independent-censoring
assumption): \(\log T^E_i = X_i^\top \beta_{\mathrm{event}} +
\sigma_{\mathrm{event}} \epsilon^E_i\), \(\log T^C_i = X_i^\top
\beta_{\mathrm{cens}} + \sigma_{\mathrm{cens}} \epsilon^C_i\), with
\((\epsilon^E_i, \epsilon^C_i)\) jointly standard bivariate normal with
correlation \(\rho\) (estimated via an atanh-reparameterized,
clamped nuisance parameter). \(X_i\) includes the treatment indicator
\(W_i\) as its first column, so \(\hat\beta_T\) (the first entry of
\(\hat\beta_{\mathrm{event}}\)) is a log-time-ratio for the
event submodel, on the same AFT interpretation scale as
InferenceSurvivalWeibullRegr
but log-normal rather than Weibull, and jointly modeling the censoring
mechanism rather than assuming it independent. This is the correct tool
when censoring is suspected to depend on the same latent factors driving
the event time (e.g. sicker patients are both more likely to be censored
— dropout — and more likely to fail early), a scenario under which
ordinary Kaplan-Meier/Cox/AFT methods (which assume independent
censoring) are biased. likelihood_tier = "full": likelihood-ratio,
score, gradient, and Wald tests are available when the model converges,
plus parametric-likelihood-bootstrap calibration of the likelihood-ratio
test. Substantial method-support limitations, all deliberate:
randomization inference and jackknife bias correction/standard errors are
hard-unsupported (each randomization draw would require a full
dependent-censoring likelihood refit, too unstable/slow for the
comprehensive test suite; jackknife bias correction is unstable for this
likelihood on small censored samples) — every jackknife/randomization
method returns NA and marks the result nonestimable rather than
computing a value. Nonparametric-bootstrap confidence intervals are
computed and returned whenever both endpoints are finite; they are never
replaced based on width, sign, or agreement with a Wald interval. Numerical
failures return NA. Bayesian-bootstrap weighted re-estimation
uses a fast Cox-model surrogate fit (weighted_cox_bootstrap_surrogate_fit())
as an approximation rather than a full weighted joint-likelihood refit.
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.
See also
InferenceSurvivalGLMMWeibullFrailtyLoggammaOneLik
for a different (Clayton-copula, KK-design) approach to dependence
between two survival-type quantities.
Survival
analysis (Wikipedia, general orientation; no direct Wikipedia page for
dependent-censoring copula/transformation models specifically).
Super class
Inference -> InferenceSurvivalDepCensTransformRegr
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()
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 = InferenceSurvivalDepCensTransformRegr$new(seq_des)
inf$compute_estimate()
#> [1] 0.905532
# }