Accelerated Failure Time (AFT) models model time-to-event data directly, yet many analysts stumble over common pitfalls. Unlike semi-parametric approaches, AFT expresses effects as multipliers on time, which many stakeholders find easy to read. This guide covers practical steps and fixes, and includes a simulated example you can rerun.
What is Accelerated Failure Time (AFT)?
Accelerated Failure Time is a parametric approach to survival analysis that models the relationship between covariates and the time until an event occurs. The fundamental idea is simple: certain factors "accelerate" or "decelerate" the time to an event by a constant multiplicative factor.
Think of it this way: if a machine component fails after 1000 hours in a baseline setting (a made-up number), a harsher environment might shorten that to 500 hours, so time passes twice as fast, while a better lubricant might stretch it to 1500 hours, so time is 1.5 times slower.
Mathematically, an AFT model assumes that the survival time T for an individual with covariates X relates to a baseline survival time T₀ through:
log(T) = μ + β₁X₁ + β₂X₂ + ... + βₚXₚ + σε
Where μ is the intercept, β coefficients represent the effect of covariates, σ is the scale parameter, and ε is the error term following a specified distribution. The exponential of each coefficient exp(βᵢ) gives the acceleration factor for that covariate.
Why AFT Suits Time Predictions
AFT models directly predict survival times, which suits questions like "How long until this customer churns?" or "When should we schedule maintenance?" Hazard-based models need an extra step to produce time predictions, while AFT gives them directly.
When to Use This Technique
Accelerated Failure Time models suit scenarios where their assumptions align with the underlying data-generating process. It helps to know when AFT fits better than alternative survival analysis methods.
Ideal Use Cases
Customer Lifetime Value Prediction: When modeling customer retention, AFT naturally answers "How long will this customer stay?" Different customer segments might experience time at different rates: premium customers might have "slower clocks" leading to longer retention.
Equipment Maintenance Planning: Manufacturing and operations teams need to know when equipment will fail. AFT models can predict failure times based on operating conditions, usage intensity, and maintenance history, enabling proactive scheduling.
Clinical Study Design: In medical research, AFT models help predict patient survival times under different treatment regimens. The acceleration factor interpretation (where a treatment might extend median survival by a factor such as 1.5) communicates clearly to clinical teams.
Software Release Planning: Predicting time-to-bug-discovery or time-to-feature-adoption allows development teams to allocate resources effectively. AFT can model how team size or code review processes "accelerate" the discovery timeline.
When to Consider Alternatives
Choose Cox proportional hazards models when you cannot validate parametric distribution assumptions or when you have time-varying covariates. Opt for discrete-time models when events occur at fixed intervals (monthly subscription cancellations). Consider non-parametric methods like Kaplan-Meier when you need purely exploratory analysis without predictions.
AFT needs enough events to estimate the distribution parameters, and estimates get steadier as the number of events grows. With few events, simpler models may be more appropriate.
Worked Example (Simulated): Recovering a Time Ratio from Censored Data
Question: can a Weibull AFT model fitted by maximum likelihood recover a known effect on survival time when more than half of the observations are censored? Inputs: simulated data, seed 3, 1000 subjects with one binary covariate x (about half 1, half 0). True model built in: log(scale) = 2.0 + 0.5 x with Weibull shape 1.5, so the true time ratio for x = 1 versus x = 0 is exp(0.5) = 1.649. Each subject has an independent censoring time drawn uniformly from 0 to 14; the observed time is the smaller of the event and censoring times. Method: minimize the negative Weibull log-likelihood (events contribute the density, censored subjects the survival function) with scipy minimize, estimating the intercept, the x coefficient and the shape, and compare the fitted time ratio with the built-in one and with raw mean observed times, which ignore censoring.
import numpy as np
from scipy.optimize import minimize
rng = np.random.default_rng(3)
n, beta0, beta1, shape = 1000, 2.0, 0.5, 1.5
x = rng.integers(0, 2, n)
scale = np.exp(beta0 + beta1 * x)
t_true = scale * rng.weibull(shape, n)
cens = rng.uniform(0, 14, n)
t = np.minimum(t_true, cens)
d = (t_true <= cens).astype(float)
print("n", n, "events", int(d.sum()), "censored", int(n - d.sum()))
def nll(p):
b0, b1, logk = p
k = np.exp(logk)
z = t / np.exp(b0 + b1 * x)
ll = d * (np.log(k) - np.log(t) + k * np.log(z)) - z ** k
return -ll.sum()
fit = minimize(nll, [1.0, 0.0, 0.0], method="Nelder-Mead",
options={"xatol": 1e-6, "fatol": 1e-8, "maxiter": 4000})
b0, b1, logk = fit.x
print("built in : b0=2.0 b1=0.5 shape=1.5 time ratio=%.3f" % np.exp(0.5))
print("estimated: b0=%.3f b1=%.3f shape=%.3f" % (b0, b1, np.exp(logk)))
print("estimated time ratio exp(b1) = %.3f" % np.exp(b1))
print("naive mean observed time, x=0: %.2f, x=1: %.2f"
% (t[x == 0].mean(), t[x == 1].mean()))
Printed output:
n 1000 events 445 censored 555
built in : b0=2.0 b1=0.5 shape=1.5 time ratio=1.649
estimated: b0=2.003 b1=0.431 shape=1.514
estimated time ratio exp(b1) = 1.538
naive mean observed time, x=0: 4.35, x=1: 5.14
Result. Of 1000 subjects, 445 had events and 555 were censored. The fitted coefficients were 2.003 for the intercept (built in 2.0), 0.431 for x (built in 0.5) and 1.514 for the shape (built in 1.5). The estimated time ratio exp(b1) was 1.538 against the built-in 1.649, so the model recovered the direction and rough size of the effect but understated it in this run. The raw mean observed times were 4.35 for x=0 and 5.14 for x=1, a gap that reflects censoring as well as the effect and so is not an estimate of the time ratio.
Limit. This is one simulated run with a correctly specified Weibull model, one covariate and a 0.07 gap between the estimated and built-in coefficient that may be sampling noise; no confidence interval is computed here. It shows how an AFT coefficient and time ratio are read, not how any real data behaves.
How AFT Works: The Mathematical Foundation
The power of AFT lies in its parametric foundation. By assuming survival times follow a specific probability distribution, AFT can be more efficient than semi-parametric methods when the assumed distribution is right.
Core Distributional Assumptions
Weibull Distribution: A common choice, Weibull handles monotonically increasing or decreasing hazard rates. It includes the exponential distribution as a special case when the shape parameter equals 1. Weibull works well for equipment failure and customer churn where risk increases or decreases consistently over time.
Log-Normal Distribution: When hazards are unimodal (increasing initially then decreasing), log-normal is a candidate.
Log-Logistic Distribution: Similar to log-normal but with heavier tails, log-logistic models situations where hazards initially increase then decrease. It has a closed-form survival function, making calculations simpler than log-normal.
Exponential Distribution: The simplest case assumes constant hazard over time. While rarely realistic, exponential models serve as useful baselines and work for processes where event risk remains truly constant.
The Acceleration Factor Interpretation
AFT's main strength is interpretability. Each coefficient β translates directly to an acceleration factor through exponentiation. If β₁ = 0.5 for a binary variable (treatment vs. control), then exp(0.5) = 1.65, meaning the treatment group experiences time 1.65 times slower: their median survival is 65% longer.
Negative coefficients indicate acceleration (shorter times), while positive coefficients indicate deceleration (longer times). This direct interpretation can help when communicating with non-technical stakeholders.
Step-by-Step Implementation Process
Implementing AFT models successfully requires a systematic approach that balances statistical rigor with practical considerations. Follow this workflow to avoid common pitfalls.
Step 1: Data Preparation and Validation
Start by structuring your data with three essential columns: the time variable (duration until event or censoring), the event indicator (1 for event, 0 for censored), and your covariates. Validate that times are strictly positive: AFT models cannot handle zero or negative durations.
# Python example with lifelines
import pandas as pd
from lifelines import WeibullAFTFitter
# Prepare data
df = pd.read_csv('customer_data.csv')
df['duration'] = df['end_date'] - df['start_date']
df['event'] = df['churned'].astype(int)
# Validate positive durations
assert (df['duration'] > 0).all(), "All durations must be positive"
Examine your censoring pattern. Right censoring (observation ends before event) is standard, but verify that censoring is non-informative: customers who move addresses (censored) shouldn't systematically differ in churn risk from those who remain observable.
Step 2: Exploratory Analysis
Before fitting any parametric model, visualize your data using Kaplan-Meier survival curves. This non-parametric view reveals the shape of your survival function and suggests appropriate distributions.
from lifelines import KaplanMeierFitter
kmf = KaplanMeierFitter()
kmf.fit(durations=df['duration'], event_observed=df['event'])
kmf.plot_survival_function()
# Stratify by key covariates
for segment in df['customer_tier'].unique():
mask = df['customer_tier'] == segment
kmf.fit(df.loc[mask, 'duration'], df.loc[mask, 'event'], label=segment)
kmf.plot_survival_function()
Look for crossing survival curves, which might violate AFT assumptions. Examine the hazard pattern: is it increasing, decreasing, or non-monotonic? This guides distribution selection.
Step 3: Distribution Selection and Model Fitting
Fit multiple candidate distributions and compare using Akaike Information Criterion (AIC) or Bayesian Information Criterion (BIC). Lower values indicate better fit, balancing model complexity and likelihood.
from lifelines import WeibullAFTFitter, LogNormalAFTFitter, LogLogisticAFTFitter
models = {
'Weibull': WeibullAFTFitter(),
'LogNormal': LogNormalAFTFitter(),
'LogLogistic': LogLogisticAFTFitter()
}
results = {}
for name, model in models.items():
model.fit(df, duration_col='duration', event_col='event')
results[name] = {
'AIC': model.AIC_,
'BIC': model.BIC_,
'concordance': model.concordance_index_
}
# Select best model
best_model = min(results, key=lambda x: results[x]['AIC'])
print(f"Best model: {best_model}")
Easy Fix: Dealing with Model Selection Uncertainty
When AIC/BIC values are close (within 2-3 points), don't agonize over the choice. Instead, perform sensitivity analysis by making predictions with all candidate models. If predictions are similar, the choice matters little. If predictions diverge substantially, collect more data or use ensemble averaging across models.
Step 4: Model Diagnostics
Check residuals before trusting a model. AFT models should produce residuals that follow the assumed error distribution. Use quantile-quantile (QQ) plots to verify:
import matplotlib.pyplot as plt
import numpy as np
from scipy import stats
# Extract standardized residuals
residuals = model.compute_residuals(df, 'duration', 'event')
# QQ-plot against theoretical distribution
stats.probplot(residuals, dist="norm", plot=plt)
plt.title("QQ-Plot: Residuals vs. Normal Distribution")
plt.show()
Systematic deviations from the diagonal line indicate distribution misspecification. Also check for patterns in residuals vs. fitted values: randomness suggests an acceptable fit, while patterns suggest missing covariates or non-linear relationships.
Step 5: Coefficient Interpretation and Validation
Extract coefficients and convert to acceleration factors. Validate that signs make intuitive sense: if premium customers have positive coefficients (longer survival), that confirms business understanding.
# Display acceleration factors
coef_summary = model.summary
coef_summary['acceleration_factor'] = np.exp(coef_summary['coef'])
print(coef_summary[['coef', 'acceleration_factor', 'p']])
Perform out-of-sample validation by splitting data temporally: train on early periods, test on recent periods. Calculate concordance index (C-index) on holdout data; values above 0.7 indicate good discrimination between high and low risk individuals.
Interpreting Results: From Coefficients to Decisions
Statistical output means nothing until translated into actionable insights. AFT models provide several layers of interpretation that support data-driven decision-making.
Understanding Acceleration Factors
Consider a customer churn model with these made-up results:
- Premium Tier: β = 0.40, acceleration factor = 1.49
- Monthly Support Contacts: β = -0.15, acceleration factor = 0.86
- Feature Usage Score: β = 0.25, acceleration factor = 1.28
Translation: Premium tier customers experience time 1.49x slower: their median survival is 49% longer. In this made-up example, each additional monthly support contact multiplies time by 0.86 and each unit increase in feature usage score multiplies it by 1.28.
These factors compound multiplicatively. A premium customer with high feature usage but frequent support contacts has a combined acceleration factor of 1.49 × 1.28 × 0.86^n, where n is the number of support contacts.
Making Predictions
AFT models predict both median survival times and full survival curves for new observations:
# Predict median survival time for new customers
new_customers = pd.DataFrame({
'premium_tier': [1, 0],
'support_contacts': [2, 5],
'feature_usage': [8.5, 3.2]
})
median_survival = model.predict_median(new_customers)
print(f"Predicted median survival: {median_survival.values} months")
# Get full survival curve
survival_func = model.predict_survival_function(new_customers)
survival_func.plot()
Use these predictions for segmentation: identify high-risk customers for retention campaigns, or schedule proactive maintenance for equipment likely to fail soon.
Confidence Intervals and Uncertainty
Report uncertainty alongside point estimates. Bootstrap confidence intervals reveal prediction reliability:
# Bootstrap confidence intervals for predictions
from lifelines.utils import median_survival_times
bootstrap_samples = []
for i in range(100):
sample_df = df.sample(n=len(df), replace=True)
boot_model = WeibullAFTFitter()
boot_model.fit(sample_df, duration_col='duration', event_col='event')
bootstrap_samples.append(boot_model.predict_median(new_customers))
ci_lower = np.percentile(bootstrap_samples, 2.5, axis=0)
ci_upper = np.percentile(bootstrap_samples, 97.5, axis=0)
print(f"95% CI: [{ci_lower}, {ci_upper}]")
Wide confidence intervals signal uncertain predictions: either collect more data or simplify the model by removing weak predictors.
Illustrative Scenario: E-Commerce Customer Retention (Hypothetical)
Let's walk through a hypothetical customer retention analysis for an e-commerce platform. Every number in this scenario is made up for illustration; for measured numbers, see the simulated worked example above. The business question: which factors most influence customer lifetime, and how can we identify at-risk customers early?
The Dataset
Suppose there are 5,000 customers tracked over 24 months with the following variables:
- Subscription tier (Basic, Premium, Enterprise)
- Initial purchase amount
- Number of purchases in first 30 days
- Email engagement score (0-10)
- Customer support ticket count
- Mobile app user (yes/no)
Suppose 1,847 of these customers have churned (event = 1), while 3,153 remain active (censored = 0).
Implementation
# Load and prepare data
df = pd.read_csv('ecommerce_customers.csv')
df['duration_months'] = (df['last_active_date'] - df['signup_date']).dt.days / 30
df['churned'] = (~df['is_active']).astype(int)
# Encode categorical variables
df['tier_premium'] = (df['tier'] == 'Premium').astype(int)
df['tier_enterprise'] = (df['tier'] == 'Enterprise').astype(int)
# Fit multiple models
weibull = WeibullAFTFitter()
weibull.fit(df, duration_col='duration_months', event_col='churned')
lognormal = LogNormalAFTFitter()
lognormal.fit(df, duration_col='duration_months', event_col='churned')
print(f"Weibull AIC: {weibull.AIC_:.2f}")
print(f"LogNormal AIC: {lognormal.AIC_:.2f}")
# Weibull wins with lower AIC
model = weibull
Key Findings
A Weibull model fitted to data like this could produce acceleration factors such as these (made up):
- Premium tier: 1.52x (52% longer retention)
- Enterprise tier: 2.18x (118% longer retention)
- First-month purchases: 1.12x per purchase
- Email engagement: 1.08x per point
- Support tickets: 0.89x per ticket
- Mobile app user: 1.34x
Business Impact
Factors like these could suggest actions such as:
1. Mobile App Promotion: A 1.34 factor for mobile app usage could motivate a campaign offering Basic tier customers a free month for downloading the app, though app users may differ from other customers in ways the model does not capture.
2. First-Month Engagement Program: A 1.12 factor per first-month purchase could motivate a "30-day challenge" with progressive discounts, to be tested before rollout.
3. Support Ticket Root Cause Analysis: A 0.89 factor per support ticket could suggest that tickets signal problems rather than engagement, which would point to reducing the issues that generate tickets.
Note on This Scenario
These are correlational patterns from a hypothetical dataset. Any action based on them should be tested, for example with an experiment, before it is treated as causal.
Best Practices and Common Pitfalls to Avoid
Success with AFT models comes from avoiding common mistakes and checking assumptions.
Best Practices for AFT Success
Validate Distribution Assumptions: Don't default to Weibull because it's popular. Take the time to fit multiple distributions and check residuals, which guards against a poorly chosen distribution.
Start Simple, Then Expand: Begin with univariate models for each covariate. This baseline reveals which variables matter before you build complex multivariate models. It also helps detect collinearity early.
Use Domain Knowledge for Feature Engineering: AFT models assume multiplicative effects. Create interaction terms when you know factors combine (e.g., heavy usage in harsh conditions accelerates equipment failure more than the sum of individual effects).
Temporal Validation Over Random Splits: Time-to-event data has temporal structure. Validate on future data where you can, not only on random holdout samples. A model that predicts one year well but fails on the next is of limited use for future decisions.
Report Uncertainty: Point predictions without confidence intervals mislead stakeholders. Include uncertainty bands on survival curves and confidence intervals on median predictions. This builds appropriate trust in your models.
Document Censoring Assumptions: Clearly state why you believe censoring is non-informative. If customers who move to unmeasured regions differ systematically from those who remain observable, your estimates will be biased. Test sensitivity by treating uncertain cases differently.
Common Pitfalls and Easy Fixes
Pitfall 1: Ignoring the AFT Assumption
AFT requires covariates to have multiplicative effects on survival time. If a covariate shifts survival curves but doesn't maintain their shape, AFT assumptions fail.
Easy Fix: Plot stratified Kaplan-Meier curves for categorical variables or quintiles of continuous variables. If curves cross or diverge in non-proportional ways, consider adding interaction terms with time or using stratified models.
Pitfall 2: Extrapolating Beyond Observed Data
Parametric models make strong assumptions about tail behavior. Predicting beyond your maximum observed time is dangerous.
Easy Fix: Add confidence bands to predictions and highlight extrapolation regions. For critical decisions requiring long-term predictions, consider combining AFT with non-parametric approaches for the tail.
Pitfall 3: Treating Small P-Values as Effect Sizes
Statistical significance doesn't equal practical importance. With large samples, tiny effects achieve p < 0.05.
Easy Fix: Focus on acceleration factors and confidence intervals. A factor of 1.02 (2% effect) might be statistically significant but operationally irrelevant. Set minimum meaningful effect sizes based on business impact.
Pitfall 4: Forgetting to Check Proportional Effects
AFT assumes covariate effects are proportional across all time points: a customer segment that survives 1.5x longer does so throughout their lifecycle.
Easy Fix: Test this by fitting separate models on early vs. late time periods. If acceleration factors differ substantially, consider time-stratified models or alternative approaches like Cox regression with time interactions.
Pitfall 5: Overfitting with Too Many Covariates
Including every available variable leads to unstable estimates, especially with limited events.
Easy Fix: Keep the number of covariates modest relative to the number of events, since each extra covariate adds a parameter to estimate. Prioritize variables with strong univariate relationships and domain relevance. Consider penalized regression methods (Lasso AFT) when you have many candidates.
Pitfall Fix: Residual Plots
Many AFT problems show up in residual plots. Examine QQ-plots and residual vs. fitted plots after every model fit. Patterns in these plots can indicate distribution misspecification, missing covariates, or violated assumptions: catching issues before they derail your project.
Related Techniques in Survival Analysis
AFT exists within a rich ecosystem of survival analysis methods. Understanding alternatives helps you choose the right tool for each problem.
Cox Proportional Hazards Models
A widely used survival analysis method, Cox proportional hazards models predict hazard ratios rather than survival times. Cox is semi-parametric: it doesn't assume a distribution for survival times, only that hazard ratios remain constant over time.
Choose Cox over AFT when you cannot validate parametric assumptions, have time-varying covariates, or primarily care about relative risk rather than absolute time predictions. Cox makes fewer distributional assumptions but can be less efficient than AFT when AFT assumptions hold.
Kaplan-Meier Estimation
This non-parametric method estimates survival curves without any assumptions about distributions or covariate effects. Use Kaplan-Meier for exploratory analysis, small samples where parametric assumptions are risky, or when you need to report simple survival statistics without predictions.
Kaplan-Meier provides no predictions for new individuals; it only describes your sample. It's a starting point, not a final analysis for decision-making.
Random Survival Forests
A machine learning approach that ensembles survival trees, random survival forests handle non-linear relationships and interactions automatically. They make few assumptions about the shape of the relationship.
The tradeoff: interpretability. While AFT gives you clear acceleration factors, random forests produce black-box predictions. Use forests when prediction accuracy matters more than understanding mechanisms, or combine them with AFT.
Cure Models
When a fraction of your population will never experience the event (long-term survivors), cure models explicitly model this mixture. They combine a logistic component (cured vs. susceptible) with a survival component (time to event for susceptible individuals).
AFT assumes everyone eventually experiences the event given infinite follow-up. If your Kaplan-Meier curves plateau above zero, consider cure models instead.
Multi-State Models
When individuals transition through multiple states (healthy → diseased → death, or free plan → paid → churned), multi-state models track all transitions. AFT only handles single transitions from entry to event.
Use multi-state models when intermediate states matter for decision-making, such as identifying customers at risk of downgrading before full churn.
Practical Implementation Checklist
Before deploying AFT models in production, verify you've covered these essential steps:
- ✓ Checked positive survival times and proper censoring indicators
- ✓ Examined Kaplan-Meier curves for overall patterns and by key segments
- ✓ Fitted several candidate distributions and compared using AIC/BIC
- ✓ Checked QQ-plots and residual plots for the selected model
- ✓ Confirmed AFT assumptions using stratified survival curves
- ✓ Calculated acceleration factors with confidence intervals for all covariates
- ✓ Checked predictions on temporally holdout data
- ✓ Documented censoring assumptions and sensitivity tests
- ✓ Created visualizations showing prediction uncertainty
- ✓ Translated statistical findings into business recommendations
Writing this up for publication? See statistical analysis for researchers. Citations and R code included.
Conclusion: From Theory to Data-Driven Action
Accelerated Failure Time models put survival analysis in a form that is easy to read as time multipliers. Starting with simple univariate models, checking distributions and running systematic diagnostics helps avoid common pitfalls.
Distribution checks, residual diagnostics and temporal validation help catch problems before a model is used, and help show whether it works on future data and not just historical samples.
Remember that AFT's strength lies in interpretability and direct time predictions. When stakeholders ask "How long until this customer churns?" or "When should we schedule maintenance?", AFT answers them directly. The acceleration factor framework translates naturally to business language: for example, a group may survive 1.5 times as long, or equipment may fail twice as fast.
Start your next survival analysis project with this simple workflow: explore with Kaplan-Meier, fit multiple AFT distributions, validate with residuals, and test on future data. The fixes described here (sensitivity analysis for close AIC values, temporal validation instead of random splits, focus on acceleration factors over p-values) address common failure points.
As you gain experience, you'll develop intuition for distribution selection and recognize patterns in residual plots instantly. Until then, follow the checklist systematically. Every skipped step is a potential failure point. Every checked assumption is confidence in your conclusions.
Start simple, validate thoroughly, and read the acceleration factors alongside their uncertainty.
Your turn
Bring your own data and the question you actually need answered.
MCP AnalyticsData science by email Send us your data and your question, and we will reply. ds@mcpanalytics.ai
Frequently Asked Questions
What is the main difference between AFT and Cox Proportional Hazards models?
AFT models directly predict survival time and assume covariates accelerate or decelerate the time to event, making coefficients easier to interpret. Cox models predict hazard ratios and assume proportional hazards over time. AFT is fully parametric while Cox is semi-parametric, making AFT more efficient when the distribution assumption is correct but less robust when assumptions fail.
When should I use AFT instead of other survival analysis methods?
Use AFT when you want direct time predictions, when covariates have multiplicative effects on survival time, when you need easier interpretation for business stakeholders, or when you have sufficient data to validate parametric assumptions. AFT is useful for customer lifetime predictions, equipment maintenance planning, and clinical study design where absolute time predictions matter more than relative risk comparisons.
What are the most common pitfalls when implementing AFT models?
Common pitfalls include choosing the wrong distribution without validation, ignoring residual diagnostics, extrapolating beyond observed data, overlooking censoring mechanisms, and failing to check the AFT assumption that covariate effects remain proportional over time. Validate your distribution choice using AIC/BIC, examine residual plots, and verify that covariates truly have multiplicative effects on survival time.
How do I choose the right distribution for my AFT model?
Start by plotting your survival data using Kaplan-Meier curves to understand the hazard pattern. Then fit multiple distributions (Weibull, log-normal, log-logistic, exponential) and compare using AIC/BIC values: lower is better. Examine residual plots and QQ-plots to verify distributional fit. Weibull is versatile for monotonic hazards, log-normal for unimodal hazards, and log-logistic when hazards decrease after an initial increase. Validate your choice using holdout data.
Can AFT models handle time-varying covariates?
Standard AFT models assume time-independent covariates: the variables' values don't change during follow-up. While extensions exist for time-varying covariates, they are complex and less commonly implemented in standard software packages. If you have time-varying covariates (like changing treatment dosage or evolving customer behavior), consider using Cox proportional hazards models or time-dependent Cox models, which handle this scenario more naturally.