Determinar los factores que intervienen en el pronóstico de sobrevida pulpar de dientes permanentes con desarrollo radicular incompleto que sufren algún tipo de fractura coronaria.
df <- read_csv("https://docs.google.com/spreadsheets/d/e/2PACX-1vSHQ17f-felEDBHEx2uz0Jjst-_z6wHTfB7hSFHD1iX8XWwd6GYTOYBo5F8DXjLGdxpTk9BqUt_M0lG/pub?gid=1995037555&single=true&output=csv")
glimpse(df)
Creo una nueva variable: status
Pronóstico pulpar: Variable dependiente. Evaluado con radiografÍa periapical. - Buen pronóstico: (PS) sobrevivencia de la Pulpa - Sin cambio radiográfico, signos clÍnicos de vitalidad pulpar. - PCO: obliteración del conducto pulpar. - Detención del crecimiento radicular, conducto pulpar normal, longitud radicular disminuida en comparación con el homólogo.
Entonces
Sobrevida si - PCO - Detención crecimiento radicular, pulpa vital - Sin cambio rx
Sobrevida no - Desarrollo Radicular completo, con endodoncia - Detención crecimiento radicular, con endodoncia
cambio las fechas a aaaa/mm/dd y calculo la diferencia en años
df <- df %>%
mutate(
`FECHA TRAUMATISMO` = dmy(`FECHA TRAUMATISMO`),
`FECHA SOBREVIDA` = dmy(`FECHA SOBREVIDA`),
`FECHA DE NACIMIENTO` = dmy(`FECHA DE NACIMIENTO`)
)
# creo time y edad
df <- df %>%
mutate(
time = difftime(`FECHA SOBREVIDA`, `FECHA TRAUMATISMO`, units = "weeks") / 52.25,
edad = difftime(`FECHA TRAUMATISMO`, `FECHA DE NACIMIENTO`, units = "weeks")/52.25 # edad en años
)
Creo una nueva variable que será el evento = 1 (si) en caso que haya algo negativo y no (0) en caso que no haya pasado nada malo
df <- df %>%
mutate(
Evento = case_when(
`SOBREVIDA PULPAR` == "PCO" |
`SOBREVIDA PULPAR` == "Detención crecimiento radicular, pulpa vital" |
`SOBREVIDA PULPAR` == "Sin cambio rx" ~ 0,
TRUE ~ 1
)
)
Veo cuantos eventos hay
table(df$Evento)
CORREGIDO Hay dos valores negativos, mientras los elimino
which(df\(time > 0) df[df\)time < 0, ] # ubico a la que es menor df\(time df[df\)time < 1, ] df <- df[-c(65), ] # elimino la 65 mientras tanto VERIFICAR!!!!
which(df\(edad < 0) df[df\)edad < 1, ] # hay uno que tiene edad negativa, verificar, mientras lo saco del análisis df <- df[-c(77), ]
summary(df)
Creo el objeto estándar de sobrevida
km <- with(df, Surv(time, Evento == 1))
head(km, 50)
Ahora el análisis de KM
km_fit <- survfit(Surv(time, Evento) ~ 1, data = df)
summary(km_fit)
Estos datos se leen de la siguiente manera:
km_fit
autoplot(km_fit,
main = "Análisis de sobrevida Kaplan Meier para estado pulpar",
xlab = "Años", ylab = "Probabilidad de sobrevida")
ggsurvplot(km_fit, main = "Survival curve",
font.main = 18,
font.x = 16,
font.y = 16,
font.tickslab = 14,
palette = "Dark Blue",
legend = "none",
ggtheme = theme_pubclean() ) +
labs(y = "Probabilidad de sobrevida", x = "Años",
title = "Curva de Kaplan-Meier para sobrevida pulpar")
Ahora examino por algunas variables: sexo, dgo del trauma
autoplot(
survfit(Surv(time, Evento) ~ GÉNERO, data = df),
main = "Análisis de sobrevida Kaplan Meier para estado pulpar por sexo",
xlab = "Años", ylab = "Probabilidad de sobrevida"
) +
theme(text = element_text(size=20))
autoplot(
survfit(Surv(time, Evento) ~ DIAGNÓSTICO, data = df),
main = "Análisis de sobrevida Kaplan Meier para estado pulpar por tipo de trauma",
xlab = "Años", ylab = "Probabilidad de sobrevida"
) +
theme(text = element_text(size=20))
19 dic hacer solo para FCNC con y sin luxación
df_soloFCNC <- df %>%
filter(DIAGNÓSTICO %in% c("FCNC sin luxación", "FCNC con luxación"))
autoplot(
survfit(Surv(time, Evento) ~ DIAGNÓSTICO, data = df_soloFCNC),
main = "Análisis de sobrevida Kaplan Meier para estado pulpar por tipo de trauma",
xlab = "Años", ylab = "Probabilidad de sobrevida"
) +
theme(text = element_text(size=20))
El propósito del modelo de Cox es evaluar simultáneamente el efecto de varios factores en la supervivencia. Nos permite examinar cómo diversos influyen en la tasa de un evento en particular que ocurre (por ejemplo, infección, muerte) en un momento particular. Esta tasa se conoce comúnmente como la tasa de riesgo (hazard rate). Las variables (o factores) del predictor generalmente se denominan covariables en la literatura de análisis de supervivencia.
h(t)=h0(t)Ãexp(b1x1+b2x2+…+bpxp) h(t)=h0(t)Ãexp(b1x1+b2x2+…+bpxp)
donde,
El modelo de Cox se puede escribir como una regresión lineal múltiple del logaritmo del peligro en las variables xixi, con el riesgo de la lÍnea de base como un término de “intercepción” que varÍa con el tiempo.
Las cantidades exp (bi) exp (bi) se denominan relaciones de riesgo (HR). Un valor de bibi mayor que cero, o equivalente a una razón de riesgo mayor que uno, indica que a medida que el valor de la novena covariable aumenta, el riesgo de evento aumenta y, por lo tanto, la duración de la supervivencia disminuye.
Dicho de otra manera, una razón de riesgo superior a 1 indica una covariable que está asociada positivamente con la probabilidad del evento y, por lo tanto, está asociada negativamente con la duración de la supervivencia.
En resumen,
HR = 1: sin efecto HR < 1: reducción en el riesgo HR > 1: aumento de riesgo
res.cox1 <- coxph(km ~
edad +
`DIENTE AFECTADO` +
GÉNERO +
DIAGNÓSTICO +
`TRAUMATISMO REPETIDO` +
`TRAUMATISMO PREVIO`,
data = df)
Chequeo por si se viola el riesgo proporcional (constante HR en el tiempo)
(res.zph1 <- cox.zph(res.cox1))
No se viola, asÍ que estamos OK
Ahora examino con detalle el modelo de Cox
summary(res.cox1)
Esto se lee de la siguiente manera
individuos que tienen más edad tienen más probabilidad (0.4841) de tener el evento, mientras que ser sexo masculino disminuye el riesgo (-0.0337) de tener el evento.
¿Cuanto?
UN aumento de Edad aumenta un 62% el riesgo de tener el evento, con un ic95% entre 05% y 149% (restale uno a los coeficientes)
cox_fit <- survfit(res.cox1)
autoplot(cox_fit)
aa_fit <-aareg(Surv(time, Evento) ~
`DIENTE AFECTADO` +
GÉNERO +
DIAGNÓSTICO +
`TRAUMATISMO REPETIDO` +
df$`TRAUMATISMO PREVIO`,
data = df)
autoplot(aa_fit)
modelo_0 <- coxph(km ~
df$GÉNERO +
df$`DIENTE AFECTADO` +
df$DIAGNÓSTICO +
df$TRATAMIENTO +
# df$`TIEMPO HASTA LA ATENCIÓN (en horas)` +
df$`ESTADO RADICULAR INICIAL` +
df$`TRAUMATISMO REPETIDO` +
df$`TRAUMATISMO PREVIO` +
df$`INDICACIÓN DE HIGIENE` +
df$`EVALUACIÓN DE HIGIENE` +
df$`ONICOFAGIA - INTERPOSICIÓN DE OBJETOS` ,
data = df)
summary(modelo_0)
modelo_1.1 <- coxph(km ~
# df$GÉNERO +
# df$`DIENTE AFECTADO` +
# df$DIAGNÓSTICO +
# df$TRATAMIENTO +
# df$`TIEMPO HASTA LA ATENCIÓN (en horas)` +
# df$`ESTADO RADICULAR INICIAL` +
df$`TRAUMATISMO REPETIDO`,
# df$`TRAUMATISMO PREVIO` +
# df$`INDICACIÓN DE HIGIENE` +
# df$`EVALUACIÓN DE HIGIENE` +
#df$`ONICOFAGIA - INTERPOSICIÓN DE OBJETOS` ,
data = df)
summary(modelo_1.1)
modelo_1.2 <- coxph(km ~
# df$GÉNERO +
# df$`DIENTE AFECTADO` +
# df$DIAGNÓSTICO +
# df$TRATAMIENTO +
# df$`TIEMPO HASTA LA ATENCIÓN (en horas)` +
# df$`ESTADO RADICULAR INICIAL` +
# df$`TRAUMATISMO REPETIDO`,
df$`TRAUMATISMO PREVIO`,
# df$`INDICACIÓN DE HIGIENE` +
# df$`EVALUACIÓN DE HIGIENE` +
#df$`ONICOFAGIA - INTERPOSICIÓN DE OBJETOS` ,
data = df)
summary(modelo_1.2)
modelo_2 <- coxph(km ~
# df$GÉNERO +
# df$`DIENTE AFECTADO` +
# df$DIAGNÓSTICO +
# df$TRATAMIENTO +
# df$`TIEMPO HASTA LA ATENCIÓN (en horas)` +
# df$`ESTADO RADICULAR INICIAL` +
# df$`TRAUMATISMO REPETIDO`,
# df$`TRAUMATISMO PREVIO` +
df$`INDICACIÓN DE HIGIENE` +
df$`EVALUACIÓN DE HIGIENE`,
#df$`ONICOFAGIA - INTERPOSICIÓN DE OBJETOS` ,
data = df)
summary(modelo_2)
modelo_2.1 <- coxph(km ~
# df$GÉNERO +
# df$`DIENTE AFECTADO` +
# df$DIAGNÓSTICO +
# df$TRATAMIENTO +
# df$`TIEMPO HASTA LA ATENCIÓN (en horas)` +
# df$`ESTADO RADICULAR INICIAL` +
# df$`TRAUMATISMO REPETIDO`,
# df$`TRAUMATISMO PREVIO` +
df$`INDICACIÓN DE HIGIENE`,
# df$`EVALUACIÓN DE HIGIENE` +
#df$`ONICOFAGIA - INTERPOSICIÓN DE OBJETOS` ,
data = df)
summary(modelo_2.1)
modelo_2.2 <- coxph(km ~
# df$GÉNERO +
# df$`DIENTE AFECTADO` +
# df$DIAGNÓSTICO +
# df$TRATAMIENTO +
# df$`TIEMPO HASTA LA ATENCIÓN (en horas)` +
# df$`ESTADO RADICULAR INICIAL` +
# df$`TRAUMATISMO REPETIDO`,
# df$`TRAUMATISMO PREVIO` +
# df$`INDICACIÓN DE HIGIENE` +
df$`EVALUACIÓN DE HIGIENE`,
#df$`ONICOFAGIA - INTERPOSICIÓN DE OBJETOS` ,
data = df)
summary(modelo_2.2)
modelo_3 <- coxph(km ~
# df$GÉNERO +
# df$`DIENTE AFECTADO` +
# df$DIAGNÓSTICO +
# df$TRATAMIENTO +
# df$`TIEMPO HASTA LA ATENCIÓN (en horas)` +
# df$`ESTADO RADICULAR INICIAL` +
# df$`TRAUMATISMO REPETIDO`,
# df$`TRAUMATISMO PREVIO` +
# df$`INDICACIÓN DE HIGIENE` +
# df$`EVALUACIÓN DE HIGIENE` +
df$`ONICOFAGIA - INTERPOSICIÓN DE OBJETOS` ,
data = df)
summary(modelo_3)
modelo_4 <- coxph(km ~
# df$GÉNERO +
# df$`DIENTE AFECTADO` +
# df$DIAGNÓSTICO +
# df$TRATAMIENTO +
# df$`TIEMPO HASTA LA ATENCIÓN (en horas)` +
df$`ESTADO RADICULAR INICIAL`,
# df$`TRAUMATISMO REPETIDO`,
# df$`TRAUMATISMO PREVIO` +
# df$`INDICACIÓN DE HIGIENE` +
# df$`EVALUACIÓN DE HIGIENE` +
#df$`ONICOFAGIA - INTERPOSICIÓN DE OBJETOS` ,
data = df)
summary(modelo_4)
modelo_99 <- coxph(km ~
GÉNERO +
# df$`DIENTE AFECTADO` +
DIAGNÓSTICO +
# df$TRATAMIENTO +
# df$`TIEMPO HASTA LA ATENCIÓN (en horas)` +
`ESTADO RADICULAR INICIAL` +
`TRAUMATISMO REPETIDO` +
`TRAUMATISMO PREVIO` +
# df$`INDICACIÓN DE HIGIENE` +
`EVALUACIÓN DE HIGIENE` +
`ONICOFAGIA - INTERPOSICIÓN DE OBJETOS` ,
data = df)
summary(modelo_99)
Chequeo por si se viola el riesgo proporcional (constante HR en el tiempo)
(res.zph99 <- cox.zph(modelo_99))
cox_fit_99 <- survfit(modelo_99)
autoplot(cox_fit_99)
Ojo, la mediana no toca el 50%, por lo que da median = NA
cox_fit_99
summary(cox_fit_99)
aa_fit_99 <-aareg(Surv(time, Evento) ~
GÉNERO +
# df$`DIENTE AFECTADO` +
DIAGNÓSTICO +
# df$TRATAMIENTO +
# df$`TIEMPO HASTA LA ATENCIÓN (en horas)` +
`ESTADO RADICULAR INICIAL` +
`TRAUMATISMO REPETIDO` +
`TRAUMATISMO PREVIO` +
# df$`INDICACIÓN DE HIGIENE` +
`EVALUACIÓN DE HIGIENE` +
`ONICOFAGIA - INTERPOSICIÓN DE OBJETOS` ,
data = df)
autoplot(aa_fit_99)
hr = 2 # hazard ratio
hr0 = 1
pE = 0.8 # probabilidad del evento
pA = 0.5 # proporción en el grupo A
alpha = 0.05
beta = 0.20
(n=((qnorm(1-alpha/2)+qnorm(1-beta))/(log(hr)-log(hr0)))^2/(pA*(1-pA)*pE))
ceiling(n) # 82
(Power=pnorm((log(hr)-log(hr0))*sqrt(n*pA*(1-pA)*pE)-qnorm(1-alpha/2)))
https://www.openintro.org/download.php?file=survival_analysis_in_R&referrer=/stat/surv.php
https://courses.nus.edu.sg/course/stacar/internet/st3242/handouts/notes3.pdf
Chow S, Shao J, Wang H. 2008. Sample Size Calculations in Clinical Research. 2nd Ed. Chapman & Hall/CRC Biostatistics Series. page 177.