Я створив власну трохи вдосконалену версію термплота, яку я використовую в цьому прикладі, ви можете знайти її тут . Я раніше розміщував повідомлення про 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")
дає цей сюжет:
Коффи сюжети
Цей код:
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, як і в грі, нормалізуються так, що сума (прогноз) = 0. Тому я не маю фіксованої єдиної точки, для якої дисперсія надто мала.
Хоча я ще не знайомий з GAM, це, мабуть, відповідає на моє запитання: це, здається, є проблемою тлумачення.
plot
і contrast
замість plot.Predict
і contrast.rms
. Я б використовував by
або length
всередині seq
замість, times
і я дав би contrast
два списки, щоб ви точно вказали, що саме протиставляється. Ви також можете використовувати затінення xYplot
для довіри.