Как подобрать модель выживания для каждого квартиля переменной?

Я попытался подобрать модель выживания для каждого квартиля одной переменной в наборе данных. Принимая набор данных рака легкого, доступных в survival пакет в качестве примера

library(survival)
datalung <- lung
attach(datalung)
fit<- survfit(Surv(time,status) ~ quantile(age)[2:5],type = "kaplan-meier")

Но я получаю ошибку о длине переменных разные. Я хочу установить четыре модели, по одной на каждый квартиль.

Меньше или равно 25%

Больше 25 и меньше равно 50%

Больше 50% и меньше равно 75%

Более 75%

Как я могу это сделать?

2 ответа

Решение

По умолчанию quantile возвращает 5 значений, в prob = seq(0, 1, 0.25), Я думаю, что вы хотите использовать cut чтобы получить факторную переменную:

library(survival)
datalung <- lung
datalung$fage <- with(datalung, cut(age, quantile(age), include = TRUE))

## don't use `attach()`; use the `data` argument of model fitting routine
fit <- survfit(Surv(time,status) ~ fage, data = datalung, type="kaplan-meier")

#Call: survfit(formula = Surv(time, status) ~ fage, data = datalung, 
#    type = "kaplan-meier")
#
#              n events median 0.95LCL 0.95UCL
#fage=[39,56] 58     39    337     239     457
#fage=(56,63] 59     41    348     245     574
#fage=(63,69] 55     39    329     285     477
#fage=(69,82] 56     46    283     222     361

Следовать за

@42- также использовал quantileто, что он получил, это интервалы "левый закрытый и правый открытый".

Ваш вопрос гласит:

  • Меньше или равно 25%
  • Больше 25 и меньше равно 50%
  • Больше 50% и меньше равно 75%
  • Более 75%

так ясно, что вы хотите, чтобы интервалы были "слева и справа". Поэтому мой код именно то, что вы хотите.

Что означает значение include.lowest в растровом пакете реклассификации? include.lowest а также right аргументы внутри cut а также raster::reclassify в больших деталях. Теперь давайте сравним:

## my factor
table(with(datalung, cut(age, quantile(age), include.lowest = TRUE)))
#[39,56] (56,63] (63,69] (69,82] 
#     58      59      55      56 

## 42-'s factor
table(with(datalung, cut(age, quantile(age), include.lowest = TRUE, right = FALSE)))
#[39,56) [56,63) [63,69) [69,82] 
#     49      57      55      67 

Я попытался использовать свой предпочтительный метод создания квартильных индикаторов:

library(survival)
datalung <- lung
detach(datalung)  # Agree with Zheyuan Li that attach()-ing is dangerous practice.
fit3<- survfit(Surv(time,status) ~ findInterval(age, quantile(age)[-5]), 
                     data=datalung, type = "kaplan-meier")

Для удаления пятого элемента в векторе необходимо разделить значения, потому что findInterval имеет разбиения, которые закрыты слева и получили бы пятую группу с максимальным возрастом. Обратите внимание, что наши результаты подсчета квартилей отличаются. Его метод проиграл дела, а не только в минимальных или максимальных группах. Куда они делись... Я пока не уверен

> fit3
Call: survfit(formula = Surv(time, status) ~ findInterval(age, quantile(age)[-5]), 
    data = datalung, type = "kaplan-meier")

                                        n events median 0.95LCL 0.95UCL
findInterval(age, quantile(age)[-5])=1 49     32    320     226     533
findInterval(age, quantile(age)[-5])=2 57     41    340     245     433
findInterval(age, quantile(age)[-5])=3 55     39    310     267     524
findInterval(age, quantile(age)[-5])=4 67     53    285     229     363

Ваш вопрос к Чжэюань Ли о порядке уровней в ggplot обнажает еще одну ловушку использования cut, по крайней мере, если вы не предоставляете имена с аргументом "label". Уровни упорядочены по лексическому принципу, а "[" > чем "(":

> levels(datalung$fage)
[1] "[39,56]" "(56,63]" "(63,69]" "(69,82]"
> "[" < "("
[1] FALSE

Чтобы решить вопрос о моем использовании квантиля по сравнению с использованием @ZheyuanLi и его неправильной характеристике моего метода, нужно только изучить:

> quantile(datalung$age)
  0%  25%  50%  75% 100% 
  39   56   63   69   82 

> with( datalung, table( findInterval(age, quantile(datalung$age)[-5] )))

 1  2  3  4 
49 57 55 67 

Таким образом, большая разница в том, как обрабатывается возраст 56 лет:

>  sum(lung$age==56)
[1] 9

Пытался обратиться к маркировке при использовании cut() (что на самом деле не было моей обязанностью, не так ли?)

> library(ggplot2)  # checked to make sure I have the most recent version per CRAN
> autoplot(fit2)
Error: Objects of type survfit not supported by autoplot.
Другие вопросы по тегам