#Buscamos proporción de datos faltantes (Missingvalues)---- NO SE DETECTAN DATOS FALTANTES
#is.na(sad[ , 25:34])
#which(is.na(sad[ , 25:34]))
#which(is.na(sad[ , 42]))
#pasar variables categóricas a factor
names(sad)<- tolower(names (sad))
sad <- sad %>%
mutate(across(19:35, as.factor))
#crear cicat_factor
sad$cicat_factor <- factor(sad$cicat, levels = c(0, 1), labels = c( "No Cicatrizo", "Cicatrizo"))
table(sad$cicat_factor)
##
## No Cicatrizo Cicatrizo
## 174 232
#paso variables chr a factor
sad <- sad %>% mutate_if(is.character, as.factor)
#crear ampu_factor
sad$ampu_factor <- factor(sad$ampu, levels = c(0, 1), labels = c( "No Amputado", "Amputado"))
table(sad$ampu_factor)
##
## No Amputado Amputado
## 348 58
#crear fallecio_factor
sad$fallecio_factor <- factor(sad$fallecio, levels = c(0, 1), labels = c( "No Fallecido", "Fallecido"))
table(sad$fallecio_factor)
##
## No Fallecido Fallecido
## 392 14
#variable unificada
sad <- sad %>%
mutate(
estado = tolower(trimws(estado))
)
table(sad$estado)
##
## ampu cerro fallecio persiste
## 58 232 14 102
sad <- sad %>%
mutate(
estado_unif = case_when(
estado %in% c("ampu") ~ "amputacion",
estado %in% c("cerro") ~ "cerro_herida",
estado %in% c("murio", "fallecio") ~ "fallecio",
estado %in% c("persiste") ~ "persiste",
estado %in% c("perdido") ~ "perdido_seguimiento",
TRUE ~ NA_character_
)
)
table(sad$estado_unif)
##
## amputacion cerro_herida fallecio persiste
## 58 232 14 102
sad <- sad %>%
mutate(
evento_ampu = case_when(
estado_unif %in% c("cerro_herida","fallecio") ~ 2,
estado_unif %in% c("amputacion") ~ 1,
estado_unif %in% c("perdido_seguimiento", "persiste") ~ 0,
TRUE ~ NA_real_
)
)
table(sad$evento_ampu)
##
## 0 1 2
## 102 58 246
tiempo_evento_am <- Surv(sad$dias_out,sad$ampu)
library(tableone)
#Las variables van directamente sin el nombre del dataframe
catvars = c( "sexo","tbq", "iam", "hta", "dial", "local","topo", "inf", "ede", "neu", "prof", "area", "zon", "fase", "ant_pie", "am_cont")
#continuas
vars = c("dias_ev","san_elian", "sexo","tbq", "iam", "hta", "dial", "local","topo", "inf", "ede", "neu", "prof", "area", "zon", "fase", "edad", "ant_pie", "am_cont" )
tabla_1 <- CreateTableOne(vars = vars, factorVars = catvars, data = sad)
print(tabla_1)
##
## Overall
## n 406
## dias_ev (mean (SD)) 50.26 (112.85)
## san_elian (mean (SD)) 18.26 (4.09)
## sexo = M (%) 324 (79.8)
## tbq (%)
## 0 169 (41.8)
## 1 80 (19.8)
## 2 155 (38.4)
## iam = 1 (%) 83 (20.5)
## hta = 1 (%) 273 (67.4)
## dial = 1 (%) 19 ( 4.7)
## local (%)
## 1 196 (48.3)
## 2 134 (33.0)
## 3 76 (18.7)
## topo (%)
## 1 152 (37.4)
## 2 104 (25.6)
## 3 150 (36.9)
## inf (%)
## 0 86 (21.2)
## 1 32 ( 7.9)
## 2 223 (54.9)
## 3 65 (16.0)
## ede (%)
## 0 143 (35.2)
## 1 98 (24.1)
## 2 124 (30.5)
## 3 41 (10.1)
## neu (%)
## 0 4 ( 1.0)
## 1 25 ( 6.2)
## 2 341 (84.0)
## 3 36 ( 8.9)
## prof (%)
## 1 32 ( 7.9)
## 2 133 (32.8)
## 3 241 (59.4)
## area (%)
## 1 188 (46.3)
## 2 157 (38.7)
## 3 61 (15.0)
## zon (%)
## 1 242 (59.6)
## 2 90 (22.2)
## 3 74 (18.2)
## fase (%)
## 1 19 ( 4.7)
## 2 51 (12.6)
## 3 336 (82.8)
## edad (mean (SD)) 57.41 (11.09)
## ant_pie (%)
## 0 142 (35.0)
## 1 263 (64.8)
## 2 1 ( 0.2)
## am_cont = 1 (%) 23 ( 5.7)
kableone(tabla_1)
| Overall | |
|---|---|
| n | 406 |
| dias_ev (mean (SD)) | 50.26 (112.85) |
| san_elian (mean (SD)) | 18.26 (4.09) |
| sexo = M (%) | 324 (79.8) |
| tbq (%) | |
| 0 | 169 (41.8) |
| 1 | 80 (19.8) |
| 2 | 155 (38.4) |
| iam = 1 (%) | 83 (20.5) |
| hta = 1 (%) | 273 (67.4) |
| dial = 1 (%) | 19 ( 4.7) |
| local (%) | |
| 1 | 196 (48.3) |
| 2 | 134 (33.0) |
| 3 | 76 (18.7) |
| topo (%) | |
| 1 | 152 (37.4) |
| 2 | 104 (25.6) |
| 3 | 150 (36.9) |
| inf (%) | |
| 0 | 86 (21.2) |
| 1 | 32 ( 7.9) |
| 2 | 223 (54.9) |
| 3 | 65 (16.0) |
| ede (%) | |
| 0 | 143 (35.2) |
| 1 | 98 (24.1) |
| 2 | 124 (30.5) |
| 3 | 41 (10.1) |
| neu (%) | |
| 0 | 4 ( 1.0) |
| 1 | 25 ( 6.2) |
| 2 | 341 (84.0) |
| 3 | 36 ( 8.9) |
| prof (%) | |
| 1 | 32 ( 7.9) |
| 2 | 133 (32.8) |
| 3 | 241 (59.4) |
| area (%) | |
| 1 | 188 (46.3) |
| 2 | 157 (38.7) |
| 3 | 61 (15.0) |
| zon (%) | |
| 1 | 242 (59.6) |
| 2 | 90 (22.2) |
| 3 | 74 (18.2) |
| fase (%) | |
| 1 | 19 ( 4.7) |
| 2 | 51 (12.6) |
| 3 | 336 (82.8) |
| edad (mean (SD)) | 57.41 (11.09) |
| ant_pie (%) | |
| 0 | 142 (35.0) |
| 1 | 263 (64.8) |
| 2 | 1 ( 0.2) |
| am_cont = 1 (%) | 23 ( 5.7) |
tabla_ampu <- CreateTableOne(
vars = vars,
strata = "ampu",
factorVars = catvars,
data = sad,
addOverall = TRUE
)
print(tabla_ampu)
## Stratified by ampu
## Overall 0 1 p
## n 406 348 58
## dias_ev (mean (SD)) 50.26 (112.85) 49.01 (111.88) 57.74 (119.19) 0.586
## san_elian (mean (SD)) 18.26 (4.09) 17.55 (3.78) 22.52 (3.22) <0.001
## sexo = M (%) 324 (79.8) 279 (80.2) 45 (77.6) 0.781
## tbq (%) 0.974
## 0 169 (41.8) 144 (41.6) 25 (43.1)
## 1 80 (19.8) 69 (19.9) 11 (19.0)
## 2 155 (38.4) 133 (38.4) 22 (37.9)
## iam = 1 (%) 83 (20.5) 70 (20.2) 13 (22.4) 0.837
## hta = 1 (%) 273 (67.4) 228 (65.7) 45 (77.6) 0.102
## dial = 1 (%) 19 ( 4.7) 16 ( 4.6) 3 ( 5.2) 1.000
## local (%) 0.011
## 1 196 (48.3) 171 (49.1) 25 (43.1)
## 2 134 (33.0) 120 (34.5) 14 (24.1)
## 3 76 (18.7) 57 (16.4) 19 (32.8)
## topo (%) <0.001
## 1 152 (37.4) 146 (42.0) 6 (10.3)
## 2 104 (25.6) 97 (27.9) 7 (12.1)
## 3 150 (36.9) 105 (30.2) 45 (77.6)
## inf (%) <0.001
## 0 86 (21.2) 80 (23.0) 6 (10.3)
## 1 32 ( 7.9) 28 ( 8.0) 4 ( 6.9)
## 2 223 (54.9) 197 (56.6) 26 (44.8)
## 3 65 (16.0) 43 (12.4) 22 (37.9)
## ede (%) 0.163
## 0 143 (35.2) 121 (34.8) 22 (37.9)
## 1 98 (24.1) 90 (25.9) 8 (13.8)
## 2 124 (30.5) 101 (29.0) 23 (39.7)
## 3 41 (10.1) 36 (10.3) 5 ( 8.6)
## neu (%) 0.717
## 0 4 ( 1.0) 3 ( 0.9) 1 ( 1.7)
## 1 25 ( 6.2) 20 ( 5.7) 5 ( 8.6)
## 2 341 (84.0) 293 (84.2) 48 (82.8)
## 3 36 ( 8.9) 32 ( 9.2) 4 ( 6.9)
## prof (%) 0.003
## 1 32 ( 7.9) 31 ( 8.9) 1 ( 1.7)
## 2 133 (32.8) 122 (35.1) 11 (19.0)
## 3 241 (59.4) 195 (56.0) 46 (79.3)
## area (%) <0.001
## 1 188 (46.3) 178 (51.1) 10 (17.2)
## 2 157 (38.7) 138 (39.7) 19 (32.8)
## 3 61 (15.0) 32 ( 9.2) 29 (50.0)
## zon (%) <0.001
## 1 242 (59.6) 230 (66.1) 12 (20.7)
## 2 90 (22.2) 78 (22.4) 12 (20.7)
## 3 74 (18.2) 40 (11.5) 34 (58.6)
## fase (%) 0.010
## 1 19 ( 4.7) 19 ( 5.5) 0 ( 0.0)
## 2 51 (12.6) 49 (14.1) 2 ( 3.4)
## 3 336 (82.8) 280 (80.5) 56 (96.6)
## edad (mean (SD)) 57.41 (11.09) 56.54 (11.23) 62.64 (8.57) <0.001
## ant_pie (%) 0.068
## 0 142 (35.0) 114 (32.8) 28 (48.3)
## 1 263 (64.8) 233 (67.0) 30 (51.7)
## 2 1 ( 0.2) 1 ( 0.3) 0 ( 0.0)
## am_cont = 1 (%) 23 ( 5.7) 17 ( 4.9) 6 (10.3) 0.174
## Stratified by ampu
## test
## n
## dias_ev (mean (SD))
## san_elian (mean (SD))
## sexo = M (%)
## tbq (%)
## 0
## 1
## 2
## iam = 1 (%)
## hta = 1 (%)
## dial = 1 (%)
## local (%)
## 1
## 2
## 3
## topo (%)
## 1
## 2
## 3
## inf (%)
## 0
## 1
## 2
## 3
## ede (%)
## 0
## 1
## 2
## 3
## neu (%)
## 0
## 1
## 2
## 3
## prof (%)
## 1
## 2
## 3
## area (%)
## 1
## 2
## 3
## zon (%)
## 1
## 2
## 3
## fase (%)
## 1
## 2
## 3
## edad (mean (SD))
## ant_pie (%)
## 0
## 1
## 2
## am_cont = 1 (%)
kableone(tabla_ampu)
| Overall | 0 | 1 | p | test | |
|---|---|---|---|---|---|
| n | 406 | 348 | 58 | ||
| dias_ev (mean (SD)) | 50.26 (112.85) | 49.01 (111.88) | 57.74 (119.19) | 0.586 | |
| san_elian (mean (SD)) | 18.26 (4.09) | 17.55 (3.78) | 22.52 (3.22) | <0.001 | |
| sexo = M (%) | 324 (79.8) | 279 (80.2) | 45 (77.6) | 0.781 | |
| tbq (%) | 0.974 | ||||
| 0 | 169 (41.8) | 144 (41.6) | 25 (43.1) | ||
| 1 | 80 (19.8) | 69 (19.9) | 11 (19.0) | ||
| 2 | 155 (38.4) | 133 (38.4) | 22 (37.9) | ||
| iam = 1 (%) | 83 (20.5) | 70 (20.2) | 13 (22.4) | 0.837 | |
| hta = 1 (%) | 273 (67.4) | 228 (65.7) | 45 (77.6) | 0.102 | |
| dial = 1 (%) | 19 ( 4.7) | 16 ( 4.6) | 3 ( 5.2) | 1.000 | |
| local (%) | 0.011 | ||||
| 1 | 196 (48.3) | 171 (49.1) | 25 (43.1) | ||
| 2 | 134 (33.0) | 120 (34.5) | 14 (24.1) | ||
| 3 | 76 (18.7) | 57 (16.4) | 19 (32.8) | ||
| topo (%) | <0.001 | ||||
| 1 | 152 (37.4) | 146 (42.0) | 6 (10.3) | ||
| 2 | 104 (25.6) | 97 (27.9) | 7 (12.1) | ||
| 3 | 150 (36.9) | 105 (30.2) | 45 (77.6) | ||
| inf (%) | <0.001 | ||||
| 0 | 86 (21.2) | 80 (23.0) | 6 (10.3) | ||
| 1 | 32 ( 7.9) | 28 ( 8.0) | 4 ( 6.9) | ||
| 2 | 223 (54.9) | 197 (56.6) | 26 (44.8) | ||
| 3 | 65 (16.0) | 43 (12.4) | 22 (37.9) | ||
| ede (%) | 0.163 | ||||
| 0 | 143 (35.2) | 121 (34.8) | 22 (37.9) | ||
| 1 | 98 (24.1) | 90 (25.9) | 8 (13.8) | ||
| 2 | 124 (30.5) | 101 (29.0) | 23 (39.7) | ||
| 3 | 41 (10.1) | 36 (10.3) | 5 ( 8.6) | ||
| neu (%) | 0.717 | ||||
| 0 | 4 ( 1.0) | 3 ( 0.9) | 1 ( 1.7) | ||
| 1 | 25 ( 6.2) | 20 ( 5.7) | 5 ( 8.6) | ||
| 2 | 341 (84.0) | 293 (84.2) | 48 (82.8) | ||
| 3 | 36 ( 8.9) | 32 ( 9.2) | 4 ( 6.9) | ||
| prof (%) | 0.003 | ||||
| 1 | 32 ( 7.9) | 31 ( 8.9) | 1 ( 1.7) | ||
| 2 | 133 (32.8) | 122 (35.1) | 11 (19.0) | ||
| 3 | 241 (59.4) | 195 (56.0) | 46 (79.3) | ||
| area (%) | <0.001 | ||||
| 1 | 188 (46.3) | 178 (51.1) | 10 (17.2) | ||
| 2 | 157 (38.7) | 138 (39.7) | 19 (32.8) | ||
| 3 | 61 (15.0) | 32 ( 9.2) | 29 (50.0) | ||
| zon (%) | <0.001 | ||||
| 1 | 242 (59.6) | 230 (66.1) | 12 (20.7) | ||
| 2 | 90 (22.2) | 78 (22.4) | 12 (20.7) | ||
| 3 | 74 (18.2) | 40 (11.5) | 34 (58.6) | ||
| fase (%) | 0.010 | ||||
| 1 | 19 ( 4.7) | 19 ( 5.5) | 0 ( 0.0) | ||
| 2 | 51 (12.6) | 49 (14.1) | 2 ( 3.4) | ||
| 3 | 336 (82.8) | 280 (80.5) | 56 (96.6) | ||
| edad (mean (SD)) | 57.41 (11.09) | 56.54 (11.23) | 62.64 (8.57) | <0.001 | |
| ant_pie (%) | 0.068 | ||||
| 0 | 142 (35.0) | 114 (32.8) | 28 (48.3) | ||
| 1 | 263 (64.8) | 233 (67.0) | 30 (51.7) | ||
| 2 | 1 ( 0.2) | 1 ( 0.3) | 0 ( 0.0) | ||
| am_cont = 1 (%) | 23 ( 5.7) | 17 ( 4.9) | 6 (10.3) | 0.174 |
print(tabla_ampu,
nonnormal = c("dias_ev", "san_elian"),
showAllLevels = TRUE,
quote = FALSE,
noSpaces = TRUE)
## Stratified by ampu
## level Overall 0
## n 406 348
## dias_ev (median [IQR]) 20.00 [10.00, 45.00] 20.00 [10.00, 30.00]
## san_elian (median [IQR]) 18.00 [15.00, 21.00] 18.00 [15.00, 20.00]
## sexo (%) F 82 (20.2) 69 (19.8)
## M 324 (79.8) 279 (80.2)
## tbq (%) 0 169 (41.8) 144 (41.6)
## 1 80 (19.8) 69 (19.9)
## 2 155 (38.4) 133 (38.4)
## iam (%) 0 321 (79.5) 276 (79.8)
## 1 83 (20.5) 70 (20.2)
## hta (%) 0 132 (32.6) 119 (34.3)
## 1 273 (67.4) 228 (65.7)
## dial (%) 0 387 (95.3) 332 (95.4)
## 1 19 (4.7) 16 (4.6)
## local (%) 1 196 (48.3) 171 (49.1)
## 2 134 (33.0) 120 (34.5)
## 3 76 (18.7) 57 (16.4)
## topo (%) 1 152 (37.4) 146 (42.0)
## 2 104 (25.6) 97 (27.9)
## 3 150 (36.9) 105 (30.2)
## inf (%) 0 86 (21.2) 80 (23.0)
## 1 32 (7.9) 28 (8.0)
## 2 223 (54.9) 197 (56.6)
## 3 65 (16.0) 43 (12.4)
## ede (%) 0 143 (35.2) 121 (34.8)
## 1 98 (24.1) 90 (25.9)
## 2 124 (30.5) 101 (29.0)
## 3 41 (10.1) 36 (10.3)
## neu (%) 0 4 (1.0) 3 (0.9)
## 1 25 (6.2) 20 (5.7)
## 2 341 (84.0) 293 (84.2)
## 3 36 (8.9) 32 (9.2)
## prof (%) 1 32 (7.9) 31 (8.9)
## 2 133 (32.8) 122 (35.1)
## 3 241 (59.4) 195 (56.0)
## area (%) 1 188 (46.3) 178 (51.1)
## 2 157 (38.7) 138 (39.7)
## 3 61 (15.0) 32 (9.2)
## zon (%) 1 242 (59.6) 230 (66.1)
## 2 90 (22.2) 78 (22.4)
## 3 74 (18.2) 40 (11.5)
## fase (%) 1 19 (4.7) 19 (5.5)
## 2 51 (12.6) 49 (14.1)
## 3 336 (82.8) 280 (80.5)
## edad (mean (SD)) 57.41 (11.09) 56.54 (11.23)
## ant_pie (%) 0 142 (35.0) 114 (32.8)
## 1 263 (64.8) 233 (67.0)
## 2 1 (0.2) 1 (0.3)
## am_cont (%) 0 383 (94.3) 331 (95.1)
## 1 23 (5.7) 17 (4.9)
## Stratified by ampu
## 1 p test
## n 58
## dias_ev (median [IQR]) 30.00 [15.00, 60.00] 0.011 nonnorm
## san_elian (median [IQR]) 23.00 [20.25, 24.00] <0.001 nonnorm
## sexo (%) 13 (22.4) 0.781
## 45 (77.6)
## tbq (%) 25 (43.1) 0.974
## 11 (19.0)
## 22 (37.9)
## iam (%) 45 (77.6) 0.837
## 13 (22.4)
## hta (%) 13 (22.4) 0.102
## 45 (77.6)
## dial (%) 55 (94.8) 1.000
## 3 (5.2)
## local (%) 25 (43.1) 0.011
## 14 (24.1)
## 19 (32.8)
## topo (%) 6 (10.3) <0.001
## 7 (12.1)
## 45 (77.6)
## inf (%) 6 (10.3) <0.001
## 4 (6.9)
## 26 (44.8)
## 22 (37.9)
## ede (%) 22 (37.9) 0.163
## 8 (13.8)
## 23 (39.7)
## 5 (8.6)
## neu (%) 1 (1.7) 0.717
## 5 (8.6)
## 48 (82.8)
## 4 (6.9)
## prof (%) 1 (1.7) 0.003
## 11 (19.0)
## 46 (79.3)
## area (%) 10 (17.2) <0.001
## 19 (32.8)
## 29 (50.0)
## zon (%) 12 (20.7) <0.001
## 12 (20.7)
## 34 (58.6)
## fase (%) 0 (0.0) 0.010
## 2 (3.4)
## 56 (96.6)
## edad (mean (SD)) 62.64 (8.57) <0.001
## ant_pie (%) 28 (48.3) 0.068
## 30 (51.7)
## 0 (0.0)
## am_cont (%) 52 (89.7) 0.174
## 6 (10.3)
kableone(tabla_ampu)
| Overall | 0 | 1 | p | test | |
|---|---|---|---|---|---|
| n | 406 | 348 | 58 | ||
| dias_ev (mean (SD)) | 50.26 (112.85) | 49.01 (111.88) | 57.74 (119.19) | 0.586 | |
| san_elian (mean (SD)) | 18.26 (4.09) | 17.55 (3.78) | 22.52 (3.22) | <0.001 | |
| sexo = M (%) | 324 (79.8) | 279 (80.2) | 45 (77.6) | 0.781 | |
| tbq (%) | 0.974 | ||||
| 0 | 169 (41.8) | 144 (41.6) | 25 (43.1) | ||
| 1 | 80 (19.8) | 69 (19.9) | 11 (19.0) | ||
| 2 | 155 (38.4) | 133 (38.4) | 22 (37.9) | ||
| iam = 1 (%) | 83 (20.5) | 70 (20.2) | 13 (22.4) | 0.837 | |
| hta = 1 (%) | 273 (67.4) | 228 (65.7) | 45 (77.6) | 0.102 | |
| dial = 1 (%) | 19 ( 4.7) | 16 ( 4.6) | 3 ( 5.2) | 1.000 | |
| local (%) | 0.011 | ||||
| 1 | 196 (48.3) | 171 (49.1) | 25 (43.1) | ||
| 2 | 134 (33.0) | 120 (34.5) | 14 (24.1) | ||
| 3 | 76 (18.7) | 57 (16.4) | 19 (32.8) | ||
| topo (%) | <0.001 | ||||
| 1 | 152 (37.4) | 146 (42.0) | 6 (10.3) | ||
| 2 | 104 (25.6) | 97 (27.9) | 7 (12.1) | ||
| 3 | 150 (36.9) | 105 (30.2) | 45 (77.6) | ||
| inf (%) | <0.001 | ||||
| 0 | 86 (21.2) | 80 (23.0) | 6 (10.3) | ||
| 1 | 32 ( 7.9) | 28 ( 8.0) | 4 ( 6.9) | ||
| 2 | 223 (54.9) | 197 (56.6) | 26 (44.8) | ||
| 3 | 65 (16.0) | 43 (12.4) | 22 (37.9) | ||
| ede (%) | 0.163 | ||||
| 0 | 143 (35.2) | 121 (34.8) | 22 (37.9) | ||
| 1 | 98 (24.1) | 90 (25.9) | 8 (13.8) | ||
| 2 | 124 (30.5) | 101 (29.0) | 23 (39.7) | ||
| 3 | 41 (10.1) | 36 (10.3) | 5 ( 8.6) | ||
| neu (%) | 0.717 | ||||
| 0 | 4 ( 1.0) | 3 ( 0.9) | 1 ( 1.7) | ||
| 1 | 25 ( 6.2) | 20 ( 5.7) | 5 ( 8.6) | ||
| 2 | 341 (84.0) | 293 (84.2) | 48 (82.8) | ||
| 3 | 36 ( 8.9) | 32 ( 9.2) | 4 ( 6.9) | ||
| prof (%) | 0.003 | ||||
| 1 | 32 ( 7.9) | 31 ( 8.9) | 1 ( 1.7) | ||
| 2 | 133 (32.8) | 122 (35.1) | 11 (19.0) | ||
| 3 | 241 (59.4) | 195 (56.0) | 46 (79.3) | ||
| area (%) | <0.001 | ||||
| 1 | 188 (46.3) | 178 (51.1) | 10 (17.2) | ||
| 2 | 157 (38.7) | 138 (39.7) | 19 (32.8) | ||
| 3 | 61 (15.0) | 32 ( 9.2) | 29 (50.0) | ||
| zon (%) | <0.001 | ||||
| 1 | 242 (59.6) | 230 (66.1) | 12 (20.7) | ||
| 2 | 90 (22.2) | 78 (22.4) | 12 (20.7) | ||
| 3 | 74 (18.2) | 40 (11.5) | 34 (58.6) | ||
| fase (%) | 0.010 | ||||
| 1 | 19 ( 4.7) | 19 ( 5.5) | 0 ( 0.0) | ||
| 2 | 51 (12.6) | 49 (14.1) | 2 ( 3.4) | ||
| 3 | 336 (82.8) | 280 (80.5) | 56 (96.6) | ||
| edad (mean (SD)) | 57.41 (11.09) | 56.54 (11.23) | 62.64 (8.57) | <0.001 | |
| ant_pie (%) | 0.068 | ||||
| 0 | 142 (35.0) | 114 (32.8) | 28 (48.3) | ||
| 1 | 263 (64.8) | 233 (67.0) | 30 (51.7) | ||
| 2 | 1 ( 0.2) | 1 ( 0.3) | 0 ( 0.0) | ||
| am_cont = 1 (%) | 23 ( 5.7) | 17 ( 4.9) | 6 (10.3) | 0.174 |
wilcox.test(sad$dias_ev, sad$ampu)
##
## Wilcoxon rank sum test with continuity correction
##
## data: sad$dias_ev and sad$ampu
## W = 163502, p-value <0.0000000000000002
## alternative hypothesis: true location shift is not equal to 0
wilcox.test(sad$san_elian, sad$ampu)
##
## Wilcoxon rank sum test with continuity correction
##
## data: sad$san_elian and sad$ampu
## W = 164836, p-value <0.0000000000000002
## alternative hypothesis: true location shift is not equal to 0
#variables categorizadas
#Las variables van directamente sin el nombre del dataframe
#evaluacion de la cantidad de eventos por tiempo de seguimiento a intervalos de a 30 dias
sad %>%
filter(ampu == 1) %>%
mutate(intervalo = cut(dias_out,
breaks = seq(0, max(dias_out), by = 30))) %>%
count(intervalo) %>%
ggplot(aes(x = intervalo, y = n)) +
geom_col(fill = "darkorange") +
labs(x = "Intervalos de tiempo (30 dias)",
y = "Eventos",
title = "Eventos por intervalo de seguimiento") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
#eventos según valoren la escala de San Elian
sad %>%
filter(ampu == 1) %>%
mutate(intervalo = cut(san_elian,
breaks = seq(0, max(san_elian), by = 1))) %>%
count(intervalo) %>%
ggplot(aes(x = intervalo, y = n)) +
geom_col(fill = "darkorange") +
labs(x = "Escala de San Elian",
y = "Eventos",
title = "Eventos por escala") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
#diferencia en el valor de la escala en pacientes cicatrizados, amputados y fallecidos
table(sad$estado_unif)
##
## amputacion cerro_herida fallecio persiste
## 58 232 14 102
describeBy(sad$san_elian, sad$estado_unif)
##
## Descriptive statistics by group
## group: amputacion
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 58 22.5 3.22 23 22.6 2.97 15 29 14 -0.29 -0.33 0.42
## ------------------------------------------------------------
## group: cerro_herida
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 232 17.2 3.76 17 17.2 4.45 8 26 18 -0.19 -0.5 0.25
## ------------------------------------------------------------
## group: fallecio
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 14 19.3 4.75 20.5 19.3 5.19 11 27 16 -0.17 -1.32 1.27
## ------------------------------------------------------------
## group: persiste
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 102 18.2 3.58 18 18.3 2.97 9 26 17 -0.28 -0.28 0.35
hist(sad$san_elian[sad$estado_unif=="amputacion"])
hist(sad$san_elian[sad$estado_unif=="cerro_herida"])
hist(sad$san_elian[sad$estado_unif=="fallecio"])
hist(sad$san_elian[sad$estado_unif=="persiste"])
shapiro.test(sad$san_elian[sad$estado_unif=="amputacion"])
##
## Shapiro-Wilk normality test
##
## data: sad$san_elian[sad$estado_unif == "amputacion"]
## W = 1, p-value = 0.2
shapiro.test(sad$san_elian[sad$estado_unif=="cerro_herida"])
##
## Shapiro-Wilk normality test
##
## data: sad$san_elian[sad$estado_unif == "cerro_herida"]
## W = 1, p-value = 0.01
shapiro.test(sad$san_elian[sad$estado_unif=="fallecio"])
##
## Shapiro-Wilk normality test
##
## data: sad$san_elian[sad$estado_unif == "fallecio"]
## W = 0.9, p-value = 0.5
shapiro.test(sad$san_elian[sad$estado_unif=="persiste"])
##
## Shapiro-Wilk normality test
##
## data: sad$san_elian[sad$estado_unif == "persiste"]
## W = 1, p-value = 0.1
qqnorm(sad$san_elian[sad$estado_unif=="amputacion"])
qqnorm(sad$san_elian[sad$estado_unif=="cerro_herida"])
qqnorm(sad$san_elian[sad$estado_unif=="fallecio"])
qqnorm(sad$san_elian[sad$estado_unif=="persiste"])
kruskal.test(sad$san_elian, sad$estado_unif)
##
## Kruskal-Wallis rank sum test
##
## data: sad$san_elian and sad$estado_unif
## Kruskal-Wallis chi-squared = 76, df = 3, p-value <0.0000000000000002
pairwise.wilcox.test(sad$san_elian, sad$estado_unif,"bonferroni")
##
## Pairwise comparisons using Wilcoxon rank sum test with continuity correction
##
## data: sad$san_elian and sad$estado_unif
##
## amputacion cerro_herida fallecio
## cerro_herida < 0.0000000000000002 - -
## fallecio 0.1 0.5 -
## persiste 0.0000000001 0.1 1.0
##
## P value adjustment method: bonferroni
tapply(sad$san_elian,
sad$estado_unif,
quantile,
probs = c(0.25, 0.75),
na.rm = TRUE)
## $amputacion
## 25% 75%
## 20.2 24.0
##
## $cerro_herida
## 25% 75%
## 15 20
##
## $fallecio
## 25% 75%
## 15 22
##
## $persiste
## 25% 75%
## 16 20
cox_model_san <- coxph(tiempo_evento_am ~ san_elian + edad, data = sad)
summary(cox_model_san)
## Call:
## coxph(formula = tiempo_evento_am ~ san_elian + edad, data = sad)
##
## n= 406, number of events= 58
##
## coef exp(coef) se(coef) z Pr(>|z|)
## san_elian 0.3424 1.4083 0.0416 8.24 <0.0000000000000002 ***
## edad 0.0361 1.0368 0.0137 2.64 0.0083 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## san_elian 1.41 0.710 1.30 1.53
## edad 1.04 0.965 1.01 1.06
##
## Concordance= 0.845 (se = 0.022 )
## Likelihood ratio test= 93.7 on 2 df, p=<0.0000000000000002
## Wald test = 82.1 on 2 df, p=<0.0000000000000002
## Score (logrank) test = 85.9 on 2 df, p=<0.0000000000000002
tab_model(cox_model_san,
show.ci = TRUE, # Mostrar intervalo de confianza
show.se = TRUE, # Mostrar error estándar
transform = "exp", # Para mostrar HR en lugar de log(HR)
dv.labels = "Modelo de Cox - Datos drugs")
| Modelo de Cox - Datos drugs | ||||
|---|---|---|---|---|
| Predictors | Estimates | std. Error | CI | p |
| san elian | 1.41 | 0.06 | 0.00 – Inf | <0.001 |
| edad | 1.04 | 0.01 | 0.00 – Inf | 0.008 |
| Observations | 406 | |||
| R2 Nagelkerke | 0.257 | |||
confint(cox_model_san)
## 2.5 % 97.5 %
## san_elian 0.26091 0.4238
## edad 0.00928 0.0629
#Test de proporcionalidad de riesgos de Schoenfeld
test_ph <- cox.zph(cox_model_san)
test_ph
## chisq df p
## san_elian 3.579 1 0.059
## edad 0.315 1 0.575
## GLOBAL 4.153 2 0.125
#Gráficos por variables de residuos de Schoenfeld en el tiempo
ggcoxzph(test_ph)
## Warning: ggtheme is not a valid theme.
## Please use `theme()` to construct themes.
## ggtheme is not a valid theme.
## Please use `theme()` to construct themes.
CUMPLE EL SUPUESTO DE RIESGOS PROPORCIONALES
# Martingale y Deviance
ggcoxdiagnostics(cox_model_san, type = "martingale", linear.predictions = FALSE)
## `geom_smooth()` using formula = 'y ~ x'
ggcoxdiagnostics(cox_model_san, type = "deviance", linear.predictions = FALSE)
## `geom_smooth()` using formula = 'y ~ x'
ADECUACION EVALUADA POR DEVIANCE Y MARTINGALE
#C de harrell
summary(cox_model_san)$concordance
## C se(C)
## 0.8451 0.0221
#bootstrap
#Indice D de Somer (Dxy), Metricas Q D U, slope y R2 con paquete `rms`
dd <- datadist(sad); options(datadist = "dd")
## Warning in datadist(sad): ...44 is constant
cox_metrics <- cph(tiempo_evento_am ~ san_elian,
data = sad, x = TRUE, y = TRUE, surv = TRUE)
# Validamos métricas con bootstrap
invisible(capture.output({ #esta linea es para evitar que se imprima el output del bootstrap)
cox_rms <- validate(cox_metrics, method = "boot", B = 200)
}))
# Revisamos las metricas validadas (en la columna index.corrected)
cox_rms
## index.orig training test optimism index.corrected n
## Dxy 0.668 0.6733 0.6677 0.0055 0.6622 200
## R2 0.240 0.2455 0.2396 0.0059 0.2337 200
## Slope 1.000 1.0000 0.9840 0.0160 0.9840 200
## D 0.130 0.1355 0.1303 0.0052 0.1251 200
## U -0.003 -0.0031 0.0013 -0.0045 0.0014 200
## Q 0.133 0.1386 0.1290 0.0097 0.1237 200
## g 1.673 1.7166 1.6727 0.0438 1.6289 200
round(cox_rms[,5],2)
## Dxy R2 Slope D U Q g
## 0.66 0.23 0.98 0.13 0.00 0.12 1.63
Métrica Qué evalúa Valores esperados Interpretación C (Harrell’s C) Discriminación 0.5 – 1 0.5 = azar; 0.7 aceptable; 0.8–0.9 muy buena; >0.9 excelente Dxy Discriminación (derivado de C) 0 – 1 0 = sin discriminación; 1 = perfecta R² Ajuste global (variabilidad explicada) 0 – 1 0.1–0.2 habitual; 0.2–0.4 bueno; >0.4 alto (raro en clínica) Slope (calibración) Calibración ≈ 1 1 = ideal; <1 sobreajuste; >1 subajuste Intercepto (si se reporta) Calibración ≈ 0 0 = sin sesgo sistemático D Separación de riesgos >0 mayor = mejor separación U Error de calibración ≈ 0 0 = ideal Q Calidad global (D – U) >0 mayor = mejor modelo g (Gini / log-risk separation) Separación del riesgo >0 mayor = mejor discriminación Brier score Error de predicción 0 – 1 menor = mejor; <0.25 aceptable; <0.10 bueno AUC (ROC) Discriminación 0.5 – 1 igual que C: >0.8 bueno Optimismo (bootstrap) Sobreajuste ≈ 0 cercano a 0 = modelo estable
# Calibración. Evaluación Gráfica
invisible(capture.output({cal <- calibrate(cox_metrics, method = "boot", B = 200, u = 120)
}))
plot(cal,
subtitles = FALSE,
lwd = 2,
lty = 2,
main = "Grafico de Calibracion",
cex.main = 1.2,
cex.axis = 0.7,
cex.lab = 0.9,
xlab = "Probabilidad Predicha de Ampu",
ylab = "Amaputacion observada")
#modelo de Fine and gray
modelo_fg_san <- FGR(
formula = Hist(dias_out, evento_ampu) ~ san_elian + edad
, data = sad,
cause = 1 # Aclara que ampu es el evento de interés
)
modelo_fg_san
##
## Right-censored response of a competing.risks model
##
## No.Observations: 406
##
## Pattern:
##
## Cause event right.censored
## 1 58 0
## 2 246 0
## unknown 0 102
##
##
## Fine-Gray model: analysis of cause 1
##
## Competing Risks Regression
##
## Call:
## FGR(formula = Hist(dias_out, evento_ampu) ~ san_elian + edad,
## data = sad, cause = 1)
##
## coef exp(coef) se(coef) z p-value
## san_elian 0.3442 1.41 0.0361 9.53 0.0000
## edad 0.0332 1.03 0.0108 3.08 0.0021
##
## exp(coef) exp(-coef) 2.5% 97.5%
## san_elian 1.41 0.709 1.31 1.51
## edad 1.03 0.967 1.01 1.06
##
## Num. cases = 406
## Pseudo Log-likelihood = -291
## Pseudo likelihood ratio test = 97.1 on 2 df,
##
## Convergence: TRUE
# Evaluar performance predictiva con Score. AUC
score_fg_san <- Score(
object = list("FG model" = modelo_fg_san),
formula = Hist(dias_out, evento_ampu) ~ 1,
data = sad,
times = c(17:200),
metrics = "auc",
summary = "IPA",
cens.model = "km",
cause = 1
)
score_fg_san$AUC$score
## model times AUC se lower upper
## <fctr> <int> <num> <num> <num> <num>
## 1: FG model 17 0.892 0.0221 0.849 0.935
## 2: FG model 18 0.896 0.0212 0.854 0.937
## 3: FG model 19 0.910 0.0184 0.874 0.946
## 4: FG model 20 0.910 0.0184 0.874 0.946
## 5: FG model 21 0.915 0.0179 0.880 0.950
## ---
## 180: FG model 196 0.848 0.0267 0.796 0.900
## 181: FG model 197 0.847 0.0268 0.794 0.899
## 182: FG model 198 0.847 0.0268 0.794 0.899
## 183: FG model 199 0.847 0.0268 0.794 0.899
## 184: FG model 200 0.846 0.0269 0.793 0.898
# Calibracion global
s <- Score(list("FGR" = modelo_fg_san),
formula = Hist(dias_out, evento_ampu) ~ 1,
data = sad,
plots = "calibration",
summary = "IPA",
cause = 1)
plotCalibration(s, models = "FGR" )
tendencia a la subestimación del riesgo en los pacientes con mayor
probabilidad predicha
# Calibracion tiempo especifico
t <- Score(list("FGR" = modelo_fg_san),
formula = Hist(dias_out, evento_ampu) ~ 1,
data = sad,
plots = "calibration",
summary = "IPA",
times = c(1:180),
cause = 1)
plotCalibration(t, models = "FGR", times = 30)
plotCalibration(t, models = "FGR", times = 60 )
plotCalibration(t, models = "FGR", times = 90)
plotCalibration(t, models = "FGR", times = 130 )
plotCalibration(t, models = "FGR", times = 180 )
library(prodlim)
# Modelo Fine-Gray
mod_fg <- FGR(Hist(dias_out, evento_ampu) ~ san_elian + edad,
data = sad,
cause = 1)
# Tiempos de interés
times <- c(30, 60, 90, 120, 180)
#CALCULADORA!
# CIF según covariables
newdata0 <- data.frame(
san_elian =20,
edad = 72
)
predictRisk(mod_fg, newdata = newdata0, times = times)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.103 0.142 0.163 0.188 0.198
times_seq <- 1:180
cif_base <- predictRisk(mod_fg, newdata = newdata0, times = times_seq)
plot(times_seq, cif_base[1,], type = "l",
xlab = "Días", ylab = "CIF basal",
main = "Baseline CIF")
#splines, evaluacion de posible no linealidad
library(prodlim)
library(splines)
library(splines)
spl_san <- ns(sad$san_elian, df = 3)
sad$san1 <- spl_san[,1]
sad$san2 <- spl_san[,2]
sad$san3 <- spl_san[,3]
library(riskRegression)
mod_spline <- FGR(
Hist(dias_out, evento_ampu) ~ san1 + san2 + san3 + edad,
data = sad,
cause = 1
)
mod_lin <- FGR(
Hist(dias_out, evento_ampu) ~ san_elian + edad,
data = sad,
cause = 1
)
sc <- Score(
object = list("Lineal" = mod_lin, "Spline" = mod_spline),
formula = Hist(dias_out, evento_ampu) ~ 1,
data = sad,
times = c(180),
metrics = c("auc", "brier"),
cause = 1
)
sc
##
## Metric AUC:
##
## Results by model:
##
## model times AUC lower upper
## <fctr> <num> <char> <char> <char>
## 1: Lineal 180 85.0 79.9 90.2
## 2: Spline 180 85.0 79.8 90.2
##
## Results of model comparisons:
##
## times model reference delta.AUC lower upper p
## <num> <fctr> <fctr> <char> <char> <char> <num>
## 1: 180 Spline Lineal -0.0 -0.1 0.1 0.4
##
## NOTE: Values are multiplied by 100 and given in %.
## NOTE: The higher AUC the better.
##
## Metric Brier:
##
## Results by model:
##
## model times Brier lower upper
## <fctr> <num> <char> <char> <char>
## 1: Null model 180 12.7 10.2 15.2
## 2: Lineal 180 9.4 7.3 11.5
## 3: Spline 180 9.4 7.3 11.5
##
## Results of model comparisons:
##
## times model reference delta.Brier lower upper p
## <num> <fctr> <fctr> <char> <char> <char> <num>
## 1: 180 Lineal Null model -3.3 -5.0 -1.6 0.000106
## 2: 180 Spline Null model -3.3 -5.0 -1.6 0.000108
## 3: 180 Spline Lineal 0.0 -0.0 0.0 0.932968
##
## NOTE: Values are multiplied by 100 and given in %.
## NOTE: The lower Brier the better.
Se evaluó la posible no linealidad en la relación entre la escala de San Elián y la amputación mayor mediante modelos con splines restringidos. Sin embargo, no se observaron mejoras en la discriminación ni en el error de predicción respecto al modelo lineal, lo que sugiere que la relación puede ser adecuadamente modelada como lineal en esta cohorte. Entonces… ¿por qué tenías mala calibración arriba?
Más probable que sea por:
pocos pacientes en alto riesgo pocos eventos en ese rango variabilidad estadística no por forma funcional del predictor
#voy a hacer bootstrap para evaluar optimismo. medidas de discriminacion y calibracion corregidas
#library(riskRegression)
library(prodlim)
mod_fg <- FGR(
Hist(dias_out, evento_ampu) ~ san_elian + edad,
data = sad,
cause = 1
)
set.seed(123)
sc_boot <- Score(
object = list("Modelo" = mod_fg),
formula = Hist(dias_out, evento_ampu) ~ 1,
data = sad,
times = 180,
metrics = c("auc", "brier"),
summary = "risks",
cause = 1,
split.method = "bootcv", # ← bootstrap
B = 200, # ← número de muestras bootstrap (200–500 ideal)
conf.int = TRUE,
plots = "calibration"
)
## Running crossvalidation algorithm
## Fitting the models in 200 learning datasets, then predicting the risks in validation datasets
## | | | 0% | | | 1% | | | 2% | |= | 3% | |= | 4% | |= | 5% | |= | 6% | |= | 7% | |== | 8% | |== | 9% | |== | 10% | |== | 11% | |== | 12% | |=== | 13% | |=== | 14% | |=== | 15% | |=== | 16% | |=== | 17% | |==== | 18% | |==== | 19% | |==== | 20% | |==== | 21% | |==== | 22% | |===== | 23% | |===== | 24% | |===== | 25% | |===== | 26% | |===== | 27% | |====== | 28% | |====== | 29% | |====== | 30% | |====== | 31% | |====== | 32% | |======= | 33% | |======= | 34% | |======= | 35% | |======= | 36% | |======= | 37% | |======== | 38% | |======== | 39% | |======== | 40% | |======== | 41% | |======== | 42% | |========= | 43% | |========= | 44% | |========= | 45% | |========= | 46% | |========= | 47% | |========== | 48% | |========== | 49% | |========== | 50% | |========== | 51% | |========== | 52% | |=========== | 53% | |=========== | 54% | |=========== | 55% | |=========== | 56% | |=========== | 57% | |============ | 58% | |============ | 59% | |============ | 60% | |============ | 61% | |============ | 62% | |============= | 63% | |============= | 64% | |============= | 65% | |============= | 66% | |============= | 67% | |============== | 68% | |============== | 69% | |============== | 70% | |============== | 71% | |============== | 72% | |=============== | 73% | |=============== | 74% | |=============== | 75% | |=============== | 76% | |=============== | 77% | |================ | 78% | |================ | 79% | |================ | 80% | |================ | 81% | |================ | 82% | |================= | 83% | |================= | 84% | |================= | 85% | |================= | 86% | |================= | 87% | |================== | 88% | |================== | 89% | |================== | 90% | |================== | 91% | |================== | 92% | |=================== | 93% | |=================== | 94% | |=================== | 95% | |=================== | 96% | |=================== | 97% | |====================| 98% | |====================| 99% | |====================| 100%
## | | | 0%
## Calculating the performance metrics in 200 validation data sets
## | | | 1% | | | 2% | |= | 3% | |= | 4% | |= | 5% | |= | 6% | |= | 7% | |== | 8% | |== | 9% | |== | 10% | |== | 11% | |== | 12% | |=== | 13% | |=== | 14% | |=== | 15% | |=== | 16% | |=== | 17% | |==== | 18% | |==== | 19% | |==== | 20% | |==== | 21% | |==== | 22% | |===== | 23% | |===== | 24% | |===== | 25% | |===== | 26% | |===== | 27% | |====== | 28% | |====== | 29% | |====== | 30% | |====== | 31% | |====== | 32% | |======= | 33% | |======= | 34% | |======= | 35% | |======= | 36% | |======= | 37% | |======== | 38% | |======== | 39% | |======== | 40% | |======== | 41% | |======== | 42% | |========= | 43% | |========= | 44% | |========= | 45% | |========= | 46% | |========= | 47% | |========== | 48% | |========== | 49% | |========== | 50% | |========== | 51% | |========== | 52% | |=========== | 53% | |=========== | 54% | |=========== | 55% | |=========== | 56% | |=========== | 57% | |============ | 58% | |============ | 59% | |============ | 60% | |============ | 61% | |============ | 62% | |============= | 63% | |============= | 64% | |============= | 65% | |============= | 66% | |============= | 67% | |============== | 68% | |============== | 69% | |============== | 70% | |============== | 71% | |============== | 72% | |=============== | 73% | |=============== | 74% | |=============== | 75% | |=============== | 76% | |=============== | 77% | |================ | 78% | |================ | 79% | |================ | 80% | |================ | 81% | |================ | 82% | |================= | 83% | |================= | 84% | |================= | 85% | |================= | 86% | |================= | 87% | |================== | 88% | |================== | 89% | |================== | 90% | |================== | 91% | |================== | 92% | |=================== | 93% | |=================== | 94% | |=================== | 95% | |=================== | 96% | |=================== | 97% | |====================| 98% | |====================| 99% | |====================| 100%
sc_boot$AUC
##
## Results by model:
##
## model times AUC lower upper
## <fctr> <num> <char> <char> <char>
## 1: Modelo 180 84.753 78.412 90.357
##
## NOTE: Values are multiplied by 100 and given in %.
## NOTE: The higher AUC the better.
sc_boot$Brier
##
## Results by model:
##
## model times Brier lower upper
## <fctr> <num> <char> <char> <char>
## 1: Null model 180 12.895 9.995 15.806
## 2: Modelo 180 9.718 7.309 12.658
##
## Results of model comparisons:
##
## model times reference delta.Brier lower upper
## <fctr> <num> <fctr> <char> <char> <char>
## 1: Modelo 180 Null model -3.177 -5.059 -1.126
##
## NOTE: Values are multiplied by 100 and given in %.
## NOTE: The lower Brier the better.
plotCalibration(sc_boot)
La validación interna se realizó mediante bootstrap con 200
repeticiones, estimando el optimismo del modelo y obteniendo medidas de
discriminación y error de predicción corregidas.
#categorización de san elian
library(dplyr)
sad <- sad %>%
mutate(
san_elian_cat = case_when(
san_elian <= 9 ~ "leve",
san_elian >= 10 & san_elian <= 20 ~ "moderada",
san_elian >= 21 ~ "grave",
TRUE ~ NA_character_
)
)
#CIF
cifivhx <- cuminc(Surv(dias_out, factor(evento_ampu)) ~ san_elian_cat, data=sad)
cifivhx
##
## ── cuminc() ────────────────────────────────────────────────────────────────────
## • Failure type "1"
## strata time n.risk estimate std.error 95% CI
## grave 100 50 0.338 0.044 0.253, 0.424
## grave 200 18 0.358 0.045 0.271, 0.445
## grave 300 3 0.371 0.046 0.282, 0.460
## leve 100 1 0.000 0.000 NA, NA
## leve 200 0 0.000 0.000 NA, NA
## leve 300 0 0.000 0.000 NA, NA
## moderada 100 110 0.042 0.012 0.022, 0.071
## moderada 200 32 0.060 0.015 0.035, 0.095
## moderada 300 9 0.060 0.015 0.035, 0.095
## • Failure type "2"
## strata time n.risk estimate std.error 95% CI
## grave 100 50 0.167 0.035 0.105, 0.242
## grave 200 18 0.416 0.050 0.318, 0.510
## grave 300 3 0.578 0.052 0.470, 0.671
## leve 100 1 0.833 0.202 0.086, 0.987
## leve 200 0 0.833 0.202 0.086, 0.987
## leve 300 0 0.833 0.202 0.086, 0.987
## moderada 100 110 0.488 0.032 0.425, 0.548
## moderada 200 32 0.726 0.031 0.659, 0.781
## moderada 300 9 0.844 0.031 0.772, 0.895
## • Tests
## outcome statistic df p.value
## 1 63.9 2.00 <0.001
## 2 41.7 2.00 <0.001
library(tidycmprsk)
library(ggsurvfit)
ggcuminc(
cifivhx,
outcome = c(1, 2),
linetype_aes = TRUE
) +
scale_color_manual(
name = "san_elian_cat",
values = c("leve" = "#56B4E9", "moderada" = "#E69F00","grave"="#a25")
) +
scale_linetype_manual(
name = "Tipo de evento",
values = c("solid", "dashed"),
labels = c(
"Evento de interes (amputacion)",
"Evento competitivo (muerte / cicatrizacion)"
)
) +
labs(
x = "Tiempo (dias)",
y = "Incidencia acumulada"
) +
theme_minimal() +
theme(
legend.position = "bottom"
)
## Warning: Removed 170 rows containing missing values or values outside the scale range
## (`geom_step()`).
#Gray test
cuminc_obja <- cmprsk::cuminc(
ftime = sad$dias_out,
fstatus = sad$evento_ampu,
group = sad$san_elian_cat
)
cuminc_obja
## Tests:
## stat pv df
## 1 63.9 0.000000000000013 2
## 2 41.7 0.000000000869993 2
## Estimates and Variances:
## $est
## 100 200 300
## grave 1 0.3376 0.3576 0.3710
## leve 1 0.0000 NA NA
## moderada 1 0.0419 0.0605 0.0605
## grave 2 0.1671 0.4156 0.5775
## leve 2 0.8333 NA NA
## moderada 2 0.4880 0.7255 0.8442
##
## $var
## 100 200 300
## grave 1 0.001925 0.002007 0.002108
## leve 1 0.000000 NA NA
## moderada 1 0.000153 0.000233 0.000233
## grave 2 0.001251 0.002454 0.002665
## leve 2 0.040656 NA NA
## moderada 2 0.000996 0.000966 0.000957
#Gray test e incidencias acumuladas a 180 días
sad$dias_180 <- pmin(sad$dias_out, 180)
sad$evento_180 <- ifelse(sad$dias_out <= 180, sad$evento_ampu, 0)
cuminc_obja_180 <- cmprsk::cuminc(
ftime = sad$dias_180,
fstatus = sad$evento_180,
group = sad$san_elian_cat
)
cuminc_obja_180
## Tests:
## stat pv df
## 1 61.9 0.0000000000000359 2
## 2 37.0 0.0000000092186401 2
## Estimates and Variances:
## $est
## 50 100 150
## grave 1 0.2826 0.3376 0.3576
## leve 1 0.0000 0.0000 NA
## moderada 1 0.0340 0.0419 0.0605
## grave 2 0.0916 0.1671 0.3447
## leve 2 0.6667 0.8333 NA
## moderada 2 0.2156 0.4880 0.6276
##
## $var
## 50 100 150
## grave 1 0.001702 0.001925 0.002007
## leve 1 0.000000 0.000000 NA
## moderada 1 0.000125 0.000153 0.000233
## grave 2 0.000700 0.001251 0.002209
## leve 2 0.051512 0.040656 NA
## moderada 2 0.000643 0.000996 0.001008
mod_fg_cat <- FGR(
Hist(dias_out, evento_ampu) ~ san_elian_cat + edad,
data = sad,
cause = 1
)
mod_fg_cat
##
## Right-censored response of a competing.risks model
##
## No.Observations: 406
##
## Pattern:
##
## Cause event right.censored
## 1 58 0
## 2 246 0
## unknown 0 102
##
##
## Fine-Gray model: analysis of cause 1
##
## Competing Risks Regression
##
## Call:
## FGR(formula = Hist(dias_out, evento_ampu) ~ san_elian_cat + edad,
## data = sad, cause = 1)
##
## coef exp(coef) se(coef) z p-value
## san_elian_catleve -11.5527 0.00000961 0.4618 -25.01 0.000000000000
## san_elian_catmoderada -2.0027 0.13496706 0.2968 -6.75 0.000000000015
## edad 0.0387 1.03941315 0.0114 3.38 0.000720000000
##
## exp(coef) exp(-coef) 2.5% 97.5%
## san_elian_catleve 0.00000961 104062.795 0.00000389 0.0000238
## san_elian_catmoderada 0.13496706 7.409 0.07543126 0.2414928
## edad 1.03941315 0.962 1.01638485 1.0629632
##
## Num. cases = 406
## Pseudo Log-likelihood = -305
## Pseudo likelihood ratio test = 69.1 on 3 df,
##
## Convergence: TRUE
#curvas roc del modelo
pred_180 <- predictRisk(mod_fg, newdata = sad, times = 180)
pred_90 <- predictRisk(mod_fg, newdata = sad, times = 90)
pred_120 <- predictRisk(mod_fg, newdata = sad, times = 120)
library(timeROC)
## Warning: package 'timeROC' was built under R version 4.4.3
roc_model_180 <- timeROC(
T = sad$dias_out,
delta = sad$evento_ampu,
marker = as.numeric(pred_180),
cause = 1,
times = 180,
iid = TRUE
)
plot(roc_model_180, time = 180)
roc_model_90 <- timeROC(
T = sad$dias_out,
delta = sad$evento_ampu,
marker = as.numeric(pred_90),
cause = 1,
times = 90,
iid = TRUE
)
plot(roc_model_90, time = 90)
roc_model_120 <- timeROC(
T = sad$dias_out,
delta = sad$evento_ampu,
marker = as.numeric(pred_120),
cause = 1,
times = 120,
iid = TRUE
)
plot(roc_model_120, time = 120)
MODELO DE CAUSA ESPECÍFICA
#modelo de causa específica
#Opcion con objeto creado
#si evento es 1, es porque se amputo
#si evento es 2, es porque se murió o cicatrizó
table(sad$evento_ampu)
##
## 0 1 2
## 102 58 246
tiempo_ampu <- Surv(sad$dias_out, sad$evento_ampu==1)
tiempo_compet <- Surv(sad$dias_out, sad$evento_ampu==2)
cox_ampu <- coxph(tiempo_ampu ~
san_elian + edad , data = sad)
summary(cox_ampu)
## Call:
## coxph(formula = tiempo_ampu ~ san_elian + edad, data = sad)
##
## n= 406, number of events= 58
##
## coef exp(coef) se(coef) z Pr(>|z|)
## san_elian 0.3424 1.4083 0.0416 8.24 <0.0000000000000002 ***
## edad 0.0361 1.0368 0.0137 2.64 0.0083 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## san_elian 1.41 0.710 1.30 1.53
## edad 1.04 0.965 1.01 1.06
##
## Concordance= 0.845 (se = 0.022 )
## Likelihood ratio test= 93.7 on 2 df, p=<0.0000000000000002
## Wald test = 82.1 on 2 df, p=<0.0000000000000002
## Score (logrank) test = 85.9 on 2 df, p=<0.0000000000000002
cox_compet <- coxph(tiempo_compet ~
san_elian + edad
, data = sad)
summary(cox_compet)
## Call:
## coxph(formula = tiempo_compet ~ san_elian + edad, data = sad)
##
## n= 406, number of events= 246
##
## coef exp(coef) se(coef) z Pr(>|z|)
## san_elian -0.06442 0.93761 0.01742 -3.70 0.00022 ***
## edad -0.02199 0.97825 0.00656 -3.35 0.00081 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## san_elian 0.938 1.07 0.906 0.970
## edad 0.978 1.02 0.966 0.991
##
## Concordance= 0.606 (se = 0.022 )
## Likelihood ratio test= 28.2 on 2 df, p=0.0000008
## Wald test = 28 on 2 df, p=0.0000008
## Score (logrank) test = 28.2 on 2 df, p=0.0000007
#modelo de causa específica
modelo_CSC <- CSC(
formula = Hist(dias_out, evento_ampu) ~ san_elian +edad, data = sad,
cause = 1 # Aclara que CHD es el evento de interés
)
# Ver resultados. Ojo! No funciona si hacés summary(modelo)
# Vamos a tener el modelo de interés y debajo el modelo competitivo
modelo_CSC
## CSC(formula = Hist(dias_out, evento_ampu) ~ san_elian + edad,
## data = sad, cause = 1)
##
## Right-censored response of a competing.risks model
##
## No.Observations: 406
##
## Pattern:
##
## Cause event right.censored
## 1 58 0
## 2 246 0
## unknown 0 102
##
##
## ----------> Cause: 1
##
## Call:
## coxph(formula = survival::Surv(time, status) ~ san_elian + edad,
## x = TRUE, y = TRUE)
##
## n= 406, number of events= 58
##
## coef exp(coef) se(coef) z Pr(>|z|)
## san_elian 0.3424 1.4083 0.0416 8.24 <0.0000000000000002 ***
## edad 0.0361 1.0368 0.0137 2.64 0.0083 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## san_elian 1.41 0.710 1.30 1.53
## edad 1.04 0.965 1.01 1.06
##
## Concordance= 0.845 (se = 0.022 )
## Likelihood ratio test= 93.7 on 2 df, p=<0.0000000000000002
## Wald test = 82.1 on 2 df, p=<0.0000000000000002
## Score (logrank) test = 85.9 on 2 df, p=<0.0000000000000002
##
##
##
## ----------> Cause: 2
##
## Call:
## coxph(formula = survival::Surv(time, status) ~ san_elian + edad,
## x = TRUE, y = TRUE)
##
## n= 406, number of events= 246
##
## coef exp(coef) se(coef) z Pr(>|z|)
## san_elian -0.06442 0.93761 0.01742 -3.70 0.00022 ***
## edad -0.02199 0.97825 0.00656 -3.35 0.00081 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## san_elian 0.938 1.07 0.906 0.970
## edad 0.978 1.02 0.966 0.991
##
## Concordance= 0.606 (se = 0.022 )
## Likelihood ratio test= 28.2 on 2 df, p=0.0000008
## Wald test = 28 on 2 df, p=0.0000008
## Score (logrank) test = 28.2 on 2 df, p=0.0000007
#score comparado con ipa
score_comp <-Score(
list("FG model" = modelo_fg_san, "CSC model" = modelo_CSC),
formula = Hist(dias_out, evento_ampu) ~ 1,
data = sad,
times = c(0:200),
cause = 1,
metrics ="auc",
summary = "IPA"
)
#Extraigo las IPAs por tiempo y modelo
ipa <- as.data.frame(score_comp$Brier$score)[, c("model", "times", "IPA")]
ipa
## model times IPA
## 1 Null model 0 NaN
## 2 Null model 1 0.00000
## 3 Null model 2 0.00000
## 4 Null model 3 0.00000
## 5 Null model 4 0.00000
## 6 Null model 5 0.00000
## 7 Null model 6 0.00000
## 8 Null model 7 0.00000
## 9 Null model 8 0.00000
## 10 Null model 9 0.00000
## 11 Null model 10 0.00000
## 12 Null model 11 0.00000
## 13 Null model 12 0.00000
## 14 Null model 13 0.00000
## 15 Null model 14 0.00000
## 16 Null model 15 0.00000
## 17 Null model 16 0.00000
## 18 Null model 17 0.00000
## 19 Null model 18 0.00000
## 20 Null model 19 0.00000
## 21 Null model 20 0.00000
## 22 Null model 21 0.00000
## 23 Null model 22 0.00000
## 24 Null model 23 0.00000
## 25 Null model 24 0.00000
## 26 Null model 25 0.00000
## 27 Null model 26 0.00000
## 28 Null model 27 0.00000
## 29 Null model 28 0.00000
## 30 Null model 29 0.00000
## 31 Null model 30 0.00000
## 32 Null model 31 0.00000
## 33 Null model 32 0.00000
## 34 Null model 33 0.00000
## 35 Null model 34 0.00000
## 36 Null model 35 0.00000
## 37 Null model 36 0.00000
## 38 Null model 37 0.00000
## 39 Null model 38 0.00000
## 40 Null model 39 0.00000
## 41 Null model 40 0.00000
## 42 Null model 41 0.00000
## 43 Null model 42 0.00000
## 44 Null model 43 0.00000
## 45 Null model 44 0.00000
## 46 Null model 45 0.00000
## 47 Null model 46 0.00000
## 48 Null model 47 0.00000
## 49 Null model 48 0.00000
## 50 Null model 49 0.00000
## 51 Null model 50 0.00000
## 52 Null model 51 0.00000
## 53 Null model 52 0.00000
## 54 Null model 53 0.00000
## 55 Null model 54 0.00000
## 56 Null model 55 0.00000
## 57 Null model 56 0.00000
## 58 Null model 57 0.00000
## 59 Null model 58 0.00000
## 60 Null model 59 0.00000
## 61 Null model 60 0.00000
## 62 Null model 61 0.00000
## 63 Null model 62 0.00000
## 64 Null model 63 0.00000
## 65 Null model 64 0.00000
## 66 Null model 65 0.00000
## 67 Null model 66 0.00000
## 68 Null model 67 0.00000
## 69 Null model 68 0.00000
## 70 Null model 69 0.00000
## 71 Null model 70 0.00000
## 72 Null model 71 0.00000
## 73 Null model 72 0.00000
## 74 Null model 73 0.00000
## 75 Null model 74 0.00000
## 76 Null model 75 0.00000
## 77 Null model 76 0.00000
## 78 Null model 77 0.00000
## 79 Null model 78 0.00000
## 80 Null model 79 0.00000
## 81 Null model 80 0.00000
## 82 Null model 81 0.00000
## 83 Null model 82 0.00000
## 84 Null model 83 0.00000
## 85 Null model 84 0.00000
## 86 Null model 85 0.00000
## 87 Null model 86 0.00000
## 88 Null model 87 0.00000
## 89 Null model 88 0.00000
## 90 Null model 89 0.00000
## 91 Null model 90 0.00000
## 92 Null model 91 0.00000
## 93 Null model 92 0.00000
## 94 Null model 93 0.00000
## 95 Null model 94 0.00000
## 96 Null model 95 0.00000
## 97 Null model 96 0.00000
## 98 Null model 97 0.00000
## 99 Null model 98 0.00000
## 100 Null model 99 0.00000
## 101 Null model 100 0.00000
## 102 Null model 101 0.00000
## 103 Null model 102 0.00000
## 104 Null model 103 0.00000
## 105 Null model 104 0.00000
## 106 Null model 105 0.00000
## 107 Null model 106 0.00000
## 108 Null model 107 0.00000
## 109 Null model 108 0.00000
## 110 Null model 109 0.00000
## 111 Null model 110 0.00000
## 112 Null model 111 0.00000
## 113 Null model 112 0.00000
## 114 Null model 113 0.00000
## 115 Null model 114 0.00000
## 116 Null model 115 0.00000
## 117 Null model 116 0.00000
## 118 Null model 117 0.00000
## 119 Null model 118 0.00000
## 120 Null model 119 0.00000
## 121 Null model 120 0.00000
## 122 Null model 121 0.00000
## 123 Null model 122 0.00000
## 124 Null model 123 0.00000
## 125 Null model 124 0.00000
## 126 Null model 125 0.00000
## 127 Null model 126 0.00000
## 128 Null model 127 0.00000
## 129 Null model 128 0.00000
## 130 Null model 129 0.00000
## 131 Null model 130 0.00000
## 132 Null model 131 0.00000
## 133 Null model 132 0.00000
## 134 Null model 133 0.00000
## 135 Null model 134 0.00000
## 136 Null model 135 0.00000
## 137 Null model 136 0.00000
## 138 Null model 137 0.00000
## 139 Null model 138 0.00000
## 140 Null model 139 0.00000
## 141 Null model 140 0.00000
## 142 Null model 141 0.00000
## 143 Null model 142 0.00000
## 144 Null model 143 0.00000
## 145 Null model 144 0.00000
## 146 Null model 145 0.00000
## 147 Null model 146 0.00000
## 148 Null model 147 0.00000
## 149 Null model 148 0.00000
## 150 Null model 149 0.00000
## 151 Null model 150 0.00000
## 152 Null model 151 0.00000
## 153 Null model 152 0.00000
## 154 Null model 153 0.00000
## 155 Null model 154 0.00000
## 156 Null model 155 0.00000
## 157 Null model 156 0.00000
## 158 Null model 157 0.00000
## 159 Null model 158 0.00000
## 160 Null model 159 0.00000
## 161 Null model 160 0.00000
## 162 Null model 161 0.00000
## 163 Null model 162 0.00000
## 164 Null model 163 0.00000
## 165 Null model 164 0.00000
## 166 Null model 165 0.00000
## 167 Null model 166 0.00000
## 168 Null model 167 0.00000
## 169 Null model 168 0.00000
## 170 Null model 169 0.00000
## 171 Null model 170 0.00000
## 172 Null model 171 0.00000
## 173 Null model 172 0.00000
## 174 Null model 173 0.00000
## 175 Null model 174 0.00000
## 176 Null model 175 0.00000
## 177 Null model 176 0.00000
## 178 Null model 177 0.00000
## 179 Null model 178 0.00000
## 180 Null model 179 0.00000
## 181 Null model 180 0.00000
## 182 Null model 181 0.00000
## 183 Null model 182 0.00000
## 184 Null model 183 0.00000
## 185 Null model 184 0.00000
## 186 Null model 185 0.00000
## 187 Null model 186 0.00000
## 188 Null model 187 0.00000
## 189 Null model 188 0.00000
## 190 Null model 189 0.00000
## 191 Null model 190 0.00000
## 192 Null model 191 0.00000
## 193 Null model 192 0.00000
## 194 Null model 193 0.00000
## 195 Null model 194 0.00000
## 196 Null model 195 0.00000
## 197 Null model 196 0.00000
## 198 Null model 197 0.00000
## 199 Null model 198 0.00000
## 200 Null model 199 0.00000
## 201 Null model 200 0.00000
## 202 FG model 0 NaN
## 203 FG model 1 0.02497
## 204 FG model 2 0.02497
## 205 FG model 3 0.02497
## 206 FG model 4 0.02497
## 207 FG model 5 0.02497
## 208 FG model 6 0.02491
## 209 FG model 7 0.02348
## 210 FG model 8 0.02339
## 211 FG model 9 0.02568
## 212 FG model 10 0.01370
## 213 FG model 11 0.02123
## 214 FG model 12 0.05061
## 215 FG model 13 0.09874
## 216 FG model 14 0.08498
## 217 FG model 15 0.08275
## 218 FG model 16 0.08238
## 219 FG model 17 0.08531
## 220 FG model 18 0.15003
## 221 FG model 19 0.22796
## 222 FG model 20 0.22796
## 223 FG model 21 0.24986
## 224 FG model 22 0.25465
## 225 FG model 23 0.26802
## 226 FG model 24 0.25917
## 227 FG model 25 0.26927
## 228 FG model 26 0.26927
## 229 FG model 27 0.30532
## 230 FG model 28 0.30470
## 231 FG model 29 0.31251
## 232 FG model 30 0.31251
## 233 FG model 31 0.31251
## 234 FG model 32 0.31251
## 235 FG model 33 0.31251
## 236 FG model 34 0.31219
## 237 FG model 35 0.31219
## 238 FG model 36 0.31219
## 239 FG model 37 0.31211
## 240 FG model 38 0.31211
## 241 FG model 39 0.31211
## 242 FG model 40 0.30443
## 243 FG model 41 0.29462
## 244 FG model 42 0.28899
## 245 FG model 43 0.28899
## 246 FG model 44 0.28899
## 247 FG model 45 0.28899
## 248 FG model 46 0.28505
## 249 FG model 47 0.28505
## 250 FG model 48 0.26565
## 251 FG model 49 0.26520
## 252 FG model 50 0.26475
## 253 FG model 51 0.26475
## 254 FG model 52 0.26475
## 255 FG model 53 0.26428
## 256 FG model 54 0.26428
## 257 FG model 55 0.26428
## 258 FG model 56 0.26428
## 259 FG model 57 0.27185
## 260 FG model 58 0.27185
## 261 FG model 59 0.28075
## 262 FG model 60 0.28075
## 263 FG model 61 0.28075
## 264 FG model 62 0.28075
## 265 FG model 63 0.28258
## 266 FG model 64 0.27434
## 267 FG model 65 0.27434
## 268 FG model 66 0.28180
## 269 FG model 67 0.28127
## 270 FG model 68 0.28216
## 271 FG model 69 0.28216
## 272 FG model 70 0.27655
## 273 FG model 71 0.27655
## 274 FG model 72 0.27594
## 275 FG model 73 0.28217
## 276 FG model 74 0.28217
## 277 FG model 75 0.28217
## 278 FG model 76 0.28217
## 279 FG model 77 0.28217
## 280 FG model 78 0.28160
## 281 FG model 79 0.28160
## 282 FG model 80 0.28160
## 283 FG model 81 0.28160
## 284 FG model 82 0.28073
## 285 FG model 83 0.28689
## 286 FG model 84 0.28689
## 287 FG model 85 0.28689
## 288 FG model 86 0.28689
## 289 FG model 87 0.28689
## 290 FG model 88 0.28689
## 291 FG model 89 0.28606
## 292 FG model 90 0.28883
## 293 FG model 91 0.28814
## 294 FG model 92 0.28749
## 295 FG model 93 0.28749
## 296 FG model 94 0.28749
## 297 FG model 95 0.28681
## 298 FG model 96 0.28681
## 299 FG model 97 0.28681
## 300 FG model 98 0.29269
## 301 FG model 99 0.29269
## 302 FG model 100 0.29269
## 303 FG model 101 0.29198
## 304 FG model 102 0.29178
## 305 FG model 103 0.29104
## 306 FG model 104 0.29034
## 307 FG model 105 0.29034
## 308 FG model 106 0.28979
## 309 FG model 107 0.28166
## 310 FG model 108 0.28166
## 311 FG model 109 0.28166
## 312 FG model 110 0.28166
## 313 FG model 111 0.28166
## 314 FG model 112 0.28080
## 315 FG model 113 0.28534
## 316 FG model 114 0.29374
## 317 FG model 115 0.29290
## 318 FG model 116 0.29290
## 319 FG model 117 0.29119
## 320 FG model 118 0.29119
## 321 FG model 119 0.28863
## 322 FG model 120 0.28845
## 323 FG model 121 0.27765
## 324 FG model 122 0.27765
## 325 FG model 123 0.27765
## 326 FG model 124 0.27765
## 327 FG model 125 0.27765
## 328 FG model 126 0.27765
## 329 FG model 127 0.27765
## 330 FG model 128 0.27661
## 331 FG model 129 0.27661
## 332 FG model 130 0.27661
## 333 FG model 131 0.27661
## 334 FG model 132 0.27661
## 335 FG model 133 0.27661
## 336 FG model 134 0.27661
## 337 FG model 135 0.27557
## 338 FG model 136 0.26828
## 339 FG model 137 0.26828
## 340 FG model 138 0.26828
## 341 FG model 139 0.26828
## 342 FG model 140 0.26603
## 343 FG model 141 0.26488
## 344 FG model 142 0.26488
## 345 FG model 143 0.26488
## 346 FG model 144 0.26399
## 347 FG model 145 0.26324
## 348 FG model 146 0.26324
## 349 FG model 147 0.26182
## 350 FG model 148 0.26182
## 351 FG model 149 0.26182
## 352 FG model 150 0.26182
## 353 FG model 151 0.26259
## 354 FG model 152 0.26259
## 355 FG model 153 0.26259
## 356 FG model 154 0.26259
## 357 FG model 155 0.26259
## 358 FG model 156 0.26259
## 359 FG model 157 0.26259
## 360 FG model 158 0.26259
## 361 FG model 159 0.26259
## 362 FG model 160 0.26259
## 363 FG model 161 0.26259
## 364 FG model 162 0.26259
## 365 FG model 163 0.26259
## 366 FG model 164 0.26259
## 367 FG model 165 0.26259
## 368 FG model 166 0.26259
## 369 FG model 167 0.26407
## 370 FG model 168 0.26407
## 371 FG model 169 0.26407
## 372 FG model 170 0.26170
## 373 FG model 171 0.26170
## 374 FG model 172 0.26170
## 375 FG model 173 0.26170
## 376 FG model 174 0.26170
## 377 FG model 175 0.26098
## 378 FG model 176 0.26098
## 379 FG model 177 0.26098
## 380 FG model 178 0.26098
## 381 FG model 179 0.26098
## 382 FG model 180 0.26098
## 383 FG model 181 0.25947
## 384 FG model 182 0.25947
## 385 FG model 183 0.25947
## 386 FG model 184 0.25947
## 387 FG model 185 0.25947
## 388 FG model 186 0.25947
## 389 FG model 187 0.25947
## 390 FG model 188 0.25947
## 391 FG model 189 0.25791
## 392 FG model 190 0.25618
## 393 FG model 191 0.25618
## 394 FG model 192 0.25516
## 395 FG model 193 0.25516
## 396 FG model 194 0.25516
## 397 FG model 195 0.25516
## 398 FG model 196 0.25401
## 399 FG model 197 0.25222
## 400 FG model 198 0.25082
## 401 FG model 199 0.25082
## 402 FG model 200 0.24877
## 403 CSC model 0 NaN
## 404 CSC model 1 0.02281
## 405 CSC model 2 0.02281
## 406 CSC model 3 0.02281
## 407 CSC model 4 0.02281
## 408 CSC model 5 0.02281
## 409 CSC model 6 0.02275
## 410 CSC model 7 0.02033
## 411 CSC model 8 0.02023
## 412 CSC model 9 0.02206
## 413 CSC model 10 0.00827
## 414 CSC model 11 0.01281
## 415 CSC model 12 0.04269
## 416 CSC model 13 0.09666
## 417 CSC model 14 0.07839
## 418 CSC model 15 0.07569
## 419 CSC model 16 0.07528
## 420 CSC model 17 0.07866
## 421 CSC model 18 0.14860
## 422 CSC model 19 0.23071
## 423 CSC model 20 0.23071
## 424 CSC model 21 0.25294
## 425 CSC model 22 0.25745
## 426 CSC model 23 0.27062
## 427 CSC model 24 0.26089
## 428 CSC model 25 0.27170
## 429 CSC model 26 0.27170
## 430 CSC model 27 0.30914
## 431 CSC model 28 0.30845
## 432 CSC model 29 0.31620
## 433 CSC model 30 0.31620
## 434 CSC model 31 0.31620
## 435 CSC model 32 0.31620
## 436 CSC model 33 0.31620
## 437 CSC model 34 0.31585
## 438 CSC model 35 0.31585
## 439 CSC model 36 0.31585
## 440 CSC model 37 0.31521
## 441 CSC model 38 0.31521
## 442 CSC model 39 0.31521
## 443 CSC model 40 0.30681
## 444 CSC model 41 0.29629
## 445 CSC model 42 0.29003
## 446 CSC model 43 0.29003
## 447 CSC model 44 0.29003
## 448 CSC model 45 0.29003
## 449 CSC model 46 0.28522
## 450 CSC model 47 0.28522
## 451 CSC model 48 0.26458
## 452 CSC model 49 0.26409
## 453 CSC model 50 0.26359
## 454 CSC model 51 0.26359
## 455 CSC model 52 0.26359
## 456 CSC model 53 0.26309
## 457 CSC model 54 0.26309
## 458 CSC model 55 0.26309
## 459 CSC model 56 0.26309
## 460 CSC model 57 0.27191
## 461 CSC model 58 0.27191
## 462 CSC model 59 0.27961
## 463 CSC model 60 0.27961
## 464 CSC model 61 0.27961
## 465 CSC model 62 0.27961
## 466 CSC model 63 0.28166
## 467 CSC model 64 0.27255
## 468 CSC model 65 0.27255
## 469 CSC model 66 0.28014
## 470 CSC model 67 0.27951
## 471 CSC model 68 0.28053
## 472 CSC model 69 0.28053
## 473 CSC model 70 0.27445
## 474 CSC model 71 0.27445
## 475 CSC model 72 0.27380
## 476 CSC model 73 0.28091
## 477 CSC model 74 0.28091
## 478 CSC model 75 0.28091
## 479 CSC model 76 0.28091
## 480 CSC model 77 0.28091
## 481 CSC model 78 0.28029
## 482 CSC model 79 0.28029
## 483 CSC model 80 0.28029
## 484 CSC model 81 0.28029
## 485 CSC model 82 0.27937
## 486 CSC model 83 0.28594
## 487 CSC model 84 0.28594
## 488 CSC model 85 0.28594
## 489 CSC model 86 0.28594
## 490 CSC model 87 0.28594
## 491 CSC model 88 0.28594
## 492 CSC model 89 0.28518
## 493 CSC model 90 0.28815
## 494 CSC model 91 0.28741
## 495 CSC model 92 0.28670
## 496 CSC model 93 0.28670
## 497 CSC model 94 0.28670
## 498 CSC model 95 0.28597
## 499 CSC model 96 0.28597
## 500 CSC model 97 0.28597
## 501 CSC model 98 0.29150
## 502 CSC model 99 0.29150
## 503 CSC model 100 0.29150
## 504 CSC model 101 0.29073
## 505 CSC model 102 0.29059
## 506 CSC model 103 0.28979
## 507 CSC model 104 0.28925
## 508 CSC model 105 0.28925
## 509 CSC model 106 0.28864
## 510 CSC model 107 0.27982
## 511 CSC model 108 0.27982
## 512 CSC model 109 0.27982
## 513 CSC model 110 0.27982
## 514 CSC model 111 0.27982
## 515 CSC model 112 0.27890
## 516 CSC model 113 0.28345
## 517 CSC model 114 0.29263
## 518 CSC model 115 0.29174
## 519 CSC model 116 0.29174
## 520 CSC model 117 0.29058
## 521 CSC model 118 0.29058
## 522 CSC model 119 0.28786
## 523 CSC model 120 0.28785
## 524 CSC model 121 0.27642
## 525 CSC model 122 0.27642
## 526 CSC model 123 0.27642
## 527 CSC model 124 0.27642
## 528 CSC model 125 0.27642
## 529 CSC model 126 0.27642
## 530 CSC model 127 0.27642
## 531 CSC model 128 0.27532
## 532 CSC model 129 0.27532
## 533 CSC model 130 0.27532
## 534 CSC model 131 0.27532
## 535 CSC model 132 0.27532
## 536 CSC model 133 0.27532
## 537 CSC model 134 0.27532
## 538 CSC model 135 0.27422
## 539 CSC model 136 0.26688
## 540 CSC model 137 0.26688
## 541 CSC model 138 0.26688
## 542 CSC model 139 0.26688
## 543 CSC model 140 0.26451
## 544 CSC model 141 0.26329
## 545 CSC model 142 0.26329
## 546 CSC model 143 0.26329
## 547 CSC model 144 0.26231
## 548 CSC model 145 0.26157
## 549 CSC model 146 0.26157
## 550 CSC model 147 0.25997
## 551 CSC model 148 0.25997
## 552 CSC model 149 0.25997
## 553 CSC model 150 0.25997
## 554 CSC model 151 0.26059
## 555 CSC model 152 0.26059
## 556 CSC model 153 0.26059
## 557 CSC model 154 0.26059
## 558 CSC model 155 0.26059
## 559 CSC model 156 0.26059
## 560 CSC model 157 0.26059
## 561 CSC model 158 0.26059
## 562 CSC model 159 0.26059
## 563 CSC model 160 0.26059
## 564 CSC model 161 0.26059
## 565 CSC model 162 0.26059
## 566 CSC model 163 0.26059
## 567 CSC model 164 0.26059
## 568 CSC model 165 0.26059
## 569 CSC model 166 0.26059
## 570 CSC model 167 0.26206
## 571 CSC model 168 0.26206
## 572 CSC model 169 0.26206
## 573 CSC model 170 0.25955
## 574 CSC model 171 0.25955
## 575 CSC model 172 0.25955
## 576 CSC model 173 0.25955
## 577 CSC model 174 0.25955
## 578 CSC model 175 0.25880
## 579 CSC model 176 0.25880
## 580 CSC model 177 0.25880
## 581 CSC model 178 0.25880
## 582 CSC model 179 0.25880
## 583 CSC model 180 0.25880
## 584 CSC model 181 0.25720
## 585 CSC model 182 0.25720
## 586 CSC model 183 0.25720
## 587 CSC model 184 0.25720
## 588 CSC model 185 0.25720
## 589 CSC model 186 0.25720
## 590 CSC model 187 0.25720
## 591 CSC model 188 0.25720
## 592 CSC model 189 0.25554
## 593 CSC model 190 0.25372
## 594 CSC model 191 0.25372
## 595 CSC model 192 0.25256
## 596 CSC model 193 0.25256
## 597 CSC model 194 0.25256
## 598 CSC model 195 0.25256
## 599 CSC model 196 0.25140
## 600 CSC model 197 0.24951
## 601 CSC model 198 0.24805
## 602 CSC model 199 0.24805
## 603 CSC model 200 0.24587
# Gráfico
library(ggplot2)
ggplot(ipa, aes(x = times, y = IPA, color = model)) +
geom_line(linewidth = 1.2) +
geom_point(size = 3) +
geom_text(aes(label = percent(IPA, accuracy = 0.1)),
vjust = -0.8, size = 3, show.legend = FALSE) +
scale_y_continuous(labels = percent_format(accuracy = 0.1),
limits = c(0, NA)) +
scale_color_manual(
values = c(
"Null model" = "gray40",
"FG model" = "#2ECC71",
"CSC model" = "#3498DB"
),
drop = FALSE # <- muy importante para que no elimine niveles
) +
labs(
title = "(IPA) en el tiempo",
x = "Dias de seguimiento", y = "IPA", color = "Modelo"
) +
theme_minimal() +
theme(legend.position = "bottom", plot.title.position = "plot")+ scale_x_continuous(
limits = c(30, 200),
breaks = seq(30, 200, by = 10)
)
## Warning: Removed 90 rows containing missing values or values outside the scale range
## (`geom_line()`).
## Warning: Removed 90 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Warning: Removed 90 rows containing missing values or values outside the scale range
## (`geom_text()`).
#Extraigo los AUC por tiempo y modelo
score <- as.data.frame(score_comp$AUC$score)
# Gráfico
ggplot(score, aes(x = times, y = AUC, color = model)) +
geom_line(linewidth = 1.2) +
geom_point(size = 3) +
geom_hline(yintercept = 0.5, linetype = "dashed", alpha = 0.2) +
geom_hline(yintercept = 0.7, linetype = "dotted", alpha = 0.2) +
scale_color_manual(values = c("FG model" = "#E74C3C", "CSC model" = "#3498DB")) +
scale_y_continuous(limits = c(0.45, 0.95), breaks = seq(0.5, 0.8, 0.1)) +
labs(
title = "Discriminacion de Modelos en el Tiempo",
subtitle = "Linea punteada = Azar (0.5), Linea punteada = Adecuada (0.7)",
x = "Dias de seguimiento",
y = "AUC (Area bajo la curva ROC)",
color = "Modelo"
) +
theme_minimal() +
theme(legend.position = "bottom")
## Warning: Removed 14 rows containing missing values or values outside the scale range
## (`geom_line()`).
## Warning: Removed 14 rows containing missing values or values outside the scale range
## (`geom_point()`).
#Interpretamos que año a año la capacidad discriminativa de los modelos se mantiene alta, tanto en CSC como en FGR
#análisis de sensibilidad
#Considerando a todos los que se perdieron antes de los 30 días como amputados
sad_sens<- sad
table(sad_sens$estado_unif)
##
## amputacion cerro_herida fallecio persiste
## 58 232 14 102
sad_sens <- sad_sens %>%
mutate(
evento_ampu = ifelse(
sad_sens$estado_unif == "persiste" & dias_out < 31,
1,
evento_ampu
)
)
table(sad_sens$evento_ampu)
##
## 0 1 2
## 86 74 246
mod_fyg_sens <- FGR(
formula = Hist(dias_out, evento_ampu) ~ san_elian + edad
, data = sad_sens,
cause = 1 )
mod_fyg_sens
##
## Right-censored response of a competing.risks model
##
## No.Observations: 406
##
## Pattern:
##
## Cause event right.censored
## 1 74 0
## 2 246 0
## unknown 0 86
##
##
## Fine-Gray model: analysis of cause 1
##
## Competing Risks Regression
##
## Call:
## FGR(formula = Hist(dias_out, evento_ampu) ~ san_elian + edad,
## data = sad_sens, cause = 1)
##
## coef exp(coef) se(coef) z p-value
## san_elian 0.243 1.27 0.03190 7.61 0.000000000000027
## edad 0.021 1.02 0.00948 2.21 0.027000000000000
##
## exp(coef) exp(-coef) 2.5% 97.5%
## san_elian 1.27 0.784 1.2 1.36
## edad 1.02 0.979 1.0 1.04
##
## Num. cases = 406
## Pseudo Log-likelihood = -402
## Pseudo likelihood ratio test = 66.6 on 2 df,
##
## Convergence: TRUE
Multiplica la isquemia para ver si mejora la calibración, pero no
#voy a multiplicar por 2 isquemia a ver si mejora la calibración del modelo
sadx4= sad
sadx4$isq_num <- as.numeric(as.character(sadx4$isq))
sadx4$zon_num <- as.numeric(as.character(sadx4$zon))
sadx4$inf_num <- as.numeric(as.character(sadx4$inf))
sadx4$ede_num <- as.numeric(as.character(sadx4$ede))
sadx4$local_num <- as.numeric(as.character(sadx4$local))
sadx4$topo_num <- as.numeric(as.character(sadx4$topo))
sadx4$prof_num <- as.numeric(as.character(sadx4$prof))
sadx4$area_num <- as.numeric(as.character(sadx4$area))
sadx4$fase_num <- as.numeric(as.character(sadx4$fase))
sadx4$neu_num <- as.numeric(as.character(sadx4$neu))
sadx4$isq2 <- sadx4$isq * 7
## Warning in Ops.factor(sadx4$isq, 7): '*' no es significativo para factores
sadx4$san_elian <- rowSums(
sadx4[, c("isq2", "local_num", "topo_num", "zon_num", "inf_num", "ede_num", "neu_num", "prof_num", "area_num", "fase_num")],
na.rm = TRUE
)
mod_fgx4 <- FGR(
Hist(dias_out, evento_ampu) ~ san_elian + edad,
data = sadx4,
cause = 1
)
describe(sadx4$san_elian)
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 406 17.1 3.71 17 17.1 4.45 8 26 18 0.01 -0.46 0.18
describe(sad$san_elian)
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 406 18.3 4.09 18 18.3 4.45 8 29 21 -0.1 -0.38 0.2
mod_fgx4
##
## Right-censored response of a competing.risks model
##
## No.Observations: 406
##
## Pattern:
##
## Cause event right.censored
## 1 58 0
## 2 246 0
## unknown 0 102
##
##
## Fine-Gray model: analysis of cause 1
##
## Competing Risks Regression
##
## Call:
## FGR(formula = Hist(dias_out, evento_ampu) ~ san_elian + edad,
## data = sadx4, cause = 1)
##
## coef exp(coef) se(coef) z p-value
## san_elian 0.2973 1.35 0.0369 8.05 0.00000000000000089
## edad 0.0535 1.05 0.0103 5.17 0.00000024000000000
##
## exp(coef) exp(-coef) 2.5% 97.5%
## san_elian 1.35 0.743 1.25 1.45
## edad 1.05 0.948 1.03 1.08
##
## Num. cases = 406
## Pseudo Log-likelihood = -303
## Pseudo likelihood ratio test = 74.6 on 2 df,
##
## Convergence: TRUE
set.seed(123)
sc_boot <- Score(
object = list("Modelo" = mod_fgx4),
formula = Hist(dias_out, evento_ampu) ~ 1,
data = sadx4,
times = 90,
metrics = c("auc", "brier"),
summary = "risks",
cause = 1,
split.method = "bootcv", # ← bootstrap
B = 200, # ← número de muestras bootstrap (200–500 ideal)
conf.int = TRUE,
plots = "calibration"
)
## Running crossvalidation algorithm
## Fitting the models in 200 learning datasets, then predicting the risks in validation datasets
## | | | 0% | | | 1% | | | 2% | |= | 3% | |= | 4% | |= | 5% | |= | 6% | |= | 7% | |== | 8% | |== | 9% | |== | 10% | |== | 11% | |== | 12% | |=== | 13% | |=== | 14% | |=== | 15% | |=== | 16% | |=== | 17% | |==== | 18% | |==== | 19% | |==== | 20% | |==== | 21% | |==== | 22% | |===== | 23% | |===== | 24% | |===== | 25% | |===== | 26% | |===== | 27% | |====== | 28% | |====== | 29% | |====== | 30% | |====== | 31% | |====== | 32% | |======= | 33% | |======= | 34% | |======= | 35% | |======= | 36% | |======= | 37% | |======== | 38% | |======== | 39% | |======== | 40% | |======== | 41% | |======== | 42% | |========= | 43% | |========= | 44% | |========= | 45% | |========= | 46% | |========= | 47% | |========== | 48% | |========== | 49% | |========== | 50% | |========== | 51% | |========== | 52% | |=========== | 53% | |=========== | 54% | |=========== | 55% | |=========== | 56% | |=========== | 57% | |============ | 58% | |============ | 59% | |============ | 60% | |============ | 61% | |============ | 62% | |============= | 63% | |============= | 64% | |============= | 65% | |============= | 66% | |============= | 67% | |============== | 68% | |============== | 69% | |============== | 70% | |============== | 71% | |============== | 72% | |=============== | 73% | |=============== | 74% | |=============== | 75% | |=============== | 76% | |=============== | 77% | |================ | 78% | |================ | 79% | |================ | 80% | |================ | 81% | |================ | 82% | |================= | 83% | |================= | 84% | |================= | 85% | |================= | 86% | |================= | 87% | |================== | 88% | |================== | 89% | |================== | 90% | |================== | 91% | |================== | 92% | |=================== | 93% | |=================== | 94% | |=================== | 95% | |=================== | 96% | |=================== | 97% | |====================| 98% | |====================| 99% | |====================| 100%
## | | | 0%
## Calculating the performance metrics in 200 validation data sets
## | | | 1% | | | 2% | |= | 3% | |= | 4% | |= | 5% | |= | 6% | |= | 7% | |== | 8% | |== | 9% | |== | 10% | |== | 11% | |== | 12% | |=== | 13% | |=== | 14% | |=== | 15% | |=== | 16% | |=== | 17% | |==== | 18% | |==== | 19% | |==== | 20% | |==== | 21% | |==== | 22% | |===== | 23% | |===== | 24% | |===== | 25% | |===== | 26% | |===== | 27% | |====== | 28% | |====== | 29% | |====== | 30% | |====== | 31% | |====== | 32% | |======= | 33% | |======= | 34% | |======= | 35% | |======= | 36% | |======= | 37% | |======== | 38% | |======== | 39% | |======== | 40% | |======== | 41% | |======== | 42% | |========= | 43% | |========= | 44% | |========= | 45% | |========= | 46% | |========= | 47% | |========== | 48% | |========== | 49% | |========== | 50% | |========== | 51% | |========== | 52% | |=========== | 53% | |=========== | 54% | |=========== | 55% | |=========== | 56% | |=========== | 57% | |============ | 58% | |============ | 59% | |============ | 60% | |============ | 61% | |============ | 62% | |============= | 63% | |============= | 64% | |============= | 65% | |============= | 66% | |============= | 67% | |============== | 68% | |============== | 69% | |============== | 70% | |============== | 71% | |============== | 72% | |=============== | 73% | |=============== | 74% | |=============== | 75% | |=============== | 76% | |=============== | 77% | |================ | 78% | |================ | 79% | |================ | 80% | |================ | 81% | |================ | 82% | |================= | 83% | |================= | 84% | |================= | 85% | |================= | 86% | |================= | 87% | |================== | 88% | |================== | 89% | |================== | 90% | |================== | 91% | |================== | 92% | |=================== | 93% | |=================== | 94% | |=================== | 95% | |=================== | 96% | |=================== | 97% | |====================| 98% | |====================| 99% | |====================| 100%
sc_boot$AUC
##
## Results by model:
##
## model times AUC lower upper
## <fctr> <num> <char> <char> <char>
## 1: Modelo 90 82.178 75.211 89.281
##
## NOTE: Values are multiplied by 100 and given in %.
## NOTE: The higher AUC the better.
sc_boot$Brier
##
## Results by model:
##
## model times Brier lower upper
## <fctr> <num> <char> <char> <char>
## 1: Null model 90 11.293 8.470 14.260
## 2: Modelo 90 8.912 6.620 11.578
##
## Results of model comparisons:
##
## model times reference delta.Brier lower upper
## <fctr> <num> <fctr> <char> <char> <char>
## 1: Modelo 90 Null model -2.381 -3.831 -0.729
##
## NOTE: Values are multiplied by 100 and given in %.
## NOTE: The lower Brier the better.
plotCalibration(sc_boot)
#calculadora para excel
library(tidyr)
#install.packages("writexl")
library(writexl)
## Warning: package 'writexl' was built under R version 4.4.3
#--------------------------------------------------
# 1. Definir rangos y tiempos
#--------------------------------------------------
times <- c(30, 60, 90, 120, 180)
rango_san_elian <- 6:30
rango_edad <- 30:85
#--------------------------------------------------
# 2. Crear todas las combinaciones posibles
#--------------------------------------------------
tabla_pred <- expand.grid(
san_elian = rango_san_elian,
edad = rango_edad
)
#--------------------------------------------------
# 3. Predecir riesgos con el modelo Fine-Gray
#--------------------------------------------------
pred <- predictRisk(
object = mod_fg,
newdata = tabla_pred,
times = times
)
#--------------------------------------------------
# 4. Pasar predicciones a data frame y nombrar columnas
#--------------------------------------------------
pred_df <- as.data.frame(pred)
colnames(pred_df) <- paste0("riesgo_", times)
#--------------------------------------------------
# 5. Unir combinaciones + predicciones
#--------------------------------------------------
tabla_final <- bind_cols(tabla_pred, pred_df)
#--------------------------------------------------
# 6. (Opcional) convertir riesgos a porcentaje
#--------------------------------------------------
tabla_final_pct <- tabla_final %>%
mutate(across(starts_with("riesgo_"), ~ round(.x , 1)))
#--------------------------------------------------
# 7. Ver primeras filas
#--------------------------------------------------
head(tabla_final_pct)
## san_elian edad riesgo_30 riesgo_60 riesgo_90 riesgo_120 riesgo_180
## 1 6 30 0 0 0 0 0
## 2 7 30 0 0 0 0 0
## 3 8 30 0 0 0 0 0
## 4 9 30 0 0 0 0 0
## 5 10 30 0 0 0 0 0
## 6 11 30 0 0 0 0 0
#--------------------------------------------------
# 8. Guardar en Excel
#--------------------------------------------------
write_xlsx(tabla_final_pct, "tabla_riesgo_san_elian_edad.xlsx")