如何在R语言中生成Stata stexpect3式的平滑风险图?
在R中复刻Stata stexpect3的平滑风险图(以lung数据集为例)
方法1:调整bshazard参数匹配stexpect3默认设置
Stata的stexpect3默认采用Epanechnikov核,带宽通过自适应方法选择,且会针对分组变量单独估计风险。你之前的代码未匹配这些默认参数,导致结果偏差,修改后的代码如下:
# 加载所需包 library(bshazard) library(survival) # 拟合模型,指定与stexpect3一致的核函数和带宽选择方式 fit <- bshazard(Surv(time, status) ~ sex, data = lung, kernel = "epanechnikov", # 匹配stexpect3默认核函数 bandwidth = "cv") # 交叉验证选带宽,贴近Stata的自适应逻辑 # 绘制分组平滑风险图,调整样式更接近Stata输出 plot(fit, col = c("blue", "red"), lwd = 2, xlab = "生存时间", ylab = "平滑风险", main = "按性别分组的平滑风险图") legend("topright", legend = c("男性(sex=1)", "女性(sex=2)"), col = c("blue", "red"), lwd = 2)
方法2:使用muhaz包(更贴合stexpect3的实现逻辑)
muhaz包的核平滑风险估计逻辑和Stata stexpect3更接近,支持分组单独计算,步骤如下:
library(muhaz) library(survival) # 按性别拆分数据集 male_lung <- subset(lung, sex == 1) female_lung <- subset(lung, sex == 2) # 分别估计两组的平滑风险 haz_male <- muhaz(time = male_lung$time, status = male_lung$status, kernel = "epanechnikov") haz_female <- muhaz(time = female_lung$time, status = female_lung$status, kernel = "epanechnikov") # 合并绘制风险图 plot(haz_male, col = "blue", lwd = 2, xlab = "生存时间", ylab = "平滑风险", main = "按性别分组的平滑风险图") lines(haz_female, col = "red", lwd = 2) legend("topright", legend = c("男性(sex=1)", "女性(sex=2)"), col = c("blue", "red"), lwd = 2)
关键参数匹配说明
- 核函数:
stexpect3默认用Epanechnikov核,R中需显式指定,避免使用默认的高斯核 - 带宽选择:
stexpect3默认采用自适应带宽规则,R中对应bshazard的bandwidth="cv"或muhaz的默认带宽调整 - 分组处理:
stexpect3会对每个协变量组单独估计风险,R中需确保分组拟合逻辑一致
内容的提问来源于stack exchange,提问作者krtbris
相关产品推荐
相关产品推荐

