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

R语言ggsurvplot与SAS PROC LIFETEST的log-rank检验结果差异求助

R与SAS中Log-Rank检验结果不一致的排查要点

ggsurvplot的Log-Rank p值本质来自survival包的survdiff函数,和SAS PROC LIFETEST的结果差异通常源于细节设置或数据处理逻辑的不同,以下是核心排查方向:

1. 删失值定义匹配性

R中Surv(TIME_OS, STATUS_OS)默认将非1的STATUS_OS值视为删失,而SAStime time_os*status_os(0)仅把指定的0作为删失。若数据中存在2、9等其他编码值,R会自动归为删失,SAS则会将其当作事件处理,直接导致结果偏差。需确认两组数据中STATUS_OS的编码规则完全一致。

2. 检验统计量的权重差异

  • R的survdiff默认计算Mantel-Haenszel版本的Log-Rank统计量(权重为1);SAS PROC LIFETEST默认采用Tarone-Ware版本(权重为生存时间平方根),小样本或生存分布差异大时,两种方法结果会明显不同。
    • 可在SAS中指定Mantel-Haenszel方法对齐R的逻辑:
      proc lifetest data=data plots=s(test);
          time time_os*status_os(0);
          strata group / test=logrank(mh);
      run;
      
    • 也可在R中调整权重匹配SAS默认逻辑,验证差异来源:
      diff <- survdiff(Surv(TIME_OS, STATUS_OS)~GROUP, data=data, rho=0.5)
      pchisq(diff$chisq, length(diff$n)-1, lower.tail=FALSE)
      

3. 数据处理逻辑一致性

  • 缺失值处理:R的survfit自动删除含缺失值的行;SAS PROC LIFETEST默认保留缺失值但会排除在分析外,需确保两组分析使用的是完全相同的无缺失数据集。
    • R中筛选无缺失数据:
      clean_data <- data[complete.cases(data[,c("TIME_OS","STATUS_OS","GROUP")]),]
      fit <- survfit(Surv(TIME_OS, STATUS_OS)~GROUP, clean_data)
      
    • SAS中过滤缺失值:
      proc lifetest data=data plots=s(test);
          where not missing(time_os) and not missing(status_os) and not missing(group);
          time time_os*status_os(0);
          strata group;
      run;
      
  • 分组变量编码:检查GROUP变量在R和SAS中的类型(字符/数值)及分组映射是否完全一致,避免因编码错位导致分组错误。

4. 生存时间精度问题

若TIME_OS为连续型变量,R与SAS对浮点小数的舍入规则可能存在细微差异。尝试将生存时间四舍五入为整数后重新计算,若差异消失则说明是精度问题导致。

内容的提问来源于stack exchange,提问作者Guillaume

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 18:12:35