使用 for 事件循环的 R 生存分析中的错误

Error in R survival analysis using for loop for events

我对 R 有一定的经验。我正在尝试 运行 使用 survival 包的 for 循环的 Cox 回归。我的数据框 (df1) 包含多个健康结果作为“事件”。我想回归“FA_low”的健康结果和时间,添加年龄性别和 pc1-pc10 作为协变量。

这是我使用 dput(df1[1:2, -c(3,4)]:

生成的数据帧 (df1) 的子集
structure(list(id = c("1000016", "1000028"), FA_low = c("1", 
"1"), sex = c("F", "F"), age = c(56L, 66L), pc1 = c(125.117, 
-9.61593), pc2 = c(-67.8548, 5.7494), pc3 = c(57.7852, -1.71108
), pc4 = c(7.68796, -4.73091), pc5 = c(0.445619, -3.22911), pc6 = c(2.93785, 
-0.0760323), pc7 = c(7.02217, 2.93723), pc8 = c(4.40888, 0.982279
), pc9 = c(-0.704416, -0.161818), pc10 = c(5.46248, -0.579022
), time = c(5, 5), '250' = c(FALSE, FALSE), '250.2' = c(FALSE, 
FALSE), '250.23' = c(FALSE, FALSE), '272' = c(NA, FALSE), '272.1' = c(NA, 
FALSE), '272.11' = c(NA, FALSE), '274.1' = c(FALSE, FALSE), '278' = c(FALSE, 
FALSE), '278.1' = c(FALSE, FALSE), '351' = c(FALSE, FALSE), `'401' = c(NA, 
FALSE), '401.1' = c(NA, FALSE), '411' = c(NA, FALSE), '411.4' = c(NA, 
FALSE), '411.8' = c(NA, FALSE), '454' = c(FALSE, FALSE), '454.1' = c(FALSE, 
FALSE), '512.7' = c(FALSE, FALSE), '550' = c(NA, FALSE), '550.2' = c(NA, 
FALSE), '550.4' = c(NA, FALSE), '740' = c(NA, FALSE), '740.1' = c(NA, 
FALSE), '907' = c(FALSE, FALSE)), row.names = 1:2, class = "data.frame")

结构:

'data.frame':   426295 obs. of  41 variables:
 $ id             : chr  "1000016" "1000028" "1000033" "1000042" ...
 $ FA_low         : chr  "1" "1" "0" "0" ...
 $ sex            : chr  "F" "F" "F" "F" ...
 $ age            : int  56 66 64 50 69 63 42 41 62 64 ...
 $ pc1            : num  125.12 -9.62 -12.53 -12.29 -11.33
 $ time           : num  5 5 5 5 5 5 5 5 5 5 ...
 $ 250            : logi  FALSE FALSE FALSE NA FALSE FALSE ..

.

当我 运行 我的分析没有分别针对每个健康结果进行循环时,它工作正常。当我尝试创建一个 for 循环并将健康结果作为迭代如下时:

for(i in 1:24){ df.model<-na.omit(df1[c(1:17,17+i)])

cox.mod <- coxph( Surv(time, i) ~ FA_low + age + sex + pc1 + pc2 + pc3 + pc4 + pc5 + pc6 + pc7 + pc8 + pc9 + pc10, data = df.model)

cox1 <- summary(cox.mod)

我收到以下错误: Error in Surv(time, i) : Time and status are different lengths

这些列中的观察值数量相同。我倾向于认为我的 for 循环与 Surv() 函数的工作方式不匹配。我浏览了 Surv() 包的文档,但我仍然无法解决这个问题。我看到了有关 'time' 循环的问题和答案,但没有看到事件。我如何创建一个 for 循环来处理此生存分析中事件的迭代?

我认为您看到的错误与 Surv() 期望其参数在 coxph() 中的格式有关。它期望列名作为变量而不是它们的位置(即您使用 i)。一种解决方案是直接调用每个 status 的值。看看这个:

library(survival)
#> Warning: package 'survival' was built under R version 4.0.5

test1 <- list(time=c(4,3,1,1,2,2,3), 
              status=c(1,1,1,0,1,1,0), 
              x=c(0,2,1,1,1,0,0), 
              sex=c(0,0,0,0,1,1,1),
              status2=c(TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE)) 

## This works

coxph(Surv(time, status) ~ x + strata(sex), test1)
#> Call:
#> coxph(formula = Surv(time, status) ~ x + strata(sex), data = test1)
#> 
#>     coef exp(coef) se(coef)     z     p
#> x 0.8023    2.2307   0.8224 0.976 0.329
#> 
#> Likelihood ratio test=1.09  on 1 df, p=0.2971
#> n= 7, number of events= 5

## This doesn't work

coxph(Surv(time, 2) ~ x + strata(sex), test1)
#> Error in Surv(time, 2): Time and status are different lengths

## This works

coxph(Surv(time, test1[[2]]) ~ x + strata(sex), test1)
#> Call:
#> coxph(formula = Surv(time, test1[[2]]) ~ x + strata(sex), data = test1)
#> 
#>     coef exp(coef) se(coef)     z     p
#> x 0.8023    2.2307   0.8224 0.976 0.329
#> 
#> Likelihood ratio test=1.09  on 1 df, p=0.2971
#> n= 7, number of events= 5
Created on 2021-09-01 by the reprex package (v2.0.1)

请注意,在我的示例中(来自生存文档),test1 是一个列表。您可能需要使用 df.model[,i] 或将 df.model 转换为列表。此外,Surv() 中的 i 是否应始终为 18,因为第 18 列包含您在 df.model 的每次迭代中的事件数据?