大数跨境
0
0

【生存机器】R语言80行代码实现加速失效时间模型(AFT)拟合、预测与可视化

【生存机器】R语言80行代码实现加速失效时间模型(AFT)拟合、预测与可视化 医学统计数据分析
2025-07-11
0
导读:【生存机器】R语言80行代码实现示例数据集加速失效时间模型(AFT)拟合、预测与可视化

【生存机器03】-加速失效时间模型(AFT)




加速失效时间模型(AFT)

加速失效时间模型(AFT)定义与核心思想

加速失效时间模型(Accelerated Failure Time Model, AFT)是生存分析中的一种参数/半参数模型,用于研究协变量对事件发生时间的加速或延缓效应。其核心假设是:协变量通过线性关系改变生存时间的对数尺度,即:

ln(T) = βX + ε

其中,

 T为生存时间,

 X为协变量,

 β为回归系数,

 ε为服从特定分布的误差项(如极值分布、正态分布)。协变量的作用体现为对基准生存时间的尺度调整。

AFT模型因其直观的时间效应解释和灵活的分布假设,成为生存分析中与Cox模型互补的重要工具。其优势在需要直接量化协变量对生存时间影响的场景尤为突出,例如临床决策、工业可靠性优化及金融风险控制。随着计算技术的发展,AFT模型在高维数据、实时流数据及多模态数据中的应用将进一步拓展其边界。




AFT模型的核心特点:

1.直观的时间效应解释

协变量效应直接作用于生存时间,而非风险函数。例如,若某协变量系数为0.2,则生存时间平均延长约22%。

区别于Cox模型的相对风险比,AFT更易被非统计背景的研究者理解。

2.灵活的参数化选择

支持多种生存时间分布假设(如Weibull、对数正态、Log-Logistic),通过AIC或残差检验选择最优分布。

半参数AFT(如基于秩回归)可放宽分布假设,提升稳健性。

3.处理复杂数据的能力

兼容右删失、区间删失及竞争风险数据。

通过正则化方法(如Adaptive Elastic Net)处理高维数据(如基因表达数据)。

4.不依赖比例风险假设

当Cox模型的比例风险假设不成立时(如风险函数随时间变化),AFT模型是更优选择。



AFT模型的主要应用领域

AFT模型在医学研究、工业可靠性、金融风险、基因分析、社会科学等领域均有应用:




AFT模型的扩展与前沿应用

1.贝叶斯AFT模型

结合空间信息(如地理分布)分析生存时间的空间异质性(如前列腺癌患者生存率的区域差异)。

2.多模态AFT模型

整合基因、影像等多模态数据,提升预后预测精度(如阿尔茨海默病病程预测)。

3.流数据实时分析

通过在线更新算法处理实时生存数据(如金融交易中的动态风险监控)。

4.竞争风险AFT模型

处理多事件竞争风险(如癌症患者中复发与死亡的竞争关系)。




那么我们今天,仍以熟悉的示例数据集为例,简单展示一下加速失效时间模型(Accelerated Failure Time Model, AFT)的R语言实现。




#环境准备与数据加载

#环境整理

rm(list=ls()) #移除所有变量数据

install.packages("") #安装包

library() #加载包

#一、数据预处理

## 加载必要包

library(survival)

library(readxl)

library(survminer)

library(ggplot2)

# 读取Excel数据(假设文件路径为桌面)

data <- read_excel("C:/Users/hyy/Desktop/示例数据.xlsx")

# 查看数据结构(确认time为时间变量,status为0/1结局变量)

str(data)

# 处理缺失值(若存在)

data <- na.omit(data)

# 将分类变量转为因子(若指标中存在分类变量,如指标8)

data$指标8 <- as.factor(data$指标8)

# 标准化连续变量(可选,AFT对尺度敏感时可执行)

#data[, c("指标1", "指标2", "指标3", "指标4", "指标5")] <- scale(data[, c("指标1", "指标2", "指标3", "指标4", "指标5")])




#二、AFT模型拟合

#1. 基础模型拟合(Weibull分布)

aft_model <- survreg(

  Surv(时间, 结局) ~ 指标1 + 指标2 + 指标3 + 指标4 + 指标5 + 指标6 + 指标7 + 指标8,

  data = data,

  dist = "weibull"  # 可替换为"exponential"/"lognormal"/"loglogistic"

)

# 输出模型摘要(重点查看系数、p值、尺度参数)

summary(aft_model)





#2. 分布选择(通过AIC比较)

dists <- c("weibull", "exponential", "lognormal", "loglogistic")

aic_values <- sapply(dists, function(d) {

  model <- survreg(Surv(时间, 结局) ~ ., data = data, dist = d)

  AIC(model)

})

data.frame(Distribution = dists, AIC = aic_values)




#三、模型评估与可视化

#1. 生存曲线拟合

# 预测中位生存时间

median_time <- predict(aft_model, type = "quantile", p = 0.5)

data$pred_median <- median_time

# 绘制Kaplan-Meier曲线与模型预测曲线对比

km_fit <- survfit(Surv(时间, 结局) ~ 1, data = data)

ggsurvplot(km_fit, data = data, risk.table = TRUE, title = "Kaplan-Meier曲线")





# 添加模型预测曲线

times <- seq(0, max(as.numeric(data$时间)), length.out = 1000)

pred_surv <- 1 - psurvreg(times, aft_model[["linear.predictors"]])  # 生存概率

plot(times, pred_surv, type = "l", col = "red", xlab = "Time", ylab = "Survival Probability")

lines(km_fit, conf.int = FALSE, col = "blue")

legend("topright", legend = c("AFT预测", "KM观测"), col = c("red", "blue"), lty = 1)




#2. 残差分析

# 计算残差(Cox-Snell残差)

residuals <- residuals(aft_model, type = "response")

ggplot(data, aes(x = residuals)) + 

  geom_histogram(bins = 30, fill = "steelblue") +

  labs(title = "AFT模型残差分布")




#3. 模型诊断(似然比检验)

# 比较完整模型与简化模型(例如剔除指标6)

reduced_model <- survreg(Surv(时间, 结局) ~ 指标1 + 指标2 + 指标3 + 指标4 + 指标5, 

                         data = data, dist = "weibull")

anova_result <- anova(aft_model, reduced_model)

print(anova_result)  # 若p<0.05说明完整模型更优




#四、预测与结果输出

# 新样本预测(示例数据)

new_data <- data.frame(

  指标1 = 0.5, 指标2 = -1.2, 指标3 = 2.3, 指标4 = 0.8, 

  指标5 = 1.5, 指标6 = 3.5, 指标7 = 5.5, 指标8 = "是")

pred_time <- predict(aft_model, newdata = new_data, type = "quantile", p = 0.5)

cat("预测中位生存时间:", exp(pred_time), "\n")


# 输出变量重要性(系数绝对值排序)

coef_df <- data.frame(

  Variable = names(coef(aft_model))[-1],  # 排除截距项

  Coef = exp(coef(aft_model)[-1])         # 转换为时间加速因子

)

coef_df[order(-abs(coef_df$Coef)), ]






医学统计数据分析分享交流SPSS、R语言、Python、ArcGis、Geoda、GraphPad、数据分析图表制作等心得。承接数据分析,论文修回,医学统计,机器学习,生存分析,空间分析,问卷分析业务。若有投稿和数据分析代做需求,可以直接联系我,谢谢!



【声明】内容源于网络
0
0
医学统计数据分析
分享交流SPSS、R语言、Python、ArcGis、Geoda、GraphPad、数据分析图表制作等心得。承接数据分析,论文返修,医学统计,空间分析,机器学习,生存分析,时间序列,时空面板,深度学习,问卷分析等业务。公众号右下角可联系作者
内容 323
粉丝 0
医学统计数据分析 分享交流SPSS、R语言、Python、ArcGis、Geoda、GraphPad、数据分析图表制作等心得。承接数据分析,论文返修,医学统计,空间分析,机器学习,生存分析,时间序列,时空面板,深度学习,问卷分析等业务。公众号右下角可联系作者
总阅读9
粉丝0
内容323