Skip to contents

Fits a joint model that simultaneously analyzes longitudinal biomarker trajectories and time-to-event outcomes using ordinary differential equations (ODEs). This approach captures complex temporal dynamics in biomarker evolution while quantifying their association with survival through shared parameters.

Usage

JointODE(
  longitudinal_formula,
  longitudinal_data,
  survival_formula,
  survival_data,
  id = "id",
  time = "time",
  spline_baseline = list(degree = 3, n_knots = 5, knot_placement = "quantile",
    boundary_knots = NULL),
  spline_index = list(degree = 3, n_knots = 4, knot_placement = "quantile",
    boundary_knots = NULL),
  control = list(),
  ...
)

Arguments

longitudinal_formula

Formula for the longitudinal submodel. Left side specifies the response; right side includes time and covariates (e.g., v ~ x1).

longitudinal_data

Data frame containing longitudinal measurements. Must include multiple observations per subject with columns for subject ID, measurement times, and response values.

survival_formula

Formula for the survival submodel. Must use Surv(time, status) on the left side; right side specifies baseline covariates.

survival_data

Data frame containing survival/event data. Must have exactly one row per subject with event time and status.

id

Character string naming the subject ID variable. Must exist in both datasets (default: "id").

time

Character string naming the time variable in longitudinal data (default: "time").

spline_baseline

List of B-spline configuration for baseline hazard:

degree

Degree of B-spline basis (default: 3)

n_knots

Number of interior knots (default: 5)

knot_placement

Method for knot placement: "quantile" (based on event times) or "equal" (default: "quantile")

boundary_knots

Boundary knots, if NULL uses event range (default: NULL)

spline_index

List of B-spline configuration for single index model:

degree

Degree of B-spline basis (default: 3)

n_knots

Number of interior knots (default: 4)

knot_placement

Method for knot placement: "quantile" (based on index values) or "equal" (default: "quantile")

boundary_knots

Boundary knots, if NULL uses index range (default: NULL)

control

List of optimization control parameters:

method

Optimization algorithm (default: "BFGS")

maxit

Maximum iterations (default: 1000)

tol

Convergence tolerance (default: 1e-6)

verbose

Print progress (default: FALSE)

...

Additional arguments passed to fitting functions.

Value

Object of class "JointODE" containing:

coefficients

Estimated model parameters including longitudinal, survival, and association parameters

logLik

Log-likelihood at convergence

AIC

Akaike Information Criterion

BIC

Bayesian Information Criterion

convergence

Optimization convergence details

fitted

Fitted values for both submodels

residuals

Model residuals

data

Original input data

call

Matched function call

Details

The joint ODE model links longitudinal and survival processes through shared parameters. The longitudinal trajectory is modeled using ODEs to capture non-linear dynamics, while the survival hazard incorporates features of the trajectory (level, slope, or cumulative burden).

Model estimation uses maximum likelihood with numerical integration over random effects via adaptive Gauss-Hermite quadrature.

Note

Input data are automatically validated and processed before fitting. For large datasets or complex ODE systems, consider adjusting control parameters to improve convergence.

Examples

if (FALSE) { # \dontrun{
sim <- simulate()
fit <- JointODE(
  longitudinal_formula = v ~ x1 + x2,
  longitudinal_data = sim$longitudinal_data,
  survival_formula = Surv(time, status) ~ w1 + w2,
  survival_data = sim$survival_data
)
summary(fit)
} # }