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

Surv函数报错‘Time variable is not numeric’:生存分析排障求助

生存分析Surv函数报错:Time variable is not numeric的解决方法

我正在开展以**失访时间(time to loss to follow up)**为指标的生存分析,已通过csv读取函数的stringsAsFactors和colClasses参数确保“Time to LTFU”列为数值型,但调用survfit构建Kaplan-Meier模型时,仍触发错误:

Error in Surv("Time to LTFU", censored) : Time variable is not numeric

查看str(survdat)输出确认“Time to LTFU”确实是数值型,但问题仍未解决。相关代码及数据结构如下:

相关代码

library(tidyverse)
library(gtsummary)
library(data.table)
library(tidyr)
library(dplyr)
library(survival)

survdat <- fread("221121_HBV_Followup_survivalanalysis.csv", stringsAsFactors=FALSE,
                 colClasses = c("Time to LTFU"="numeric"))

# 创建删失变量(右删失)
survdat$censored[survdat$`LTFU confirmed` == 'Yes']<- 1
survdat$censored[survdat$`LTFU confirmed` == 'No'] <-0


# 构建KM分析模型
km1 <- survfit(Surv('Time to LTFU', censored) ~ 1,
               data=survdat,
               type="kaplan-meier")

数据结构(str输出)

Classes ‘data.table’ and 'data.frame':  43 obs. of  10 variables:
 $ Date screened                 : chr  "19/10/2021" "07/07/2021" "18/01/2022" "07/05/2021" ... 
 $ Last date seen                : chr  "21/11/2022" "21/11/2022" "21/11/2022" "21/11/2022" ... 
 $ Time to LTFU                  : num  398 502 307 563 564 605 516 29 118 118 ... 
 $ LTFU confirmed                : chr  "No" "No" "No" "No" ... 
 $ censored                      : num  0 0 0 0 0 0 0 1 1 0 ... 

问题原因及解决办法

问题根源在于Surv()函数中变量的引用方式:你用单引号包裹Time to LTFU,这会让函数把它当作字符串字面量处理,而非引用数据框中的对应列,自然会报错“时间变量非数值型”。

有两种直接的解决方式:

  • 方式1:用反引号包裹带空格的变量名
    将单引号替换为反引号(键盘左上角的`键),让函数识别为数据框中的列:

    km1 <- survfit(Surv(`Time to LTFU`, censored) ~ 1,
                   data=survdat,
                   type="kaplan-meier")
    
  • 方式2:重命名变量,移除空格
    读取数据后将带空格的变量名改为无空格格式,后续操作更简洁:

    # 重命名变量
    survdat <- survdat %>% rename(time_to_ltfu = `Time to LTFU`)
    
    # 重新构建模型
    km1 <- survfit(Surv(time_to_ltfu, censored) ~ 1,
                   data=survdat,
                   type="kaplan-meier")
    

额外优化建议

创建删失变量时,用向量化操作替代索引赋值,更高效且避免潜在的NA遗漏:

survdat$censored <- as.numeric(survdat$`LTFU confirmed` == 'Yes')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 08:25:20