Я создал свою немного улучшенную версию termplot, которую я использую в этом примере, вы можете найти ее здесь . Ранее я писал о SO, но чем больше я об этом думаю, тем больше думаю, что это скорее связано с интерпретацией модели пропорциональных рисков Кокса, чем с фактическим кодированием.
Проблема
Когда я смотрю на график отношения рисков, я ожидаю, что у меня будет контрольная точка, где доверительный интервал, естественно, равен 0, и это тот случай, когда я использую cph () из, rms package
но не когда я использую coxph () из survival package
. Является ли правильное поведение с помощью coxph () и если да, то какова контрольная точка? Кроме того, фиктивная переменная в coxph () имеет интервал, и значение отличается от ?
пример
Вот мой тестовый код:
# 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")
дает этот сюжет:
Участки 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")
дает этот сюжет:
Обновить
Как предложил @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, похоже, это отвечает на мой вопрос: похоже, это проблема интерпретации.
plot
и contrast
вместо plot.Predict
и contrast.rms
. Я бы использовал by
или length
внутри seq
вместо times
и дал бы contrast
два списка, чтобы вы указали, что именно противопоставляется. Вы также можете использовать затенение с xYplot
доверительными полосами.