Как подобрать модель выживания для каждого квартиля переменной?
Я попытался подобрать модель выживания для каждого квартиля одной переменной в наборе данных. Принимая набор данных рака легкого, доступных в 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.