Вычислить значения выживаемости p для нескольких переменных

#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 переменных)