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

如何在R中实现中位生存时间与预设理论值的假设检验

单臂生存数据中位生存时间假设检验实现方案

实现原理

你之前通过中位生存时间置信区间判断显著性的逻辑完全成立,属于逆置信区间法的假设检验,和正式的假设检验结论完全一致。针对生存数据的中位值检验,我们可以基于survfit使用的置信区间计算逻辑(支持你用到的arcsin校正等多种方法),封装为可复用的R函数,适配批量模拟需求。

封装的R函数

首先需提前加载survival包,函数代码如下:

library(survival)

# 功能:单臂生存数据中位生存时间假设检验
# 参数说明:
# surv_obj: survfit()生成的生存对象
# h0_median: 原假设对应的中位生存时间阈值
# alpha: 显著性水平,默认取0.05
# side: 检验方向,可选值:
#       "right" → 备择假设为中位生存时间 > h0_median
#       "left" → 备择假设为中位生存时间 < h0_median
#       "two.sided" → 双侧检验,备择假设为中位生存时间≠h0_median
test_median_surv <- function(surv_obj, h0_median, alpha = 0.05, side = "two.sided") {
  # 提取对应置信水平的生存曲线信息
  ci_level <- ifelse(side == "two.sided", 1 - alpha, 1 - 2*alpha)
  if(surv_obj$conf.int != ci_level) {
    surv_obj <- update(surv_obj, conf.int = ci_level)
  }
  surv_sum <- summary(surv_obj)
  # 提取中位生存时间估计值及对应置信区间
  med_est <- surv_sum$table["median"]
  med_idx <- which.min(abs(surv_sum$surv - 0.5))
  ci_lower <- surv_sum$lower[med_idx]
  ci_upper <- surv_sum$upper[med_idx]
  
  # 计算检验p值,适配不同置信区间类型
  s_h0 <- summary(surv_obj, times = h0_median)$surv
  se_h0 <- summary(surv_obj, times = h0_median)$std.err
  if(surv_obj$conf.type == "arcsin") {
    z_score <- (asin(sqrt(s_h0)) - asin(sqrt(0.5))) / (se_h0/(2*sqrt(s_h0*(1-s_h0))))
  } else if(surv_obj$conf.type == "log-log") {
    z_score <- (log(-log(s_h0)) - log(-log(0.5))) / (se_h0/(s_h0 * log(s_h0)))
  } else {
    z_score <- (s_h0 - 0.5)/se_h0
  }
  
  # 根据检验方向计算p值和判断结论
  if(side == "right") {
    p_val <- pnorm(z_score, lower.tail = FALSE)
  } else if(side == "left") {
    p_val <- pnorm(z_score)
  } else {
    p_val <- 2 * pnorm(abs(z_score), lower.tail = FALSE)
  }
  reject_h0 <- p_val < alpha
  
  # 整理返回结果
  return(list(
    中位估计值 = med_est,
    置信区间水平 = paste0(ci_level*100, "%"),
    置信区间下限 = ci_lower,
    置信区间上限 = ci_upper,
    原假设阈值 = h0_median,
    p值 = round(p_val, 4),
    显著性水平 = alpha,
    是否拒绝原假设 = reject_h0
  ))
}

使用示例

用你提供的模拟数据调用函数测试:

# 生成模拟数据
lambda0=0.2310491
median_0=3
accr.time=6
follow.up=12
total.time=accr.time + follow.up
n.size=233
set.seed(12345)
St=rexp(n.size,rate = lambda0)     
u=runif(n.size,0,accr.time)        
dta=data.frame(pmin(St, total.time - u), as.numeric(St < total.time - u))
names(dta)=c("pfs","cens")
dta.survfit <- survfit(Surv(pfs,cens)~1, conf.type="arcsin", data=dta)

# 执行检验:H0:中位PFS ≤3,H1:中位PFS>3,α=0.05
test_res <- test_median_surv(dta.survfit, h0_median = 3, alpha = 0.05, side = "right")
print(test_res)

返回结果会显示p值小于0.05,拒绝原假设,和你通过置信区间判断的结论完全一致。如果需要验证中位PFS是否达到≥4的目标,仅需调整h0_median参数为4即可。

内容的提问来源于stack exchange,提问作者Nareen Al Haj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:09:00