Другой прогнозный график от выживаемости coxph и rms cph

9

Я создал свою немного улучшенную версию termplot, которую я использую в этом примере, вы можете найти ее здесь . Ранее я писал о SO, но чем больше я об этом думаю, тем больше думаю, что это скорее связано с интерпретацией модели пропорциональных рисков Кокса, чем с фактическим кодированием.

Проблема

Когда я смотрю на график отношения рисков, я ожидаю, что у меня будет контрольная точка, где доверительный интервал, естественно, равен 0, и это тот случай, когда я использую cph () из, rms packageно не когда я использую coxph () из survival package. Является ли правильное поведение с помощью coxph () и если да, то какова контрольная точка? Кроме того, фиктивная переменная в coxph () имеет интервал, и значение отличается от ?e0

пример

Вот мой тестовый код:

# Load libs
library(survival)
library(rms)

# Regular survival
survobj <- with(lung, Surv(time,status))

# Prepare the variables
lung$sex <- factor(lung$sex, levels=1:2, labels=c("Male", "Female"))
labels(lung$sex) <- "Sex"
labels(lung$age) <- "Age"

# The rms survival
ddist <- datadist(lung)
options(datadist="ddist")
rms_surv_fit <- cph(survobj~rcs(age, 4)+sex, data=lung, x=T, y=T)

Cph участки

Этот код:

termplot2(rms_surv_fit, se=T, rug.type="density", rug=T, density.proportion=.05,
          se.type="polygon", yscale="exponential", log="y", 
          xlab=c("Age", "Sex"), 
          ylab=rep("Hazard Ratio", times=2),
          main=rep("cph() plot", times=2),
          col.se=rgb(.2,.2,1,.4), col.term="black")

дает этот сюжет:

cph () termplot2

Участки Coxph

Этот код:

termplot2(surv_fit, se=T, rug.type="density", rug=T, density.proportion=.05, 
          se.type="polygon", yscale="exponential", log="y", 
          xlab=c("Age", "Sex"), 
          ylab=rep("Hazard Ratio", times=2),
          main=rep("coxph() plot", times=2),
          col.se=rgb(.2,.2,1,.4), col.term="black")

дает этот сюжет:

coxph () termplot2

Обновить

Как предложил @Frank Harrell, и после корректировки предложения в своем недавнем комментарии я получил:

p <- Predict(rms_surv_fit, age=seq(50, 70, times=20), 
             sex=c("Male", "Female"), fun=exp)
plot.Predict(p, ~ age | sex,
             col="black",
             col.fill=gray(seq(.8, .75, length=5)))

Это дало этот очень хороший сюжет:

Решетчатый участок

После комментария я снова посмотрел на contra.rms и попробовал этот код, дающий сюжет ... хотя, вероятно, можно сделать гораздо больше :-)

w <- contrast.rms(rms_surv_fit, 
                  list(sex=c("Male", "Female"), 
                       age=seq(50, 70, times=20)))

xYplot(Cbind(Contrast, Lower, Upper) ~ age | sex, 
       data=w, method="bands")

Дал этот сюжет:

Контрастный сюжет

ОБНОВЛЕНИЕ 2

Профессор Тернау был достаточно любезен, чтобы прокомментировать заговоры об отсутствии уверенности в талии:

Сглаживающие сплайны в coxph, как и в gam, нормализованы так, что сумма (прогноз) = 0. Так что у меня нет фиксированной единственной точки, для которой дисперсия очень мала.

Хотя я еще не знаком с GAM, похоже, это отвечает на мой вопрос: похоже, это проблема интерпретации.

Макс Гордон
источник
3
Несколько комментариев. Сначала прочитайте biostat.mc.vanderbilt.edu/Rrms, чтобы узнать о различиях между rms и пакетами Design. Во-вторых, используйте plot () вместо plot.Predict для сохранения работы. В-третьих, вы можете легко создавать графики для обоих полов, например, используя Predict (fit, age, sex, fun = exp) # exp = anti-log; затем сюжет (результат) или сюжет (результат, ~ возраст | пол). Вы не используете "x = NA" в Predict. rms использует решетчатую графику, поэтому обычные параметры графики и mfrow не применяются. Смотрите примеры в моей брошюре по среднеквадратичному курсу на сайте biostat.mc.vanderbilt.edu/rms . Для контраста. Rms больше изучайте документацию.
Фрэнк Харрелл
1
Большое спасибо за ваш вклад. Я обновил код лучшими примерами и добавил проф. Ответ Тернау. PS Я очень рад, что вы планируете новую версию книги, расширяющую раздел смещения точки отсечения, будет очень полезен в качестве справочного материала
Макс Гордон
1
Вы можете использовать plotи contrastвместо plot.Predictи contrast.rms. Я бы использовал byили lengthвнутри seqвместо timesи дал бы contrastдва списка, чтобы вы указали, что именно противопоставляется. Вы также можете использовать затенение с xYplotдоверительными полосами.
Фрэнк Харрелл
1
Спасибо. Мне нравится использовать plot.Predict, потому что тогда я получаю нужную помощь в RStudio - что в моем случае гораздо важнее, чем время, которое требуется для написания полного имени функции (с помощью autocomplete (tab) я на самом деле не потерять столько времени).
Макс Гордон

Ответы:

5

Я думаю, что обязательно должна быть точка, в которой доверительный интервал равен нулю. Вы также можете попробовать третий способ, который заключается в использовании исключительно функций RMS. Под файлом справки для68.conms есть пример, чтобы получить график соотношения рисков. Он начинается с комментария # показывает отдельные оценки по лечению и полу. Вам нужно будет анти-лог, чтобы получить соотношение.

Фрэнк Харрелл
источник
1
Спасибо за ваш ответ. Как вы думаете, я должен упомянуть эту проблему проф. Терри Терно, если это будет рассматриваться как ошибка / неправильное толкование? Я также изучил графические решения в пакете rms, я не совсем понимаю, как использовать Contrats.rms для графиков. Plot.Predict, похоже, делает вывод, аналогичный termplot, но я не могу заставить его делать именно то, что я хочу ... см. Мое обновление к вопросу.
Макс Гордон
2
Было бы хорошо написать ему, чтобы узнать, и сказать ему спасибо за поездку в аэропорт, который он дал мне несколько минут назад. Я прокомментирую выше на другие вопросы.
Фрэнк Харрелл