使用 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
的每次迭代中的事件数据?
我对 R 有一定的经验。我正在尝试 运行 使用 survival 包的 for 循环的 Cox 回归。我的数据框 (df1) 包含多个健康结果作为“事件”。我想回归“FA_low”的健康结果和时间,添加年龄性别和 pc1-pc10 作为协变量。
这是我使用 dput(df1[1:2, -c(3,4)]
:
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
的每次迭代中的事件数据?