You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 07:22:41