#r #survminer
#r #survminer
Вопрос:
У меня есть длинный список переменных, и я хотел бы рассчитать различия в выживаемости (значения p) для каждой из этих переменных. Я использую функции survfit() и surv_pvalue() для получения результата, но я сталкиваюсь с некоторыми проблемами при циклическом переборе переменных
library(survminer)
set.seed(2020)
data <- data.frame(Months = 10 rnorm(1:10),
Status = c(rep((0),5),rep((1),5)),
clin = rep("bla bla", 10),
Var1 = sample(0:1, 10, replace=T,prob=c(0.5,0.5)),
Var2 = sample(0:1, 10, replace=T,prob=c(0.5,0.5)),
Var3 = sample(0:1, 10, replace=T,prob=c(0.5,0.5)))
fit.list <- list()
for (i in (4:ncol(data))){
fit <- survfit(Surv(Months, Status) ~ colnames(data)[3 i], data = data)
fit2 <- surv_pvalue(fit)
fit.list[[i]] <- fit2
}
результаты в:
Error in model.frame.default(formula = Surv(Months, Status) ~ colnames(data)[3 :
variable lengths differ (found for 'colnames(data)[3 i]')
вероятно, это означает, что существует несоответствие между длинами 4:ncol(data)
и colnames(data)[3 i]
, но как именно я должен их указать? Заранее благодарим вас за решения!
Ответ №1:
Вы могли бы использовать lapply
вместо итерации и добавления в список:
lapply(data[4:6], function(i) {
surv_pvalue(eval(call("survfit",
formula = reformulate(names(data)[i],
"Surv(Months, Status)"),
data = data)))
})
#> $Var1
#> variable pval method pval.txt
#> 1 Months 0.3371479 Log-rank p = 0.34
#>
#> $Var2
#> variable pval method pval.txt
#> 1 Months 0.3371479 Log-rank p = 0.34
#>
#> $Var3
#> variable pval method pval.txt
#> 1 Months 0.3371479 Log-rank p = 0.34
Комментарии:
1. Спасибо, я почти добился этого, изменив имя объекта с «data» на «dat», а также имена столбцов (data)[3 i] на dat[,i] . Я прилагаю его ниже в качестве ответа.
Ответ №2:
Ответ Аллана Кэмерона прямолинеен и отлично работает. Я получил это почти идеально, работая с:
library(survminer)
set.seed(2020)
dat <- data.frame(Months = 10 rnorm(1:10),
Status = c(rep((0),5),rep((1),5)),
clin = rep("bla bla", 10),
Var1 = sample(0:1, 10, replace=T,prob=c(0.5,0.5)),
Var2 = sample(0:1, 10, replace=T,prob=c(0.5,0.5)),
Var3 = sample(0:1, 10, replace=T,prob=c(0.5,0.5)))
fit.list <- list()
for (i in (4:length(dat))){
fit <- survfit(Surv(Months, Status) ~ dat[,i], data = dat)
fit2 <- surv_pvalue(fit)
fit.list[[i]] <- fit2
}
Комментарии:
1. Похоже, что решение for намного быстрее, чем lapply, по крайней мере, для моих данных (296 наблюдений x 157 переменных)