Синтаксис для анализа выживания с поздним входом - PullRequest
0 голосов
/ 01 мая 2018

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

Скажем, мы измеряем влияние возраста при приеме на работу (age) и типа работы (parttime) на продолжительность работы врачей в государственных клиниках. Независимо от того, бросил ли врач или был подвергнут цензуре, переменная censor (0 для отказа от курения, 1 для цензуры). Такое поведение измерялось в 18-месячном окне. Время выхода или цензуры указывается двумя переменными: entry (время начала) и exit (время остановки), указывающими, сколько лет врач работал в клинике в годах. Если врачи приступили к работе после «открытия» окна, их entry время установлено на 0. Если они приступили к работе до «открытия» окна, их entry время показывает, как долго они уже работали в этой должности, когда окно «открыто», и их exit время показывает, сколько времени с момента их первоначального найма они либо ушли, либо подверглись цензуре с помощью окна «закрытие». Мы также постулируем двустороннее взаимодействие между age и продолжительностью занятости (exit).

Это набор данных игрушек. Он намного меньше, чем обычный набор данных, поэтому сами оценки не так важны, как правильность синтаксиса и включенных переменных (с использованием пакета survival в R), учитывая структуру данных. Данные игрушек имеют ту же структуру, что и набор данных, рассмотренный в главе 15 «Прикладного лонгитюдного анализа данных» Зингера и Виллета . Я пытался сопоставить результаты, которые они сообщают, но безуспешно. В Интернете не так много явной информации о том, как проводить анализ выживания на усеченных в левом направлении данных в R, а веб-сайт, который предоставляет код для книги ( здесь ), не предоставляет код R для рассматриваемой главы. , Методы моделирования изменяющихся во времени ковариат и эффектов взаимодействия довольно сложны в R, и мне просто интересно, упускаю ли я что-то важное.

Вот данные игрушки

id <- 1:40
entry <- c(2.3,2.5,2.5,1.2,3.5,3.1,2.5,2.5,1.5,2.5,1.4,1.6,3.5,1.5,2.5,2.5,3.5,2.5,2.5,0.5,rep(0,20))
exit <- c(5.0,5.2,5.2,3.9,4.0,3.6,4.0,3.0,4.2,4.0,2.9,4.3,6.2,4.2,3.0,3.9,4.1,4.0,3.0,2.0,0.2,1.2,0.6,1.9,1.7,1.1,0.2,2.2,0.8,1.9,1.2,2.3,2.2,0.2,1.7,1.0,0.6,0.2,1.1,1.3)
censor <- c(1,1,1,1,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0,0,rep(1,20))
parttime <- c(1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0)
age <- c(34,28,29,38,33,33,32,28,40,30,29,34,31,33,28,29,29,31,29,29,30,37,33,38,34,37,37,40,29,38 ,49,32,30,27,35,34,35,30,35,34)

doctors <- data.frame(id,entry,exit,censor,parttime,age)

Теперь для модели.

coxph(Surv(entry, exit, 1-censor) ~ parttime + age + age:exit, data = doctors)

Это правильный способ указать модель с учетом структуры данных и что мы хотим знать? Ответ здесь говорит о том, что это правильно, но я не уверен, например, правильно ли указана переменная взаимодействия.

1 Ответ

0 голосов
/ 01 мая 2018

Как это часто бывает, пока я не опубликую вопрос о проблеме на SO, я сам разберусь, как это сделать. Если есть взаимодействие с предиктором времени, нам нужно преобразовать набор данных в процесс подсчета в формате периода человека (то есть в длинную форму). Это связано с тем, что каждому участнику необходим интервал, который отслеживает его статус по отношению к событию для каждого момента времени, когда это событие произошло с кем-либо еще в наборе данных , до момента, когда он вышел из исследования.

Сначала давайте создадим переменную события

doctors$event <- 1 - doctors$censor

Перед запуском модели Кокса нам необходимо использовать функцию survSplit в пакете survival. Для этого нам нужно создать вектор всех моментов времени, когда произошло событие

cutPoints <- order(unique(doctors$exit[doctors$event == 1]))

Теперь мы можем передать это в функцию survSplit, чтобы создать новый набор данных ...

docNew <- survSplit(Surv(entry, exit, event)~.,
                   data = doctors,
                   cut = cutPoints,
                   end = "exit")

... который мы затем запускаем на нашей модели

coxph(Surv(entry,exit,event) ~ parttime + age + age:exit, data = docNew)

Вуаля!

...