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

使用survIDINRI包时遇Surv函数报错:时间变量非数值型

解决survIDINRI包IDI.INF函数报错:Time variable is not numeric

报错根源分析

报错提示Surv(xi, di) : Time variable is not numeric,说明调用IDI.INF时传入的生存时间变量被识别为非数值类型,大概率是数据类型转换或数据清理环节出现问题。

修复步骤与代码调整

1. 确保生存时间与结局变量的数值类型

首先强制转换并清理核心变量:

# 转换生存时间为数值型,同时移除NA与非正值
Train1$Survivalmonths <- as.numeric(Train1$Survivalmonths)
Train1 <- Train1[!is.na(Train1$Survivalmonths) & Train1$Survivalmonths > 0, ]

# 转换结局变量为整数型(要求0=删失,1=事件)
Train1$specific <- as.integer(Train1$specific)

2. 检查协变量的类型合法性

协变量矩阵不能包含字符型或未编码的因子,否则会导致内部模型拟合失败。如果有因子型变量,需先转换为数值编码:

# 示例:用model.matrix处理含因子的协变量(以covs0为例)
covs0_data <- Train1[, c("Age", "Sex", "Tumor_size", "T_stage", "Grade", "Radiation", "Surgery", "Chemotherapy", "LNR")]
covs0 <- model.matrix(~ . -1, data = covs0_data)  # -1避免生成截距项

covs1_data <- Train1[, c("Age", "Sex", "Tumor_size", "T_stage", "Grade", "Radiation", "Surgery", "Chemotherapy", "RNP")]
covs1 <- model.matrix(~ . -1, data = covs1_data)

3. 规范调用IDI.INF函数

明确指定参数,避免子集操作导致的类型意外转换:

library(survIDINRI)
t0 = 120

# 直接传入数据框格式的生存数据,确保类型正确
x <- IDI.INF(
  data = Train1[, c("Survivalmonths", "specific")],
  covs0 = covs0, 
  covs1 = covs1, 
  t0 = t0, 
  npert = 10
)
IDI.INF.OUT(x)

完整修正代码示例

Train1 <- subset(Train, select = c("Survivalmonths", "specific", "Age", "Sex", "Tumor_size", "T_stage", "Grade", "Radiation", "Surgery", "Chemotherapy", "LNR", "RNP", "RNE"))

# 清理并转换核心生存变量
Train1$Survivalmonths <- as.numeric(Train1$Survivalmonths)
Train1 <- Train1[!is.na(Train1$Survivalmonths) & Train1$Survivalmonths > 0, ]
Train1$specific <- as.integer(Train1$specific)

# 处理协变量(含因子时用model.matrix编码)
covs0_data <- Train1[, c("Age", "Sex", "Tumor_size", "T_stage", "Grade", "Radiation", "Surgery", "Chemotherapy", "LNR")]
covs0 <- model.matrix(~ . -1, data = covs0_data)

covs1_data <- Train1[, c("Age", "Sex", "Tumor_size", "T_stage", "Grade", "Radiation", "Surgery", "Chemotherapy", "RNP")]
covs1 <- model.matrix(~ . -1, data = covs1_data)

# 调用函数
library(survIDINRI)
t0 = 120
x <- IDI.INF(data = Train1[, c("Survivalmonths", "specific")], covs0 = covs0, covs1 = covs1, t0 = t0, npert = 10)
IDI.INF.OUT(x)

内容的提问来源于stack exchange,提问作者Shiny-jin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 09:55:24