#CARGA DE LIBRERIAS
knitr::opts_chunk$set(echo = TRUE)
library(readr)
library(data.table)
## Warning: package 'data.table' was built under R version 4.4.3
library(tidyverse)
## Warning: package 'ggplot2' was built under R version 4.4.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ purrr 1.0.2
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 4.0.0 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::between() masks data.table::between()
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::first() masks data.table::first()
## ✖ lubridate::hour() masks data.table::hour()
## ✖ lubridate::isoweek() masks data.table::isoweek()
## ✖ dplyr::lag() masks stats::lag()
## ✖ dplyr::last() masks data.table::last()
## ✖ lubridate::mday() masks data.table::mday()
## ✖ lubridate::minute() masks data.table::minute()
## ✖ lubridate::month() masks data.table::month()
## ✖ lubridate::quarter() masks data.table::quarter()
## ✖ lubridate::second() masks data.table::second()
## ✖ purrr::transpose() masks data.table::transpose()
## ✖ lubridate::wday() masks data.table::wday()
## ✖ lubridate::week() masks data.table::week()
## ✖ lubridate::yday() masks data.table::yday()
## ✖ lubridate::year() masks data.table::year()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(broom)
library(vcd)
## Warning: package 'vcd' was built under R version 4.4.3
## Cargando paquete requerido: grid
library(sjPlot)
##
## Adjuntando el paquete: 'sjPlot'
##
## The following object is masked from 'package:ggplot2':
##
## set_theme
library(epiR)
## Cargando paquete requerido: survival
## Package epiR 2.0.77 is loaded
## Type help(epi.about) for summary information
## Type browseVignettes(package = 'epiR') to learn how to use epiR for applied epidemiological analyses
library(gtsummary)
## Warning: package 'gtsummary' was built under R version 4.4.3
library(tableone)
library(ggpubr)
library(vcd)
library(vcdExtra)
## Warning: package 'vcdExtra' was built under R version 4.4.3
## Cargando paquete requerido: gnm
## Warning: package 'gnm' was built under R version 4.4.3
##
## Adjuntando el paquete: 'vcdExtra'
##
## The following object is masked from 'package:dplyr':
##
## summarise
library(CalibrationCurves)
## Warning: package 'CalibrationCurves' was built under R version 4.4.3
## Cargando paquete requerido: rms
## Warning: package 'rms' was built under R version 4.4.3
## Cargando paquete requerido: Hmisc
## Warning: package 'Hmisc' was built under R version 4.4.3
##
## Adjuntando el paquete: 'Hmisc'
##
## The following objects are masked from 'package:dplyr':
##
## src, summarize
##
## The following objects are masked from 'package:base':
##
## format.pval, units
library(pROC)
## Warning: package 'pROC' was built under R version 4.4.3
## Type 'citation("pROC")' for a citation.
##
## Adjuntando el paquete: 'pROC'
##
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
library(glmnet)
## Warning: package 'glmnet' was built under R version 4.4.3
## Cargando paquete requerido: Matrix
##
## Adjuntando el paquete: 'Matrix'
##
## The following objects are masked from 'package:tidyr':
##
## expand, pack, unpack
##
## Loaded glmnet 4.1-10
library(caret)
## Warning: package 'caret' was built under R version 4.4.3
## Cargando paquete requerido: lattice
##
## Adjuntando el paquete: 'lattice'
##
## The following object is masked from 'package:gnm':
##
## barley
##
##
## Adjuntando el paquete: 'caret'
##
## The following object is masked from 'package:survival':
##
## cluster
##
## The following object is masked from 'package:purrr':
##
## lift
library(broom.helpers)
## Warning: package 'broom.helpers' was built under R version 4.4.3
##
## Adjuntando el paquete: 'broom.helpers'
##
## The following objects are masked from 'package:gtsummary':
##
## all_categorical, all_continuous, all_contrasts, all_dichotomous,
## all_interaction, all_intercepts
options(scipen = 999, digits = 3, encoding = 'UTF-8')
library(naniar)
## Warning: package 'naniar' was built under R version 4.4.3
library(dplyr)
library(survival)
library(survminer)
##
## Adjuntando el paquete: 'survminer'
##
## The following object is masked from 'package:survival':
##
## myeloma
library(MASS)
##
## Adjuntando el paquete: 'MASS'
##
## The following object is masked from 'package:gtsummary':
##
## select
##
## The following object is masked from 'package:dplyr':
##
## select
library(rms)
library(sjPlot)
pkgbuild::has_build_tools(debug = TRUE)
## Trying to compile a simple C file
## Running "C:/PROGRA~1/R/R-44~1.2/bin/x64/Rcmd.exe" SHLIB foo.c
## using C compiler: 'gcc.exe (GCC) 13.3.0'
## gcc -I"C:/PROGRA~1/R/R-44~1.2/include" -DNDEBUG -I"C:/rtools44/x86_64-w64-mingw32.static.posix/include" -O2 -Wall -mfpmath=sse -msse2 -mstackrealign -c foo.c -o foo.o
## gcc -shared -s -static-libgcc -o foo.dll tmp.def foo.o -LC:/rtools44/x86_64-w64-mingw32.static.posix/lib/x64 -LC:/rtools44/x86_64-w64-mingw32.static.posix/lib -LC:/PROGRA~1/R/R-44~1.2/bin/x64 -lR
##
## [1] TRUE
library(ggsurvfit)
## Warning: package 'ggsurvfit' was built under R version 4.4.3
library(riskRegression)
## Warning: package 'riskRegression' was built under R version 4.4.3
## Registered S3 method overwritten by 'riskRegression':
## method from
## nobs.multinom broom
## riskRegression version 2025.05.20
library(rms)
library(cmprsk)
## Warning: package 'cmprsk' was built under R version 4.4.3
library(prodlim)
## Warning: package 'prodlim' was built under R version 4.4.3
library(naniar)
library(ggplot2)
library(scales)
## Warning: package 'scales' was built under R version 4.4.3
##
## Adjuntando el paquete: 'scales'
##
## The following object is masked from 'package:purrr':
##
## discard
##
## The following object is masked from 'package:readr':
##
## col_factor
library(tidycmprsk)
## Warning: package 'tidycmprsk' was built under R version 4.4.3
##
## Adjuntando el paquete: 'tidycmprsk'
##
## The following objects are masked from 'package:cmprsk':
##
## crr, cuminc
##
## The following object is masked from 'package:gtsummary':
##
## trial
library(dplyr)
library(psych)
## Warning: package 'psych' was built under R version 4.4.3
##
## Adjuntando el paquete: 'psych'
##
## The following objects are masked from 'package:scales':
##
## alpha, rescale
##
## The following object is masked from 'package:ggsurvfit':
##
## %+%
##
## The following object is masked from 'package:Hmisc':
##
## describe
##
## The following objects are masked from 'package:ggplot2':
##
## %+%, alpha
CARGA DE LA BASE DE DATOS
#carga de datos
library(readxl)
sob1 <- read_excel("C:/Users/Administrador/Downloads/TESI.xlsx")
## New names:
## • `` -> `...44`
View(sob1)
names(sob1)<- tolower(names (sob1)) #PASA A MINUSCULA LOS NOMBRES
#PROPORCION CICATRIZADOS
table1=table(sob1$cicat)
table1
##
## 0 1
## 183 223
prop.table(table1)
##
## 0 1
## 0.451 0.549
#PROPORCION AMPUTADOS
table2=table(sob1$ampu)
table2
##
## 0 1
## 349 57
prop.table(table2)
##
## 0 1
## 0.86 0.14
#PROPORCION FALLECIDOS
table3=table(sob1$fallecio)
table3
##
## 0 1
## 392 14
prop.table(table3)
##
## 0 1
## 0.9655 0.0345
#tabla por sexo
table4=table(sob1$sexo)
table4
##
## F M
## 82 324
prop.table(table4)
##
## F M
## 0.202 0.798
#promedio de edad
describe(sob1$edad)
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 406 57.4 11.1 57 57.4 10.4 22 89 67 0 0.35 0.55
#dias de seguimiento
describe(sob1$dias_out)
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 406 96.2 75.5 77.5 86.4 64.5 1 362 361 1.15 0.94 3.75
Descripción de los eventos
#pasar variables categóricas a factor
sob1 <- sob1 %>%
mutate(across(19:35, as.factor))
#crear cicat_factor
sob1$cicat_factor <- factor(sob1$cicat, levels = c(0, 1), labels = c( "No Cicatrizo", "Cicatrizo"))
table(sob1$cicat_factor)
##
## No Cicatrizo Cicatrizo
## 183 223
#paso variables chr a factor
sob1 <- sob1 %>% mutate_if(is.character, as.factor)
#crear ampu_factor
sob1$ampu_factor <- factor(sob1$ampu, levels = c(0, 1), labels = c( "No Amputado", "Amputado"))
table(sob1$ampu_factor)
##
## No Amputado Amputado
## 349 57
#crear fallecio_factor
sob1$fallecio_factor <- factor(sob1$fallecio, levels = c(0, 1), labels = c( "No Fallecido", "Fallecido"))
table(sob1$fallecio_factor)
##
## No Fallecido Fallecido
## 392 14
#variable unificada
sob1 <- sob1 %>%
mutate(
estado = tolower(trimws(estado))
)
table(sob1$estado)
##
## ampu cerro fallecio persiste
## 57 223 14 112
sob1 <- sob1 %>%
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(sob1$estado_unif)
##
## amputacion cerro_herida fallecio persiste
## 57 223 14 112
Intervalo de confianza de los eventos
#intervalos de confianza
tabla_estado <- sob1 %>%
dplyr::filter(!is.na(estado_unif)) %>%
dplyr::group_by(estado_unif) %>%
dplyr::summarise(
n = n()
) %>%
dplyr::mutate(
N_total = sum(n),
prop = n / N_total,
se = sqrt(prop * (1 - prop) / N_total),
li = prop - 1.96 * se,
ls = prop + 1.96 * se
)
tabla_estado %>%
dplyr::mutate(
porcentaje = round(prop * 100, 1),
IC95 = paste0(
round(li * 100, 1), "–",
round(ls * 100, 1), "%"
)
)
## # A tibble: 4 × 9
## estado_unif n N_total prop se li ls porcentaje IC95
## <chr> <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
## 1 amputacion 57 406 0.140 0.0172 0.107 0.174 14 10.7–17.4%
## 2 cerro_herida 223 406 0.549 0.0247 0.501 0.598 54.9 50.1–59.8%
## 3 fallecio 14 406 0.0345 0.00906 0.0167 0.0522 3.4 1.7–5.2%
## 4 persiste 112 406 0.276 0.0222 0.232 0.319 27.6 23.2–31.9%
tabla_estado
## # A tibble: 4 × 7
## estado_unif n N_total prop se li ls
## <chr> <int> <int> <dbl> <dbl> <dbl> <dbl>
## 1 amputacion 57 406 0.140 0.0172 0.107 0.174
## 2 cerro_herida 223 406 0.549 0.0247 0.501 0.598
## 3 fallecio 14 406 0.0345 0.00906 0.0167 0.0522
## 4 persiste 112 406 0.276 0.0222 0.232 0.319
#dias de seguimiento
#en pacientes censurados
#dias de seguimiento
describe(sob1$dias_out)
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 406 96.2 75.5 77.5 86.4 64.5 1 362 361 1.15 0.94 3.75
describeBy(
x = sob1$dias_out,
group = sob1$estado_unif,
mat = TRUE
)
## item group1 vars n mean sd median trimmed mad min max range
## X11 1 amputacion 1 57 39.6 39.9 22 32.8 16.3 1 211 210
## X12 2 cerro_herida 1 223 99.7 70.5 82 89.7 57.8 9 330 321
## X13 3 fallecio 1 14 43.1 40.4 24 39.9 25.2 5 120 115
## X14 4 persiste 1 112 124.7 83.7 114 117.6 83.8 6 362 356
## skew kurtosis se
## X11 1.982 4.5398 5.28
## X12 1.234 1.0772 4.72
## X13 0.661 -1.2525 10.80
## X14 0.718 0.0353 7.91
tapply(sob1$dias_out,
sob1$estado_unif,
quantile,
probs = c(0.25, 0.75),
na.rm = TRUE)
## $amputacion
## 25% 75%
## 14 48
##
## $cerro_herida
## 25% 75%
## 46 128
##
## $fallecio
## 25% 75%
## 11.2 69.8
##
## $persiste
## 25% 75%
## 63.8 175.8
#ISQuEMIA
#isq_factor
sob1 <- sob1 %>%
mutate(isq_factor = factor(
if_else(isq %in% c(2, 3), "SI", "NO/leve")
))
#dias seguimiento en subgrupos
sob1_per_isq <- subset(sob1, isq_factor == "SI")
sob1_per_noisq <- subset(sob1, isq_factor == "NO/leve")
#no isquemicos persistente seguimiento
describe(sob1_per_noisq$dias_out)
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 237 91.1 68.2 77 82.7 62.3 5 337 332 1.11 0.88 4.43
describeBy(
x = sob1_per_noisq$dias_out,
group = sob1_per_noisq$estado_unif,
mat = TRUE
)
## item group1 vars n mean sd median trimmed mad min max range
## X11 1 amputacion 1 11 26.5 26.1 19.0 20.8 11.9 7 98 91
## X12 2 cerro_herida 1 162 90.6 63.9 71.5 80.9 52.6 15 301 286
## X13 3 fallecio 1 6 25.8 23.1 17.5 25.8 15.6 5 66 61
## X14 4 persiste 1 58 111.7 76.6 112.5 107.2 86.7 6 337 331
## skew kurtosis se
## X11 1.789 2.182 7.88
## X12 1.313 1.319 5.02
## X13 0.708 -1.298 9.44
## X14 0.532 -0.056 10.06
tapply(sob1_per_noisq$dias_out,
sob1_per_noisq$estado_unif,
quantile,
probs = c(0.25, 0.75),
na.rm = TRUE)
## $amputacion
## 25% 75%
## 12.5 26.0
##
## $cerro_herida
## 25% 75%
## 42 116
##
## $fallecio
## 25% 75%
## 10.8 34.8
##
## $persiste
## 25% 75%
## 50.8 167.0
#pacientes isquémicos
# isquemicos persistente seguimiento
describe(sob1_per_isq$dias_out)
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 169 103 84.3 82 92.2 80.1 1 362 361 1.07 0.52 6.49
describeBy(
x = sob1_per_isq$dias_out,
group = sob1_per_isq$estado_unif,
mat = TRUE
)
## item group1 vars n mean sd median trimmed mad min max range
## X11 1 amputacion 1 46 42.7 42.1 24.5 35.9 20.8 1 211 210
## X12 2 cerro_herida 1 61 124.1 81.2 108.0 114.9 72.6 9 330 321
## X13 3 fallecio 1 8 56.1 46.9 50.0 56.1 61.5 6 120 114
## X14 4 persiste 1 54 138.7 89.3 116.5 130.2 79.3 7 362 355
## skew kurtosis se
## X11 1.847 3.8060 6.21
## X12 0.896 0.0851 10.40
## X13 0.134 -1.9918 16.58
## X14 0.743 -0.3552 12.15
tapply(sob1_per_isq$dias_out,
sob1_per_isq$estado_unif,
quantile,
probs = c(0.25, 0.75),
na.rm = TRUE)
## $amputacion
## 25% 75%
## 14.2 59.0
##
## $cerro_herida
## 25% 75%
## 63 160
##
## $fallecio
## 25% 75%
## 11.8 99.0
##
## $persiste
## 25% 75%
## 67.2 199.2
#comparar dias de seguimiento en pacientes con y sin isquemia cuyo estado sea "persiste"
# Filtrar solo pacientes con estado "persiste"
sob_persiste <- subset(sob1, estado_unif == "persiste")
# Aplicar Wilcoxon
wilcox.test(dias_out ~ isq_factor, data = sob_persiste)
##
## Wilcoxon rank sum test with continuity correction
##
## data: dias_out by isq_factor
## W = 1330, p-value = 0.2
## alternative hypothesis: true location shift is not equal to 0
#Densidad de incidencia y razón de densidades
#cicatrizacion totaldensidad de incidencia
sob1$evento_cierre <- ifelse(sob1$estado_unif == "cerro_herida", 1, 0)
eventos <- sum(sob1$evento_cierre, na.rm = TRUE) #nro eventos
tiempo1_total <- sum(sob1$dias_out, na.rm = TRUE) #tiempo persona total
tasa1_dia <- eventos / tiempo1_total
tasa1_dia
## [1] 0.00571
tiempo1_meses <- tiempo1_total / 30.44
tasa1_mensual <- eventos / tiempo1_meses
tasa1_mensual
## [1] 0.174
tasa1_1000 <- tasa1_dia * 1000
tasa1_1000
## [1] 5.71
#cicatrizacion isq tiempo por 1000 personas por dia
sob1_per_isq$evento_cierre <- ifelse(sob1_per_isq$estado_unif == "cerro_herida", 1, 0)
eventos <- sum(sob1_per_isq$evento_cierre, na.rm = TRUE) #nro eventos
tiempo2_total <- sum(sob1_per_isq$dias_out, na.rm = TRUE) #tiempo persona total
tasa2_dia <- eventos / tiempo2_total
tasa2_dia
## [1] 0.00349
tiempo2_meses <- tiempo2_total / 30.44
tasa2_mensual <- eventos / tiempo2_meses
tasa2_mensual
## [1] 0.106
tasa2_1000 <- tasa2_dia * 1000
tasa2_1000
## [1] 3.49
#cicatrizacion no isq
sob1_per_noisq$evento_cierre <- ifelse(sob1_per_noisq$estado_unif == "cerro_herida", 1, 0)
eventos <- sum(sob1_per_noisq$evento_cierre, na.rm = TRUE) #nro eventos
tiempo3_total <- sum(sob1_per_noisq$dias_out, na.rm = TRUE) #tiempo persona total
tasa3_dia <- eventos / tiempo3_total
tasa3_dia
## [1] 0.0075
tiempo3_meses <- tiempo3_total / 30.44
tasa3_mensual <- eventos / tiempo3_meses
tasa3_mensual
## [1] 0.228
tasa3_1000 <- tasa3_dia * 1000
tasa3_1000
## [1] 7.5
# densidad de incidencia amputacion total
sob1$evento_ampu <- ifelse(sob1$estado_unif == "amputacion", 1, 0)
eventos <- sum(sob1$evento_ampu, na.rm = TRUE) #nro eventos
tiempo1_total <- sum(sob1$dias_out, na.rm = TRUE) #tiempo persona total
tasa1_dia <- eventos / tiempo1_total
tasa1_dia
## [1] 0.00146
tiempo1_meses <- tiempo1_total / 30.44
tasa1_mensual <- eventos / tiempo1_meses
tasa1_mensual
## [1] 0.0444
tasa1_1000 <- tasa1_dia * 1000
tasa1_1000
## [1] 1.46
#amputacuin isq
sob1_per_isq$evento_ampu <- ifelse(sob1_per_isq$estado_unif == "amputacion", 1, 0)
eventos <- sum(sob1_per_isq$evento_ampu, na.rm = TRUE) #nro eventos
tiempo2_total <- sum(sob1_per_isq$dias_out, na.rm = TRUE) #tiempo persona total
tasa2_dia <- eventos / tiempo2_total
tasa2_dia
## [1] 0.00263
tiempo2_meses <- tiempo2_total / 30.44
tasa2_mensual <- eventos / tiempo2_meses
tasa2_mensual
## [1] 0.0801
tasa2_1000 <- tasa2_dia * 1000
tasa2_1000
## [1] 2.63
#amputacion no isq
sob1_per_noisq$evento_ampu <- ifelse(sob1_per_noisq$estado_unif == "amputacion", 1, 0)
eventos <- sum(sob1_per_noisq$evento_ampu, na.rm = TRUE) #nro eventos
tiempo3_total <- sum(sob1_per_noisq$dias_out, na.rm = TRUE) #tiempo persona total
tasa3_dia <- eventos / tiempo3_total
tasa3_dia
## [1] 0.000509
tiempo3_meses <- tiempo3_total / 30.44
tasa3_mensual <- eventos / tiempo3_meses
tasa3_mensual
## [1] 0.0155
tasa3_1000 <- tasa3_dia * 1000
tasa3_1000
## [1] 0.509
#evento muerte densidad de incidencia
#cicatrizacion totaldensidad de incidencia
sob1$evento_muerte <- ifelse(sob1$estado_unif == "fallecio", 1, 0)
eventos <- sum(sob1$evento_muerte, na.rm = TRUE) #nro eventos
tiempo1_total <- sum(sob1$dias_out, na.rm = TRUE) #tiempo persona total
tasa1_dia <- eventos / tiempo1_total
tasa1_dia
## [1] 0.000358
tiempo1_meses <- tiempo1_total / 30.44
tasa1_mensual <- eventos / tiempo1_meses
tasa1_mensual
## [1] 0.0109
tasa1_1000 <- tasa1_dia * 1000
tasa1_1000
## [1] 0.358
#muerte isq tiempo por 1000 personas por dia. Tasa de incidencia de muerte por 1000 persons por dia
sob1_per_isq$evento_muerte <- ifelse(sob1_per_isq$estado_unif == "fallecio", 1, 0)
eventos <- sum(sob1_per_isq$evento_muerte, na.rm = TRUE) #nro eventos
tiempo2_total <- sum(sob1_per_isq$dias_out, na.rm = TRUE) #tiempo persona total
tasa2_dia <- eventos / tiempo2_total
tasa2_dia
## [1] 0.000458
tiempo2_meses <- tiempo2_total / 30.44
tasa2_mensual <- eventos / tiempo2_meses
tasa2_mensual
## [1] 0.0139
tasa2_1000 <- tasa2_dia * 1000
tasa2_1000
## [1] 0.458
#muerte no isq
sob1_per_noisq$evento_muerte <- ifelse(sob1_per_noisq$estado_unif == "fallecio", 1, 0)
eventos <- sum(sob1_per_noisq$evento_muerte, na.rm = TRUE) #nro eventos
tiempo3_total <- sum(sob1_per_noisq$dias_out, na.rm = TRUE) #tiempo persona total
tasa3_dia <- eventos / tiempo3_total
tasa3_dia
## [1] 0.000278
tiempo3_meses <- tiempo3_total / 30.44
tasa3_mensual <- eventos / tiempo3_meses
tasa3_mensual
## [1] 0.00846
tasa3_1000 <- tasa3_dia * 1000
tasa3_1000
## [1] 0.278
COMPORTAMIENTO DE LAS VARIABLES
#comportamiento de las variables
#LOCAl
library(dplyr)
tabla_prop <- sob1 %>%
dplyr::group_by(local) %>%
dplyr::summarise(
n = sum(!is.na(cicat)),
eventos = sum(cicat == 1, na.rm = TRUE),
prop = eventos / n,
se = sqrt(prop * (1 - prop) / n),
li = prop - 1.96 * se,
ls = prop + 1.96 * se
)
library(ggplot2)
ggplot(tabla_prop, aes(x = local, y = prop)) +
geom_col(fill = "#4E79A7", width = 0.6) +
geom_errorbar(aes(ymin = li, ymax = ls),
width = 0.2,
size = 0.8) +
geom_text(aes(label = paste0(round(prop*100,1), "%")),
vjust = -0.5,
size = 5) +
scale_y_continuous(limits = c(0,1),
labels = scales::percent_format()) +
labs(
x = "Localización de la lesión",
y = "Proporción de cicatrización (IC95%)"
) +
theme_minimal(base_size = 14)
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
#localizacion
sob1 <- sob1 %>%
mutate(loca_factor = factor(if_else(local %in% c(2, 3), "Met/Tar", "Fal")))
table(sob1$local)
##
## 1 2 3
## 196 134 76
table(sob1$loca_factor)
##
## Fal Met/Tar
## 196 210
#TOPOGRAFIA
tabla_prop <- sob1 %>%
dplyr::group_by(topo) %>%
dplyr::summarise(
n = sum(!is.na(topo)),
eventos = sum(cicat == 1, na.rm = TRUE),
prop = eventos / n,
se = sqrt(prop * (1 - prop) / n),
li = prop - 1.96 * se,
ls = prop + 1.96 * se
)
ggplot(tabla_prop, aes(x = topo, y = prop)) +
geom_col(fill = "#4E79A7", width = 0.6) +
geom_errorbar(aes(ymin = li, ymax = ls),
width = 0.2,
size = 0.8) +
geom_text(aes(label = paste0(round(prop*100,1), "%")),
vjust = -0.5,
size = 5) +
scale_y_continuous(limits = c(0,1),
labels = scales::percent_format()) +
labs(
x = "Topografia de la lesión",
y = "Proporcion de cicatrización (IC95%)"
) +
theme_minimal(base_size = 14)
#topog
sob1<- sob1 %>%
mutate(topo_factor = factor(if_else(topo %in% c(1), "dor/plan", "lat/Mas de dos")))
table(sob1$topo)
##
## 1 2 3
## 152 104 150
table(sob1$topo_factor)
##
## dor/plan lat/Mas de dos
## 152 254
#Nro de zonas
tabla_prop <- sob1 %>%
dplyr::group_by(zon) %>%
dplyr::summarise(
n = sum(!is.na(zon)),
eventos = sum(cicat == 1, na.rm = TRUE),
prop = eventos / n,
se = sqrt(prop * (1 - prop) / n),
li = prop - 1.96 * se,
ls = prop + 1.96 * se
)
ggplot(tabla_prop, aes(x = zon, y = prop)) +
geom_col(fill = "#4E79A7", width = 0.6) +
geom_errorbar(aes(ymin = li, ymax = ls),
width = 0.2,
size = 0.8) +
geom_text(aes(label = paste0(round(prop*100,1), "%")),
vjust = -0.5,
size = 5) +
scale_y_continuous(limits = c(0,1),
labels = scales::percent_format()) +
labs(
x = "Numero de Zonas de la lesion",
y = "Proporcion de cicatrizacion (IC95%)"
) +
theme_minimal(base_size = 14)
# zon
sob1 <- sob1 %>%
mutate(zon_factor = factor(if_else(zon %in% c(2, 3), "Dos o mas", "Una")), zon_factor = factor(zon_factor, levels = rev(levels(zon_factor))))
table(sob1$zon)
##
## 1 2 3
## 242 90 74
table(sob1$zon_factor)
##
## Una Dos o mas
## 242 164
#INFECCION
tabla_prop <- sob1 %>%
dplyr::group_by(inf) %>%
dplyr::summarise(
n = sum(!is.na(inf)),
eventos = sum(cicat == 1, na.rm = TRUE),
prop = eventos / n,
se = sqrt(prop * (1 - prop) / n),
li = prop - 1.96 * se,
ls = prop + 1.96 * se
)
ggplot(tabla_prop, aes(x = inf, y = prop)) +
geom_col(fill = "#4E79A7", width = 0.6) +
geom_errorbar(aes(ymin = li, ymax = ls),
width = 0.2,
size = 0.8) +
geom_text(aes(label = paste0(round(prop*100,1), "%")),
vjust = -0.5,
size = 5) +
scale_y_continuous(limits = c(0,1),
labels = scales::percent_format()) +
labs(
x = "Grado de infección de la lesion",
y = "Proporcion de cicatrizacion (IC95%)"
) +
theme_minimal(base_size = 14)
#infe
sob1 <- sob1 %>%
mutate(infe_factor = case_when(
inf == 0 ~ "No",
inf %in% c(1, 2) ~ "Leve/Mod",
inf == 3 ~ "Grave",
TRUE ~ NA_character_ # conserva los NA originales
)) %>%
mutate(infe_factor = factor(infe_factor, levels = c("No", "Leve/Mod", "Grave")))
#sob1$infe_factor <- factor (sob1$infe_factor, levels= c ("Grave","Leve/Mod","No"))
table(sob1$infe)
## Warning: Unknown or uninitialised column: `infe`.
## < table of extent 0 >
table(sob1$infe_factor)
##
## No Leve/Mod Grave
## 86 255 65
#EDEMA
tabla_prop <- sob1 %>%
dplyr::group_by(ede) %>%
dplyr::summarise(
n = sum(!is.na(ede)),
eventos = sum(cicat == 1, na.rm = TRUE),
prop = eventos / n,
se = sqrt(prop * (1 - prop) / n),
li = prop - 1.96 * se,
ls = prop + 1.96 * se
)
ggplot(tabla_prop, aes(x = ede, y = prop)) +
geom_col(fill = "#4E79A7", width = 0.6) +
geom_errorbar(aes(ymin = li, ymax = ls),
width = 0.2,
size = 0.8) +
geom_text(aes(label = paste0(round(prop*100,1), "%")),
vjust = -0.5,
size = 5) +
scale_y_continuous(limits = c(0,1),
labels = scales::percent_format()) +
labs(
x = "Edema de la lesion",
y = "Proporcion de cicatrizacion (IC95%)"
) +
theme_minimal(base_size = 14)
#edema
sob1 <- sob1 %>%
mutate(ede_factor = case_when(
ede == 2 ~ "Unilateral",
ede %in% c(0, 1) ~ "Sin/local",
ede == 3 ~ "Bilateral",
TRUE ~ NA_character_ # conserva los NA originales
)) %>%
mutate(ede_factor = factor(ede_factor, levels = c("Sin/local", "Unilateral", "Bilateral")))
#sob1$ede_factor <- factor (sob1$ede_factor, levels= c ("Bilateral","Unilateral","Sin/local"))
table(sob1$ede)
##
## 0 1 2 3
## 143 98 124 41
table(sob1$ede_factor)
##
## Sin/local Unilateral Bilateral
## 241 124 41
#NEURO
tabla_prop <- sob1 %>%
dplyr::group_by(neu) %>%
dplyr::summarise(
n = sum(!is.na(neu)),
eventos = sum(cicat == 1, na.rm = TRUE),
prop = eventos / n,
se = sqrt(prop * (1 - prop) / n),
li = prop - 1.96 * se,
ls = prop + 1.96 * se
)
ggplot(tabla_prop, aes(x = neu, y = prop)) +
geom_col(fill = "#4E79A7", width = 0.6) +
geom_errorbar(aes(ymin = li, ymax = ls),
width = 0.2,
size = 0.8) +
geom_text(aes(label = paste0(round(prop*100,1), "%")),
vjust = -0.5,
size = 5) +
scale_y_continuous(limits = c(0,1),
labels = scales::percent_format()) +
labs(
x = "Neuropatia de la lesion",
y = "Proporcion de cicatrizacion (IC95%)"
) +
theme_minimal(base_size = 14)
#neur
sob1 <- sob1 %>%
mutate(neur_factor = factor(
if_else(neu %in% c(2, 3), "Mod/charcot", "No/leve"),
levels = c("No/leve", "Mod/charcot")
))
table(sob1$neu)
##
## 0 1 2 3
## 4 25 341 36
table(sob1$neur_factor)
##
## No/leve Mod/charcot
## 29 377
#PROF
tabla_prop <- sob1 %>%
dplyr::group_by(prof) %>%
dplyr::summarise(
n = sum(!is.na(prof)),
eventos = sum(cicat == 1, na.rm = TRUE),
prop = eventos / n,
se = sqrt(prop * (1 - prop) / n),
li = prop - 1.96 * se,
ls = prop + 1.96 * se
)
ggplot(tabla_prop, aes(x = prof, y = prop)) +
geom_col(fill = "#4E79A7", width = 0.6) +
geom_errorbar(aes(ymin = li, ymax = ls),
width = 0.2,
size = 0.8) +
geom_text(aes(label = paste0(round(prop*100,1), "%")),
vjust = -0.5,
size = 5) +
scale_y_continuous(limits = c(0,1),
labels = scales::percent_format()) +
labs(
x = "Profundidad de la lesion",
y = "Proporcion de cicatrizacion (IC95%)"
) +
theme_minimal(base_size = 14)
#tisu (prof)
sob1 <- sob1 %>%
mutate(prof_factor = factor(if_else(prof %in% c(1), "Piel", "parcial/total")))
sob1 <- sob1 %>% mutate(prof_factor = factor(prof_factor, levels = c("Piel", "parcial/total")))
table(sob1$prof)
##
## 1 2 3
## 32 133 241
table(sob1$prof_factor)
##
## Piel parcial/total
## 32 374
#AREA
tabla_prop <- sob1 %>%
dplyr::group_by(area) %>%
dplyr::summarise(
n = sum(!is.na(area)),
eventos = sum(cicat == 1, na.rm = TRUE),
prop = eventos / n,
se = sqrt(prop * (1 - prop) / n),
li = prop - 1.96 * se,
ls = prop + 1.96 * se
)
ggplot(tabla_prop, aes(x = area, y = prop)) +
geom_col(fill = "#4E79A7", width = 0.6) +
geom_errorbar(aes(ymin = li, ymax = ls),
width = 0.2,
size = 0.8) +
geom_text(aes(label = paste0(round(prop*100,1), "%")),
vjust = -0.5,
size = 5) +
scale_y_continuous(limits = c(0,1),
labels = scales::percent_format()) +
labs(
x = "Area de la lesion",
y = "Proporcion de cicatrizacion (IC95%)"
) +
theme_minimal(base_size = 14)
#area
sob1$area_factor <- with(sob1, ifelse(area == 1, "Menor a 10",
ifelse(area %in% c(1, 2), "10 a 40",
ifelse(area == 3, "Mas de 40", NA))))
sob1$area_factor <- factor(sob1$area_factor, levels = c("Menor a 10", "10 a 40", "Mas de 40"))
table(sob1$area)
##
## 1 2 3
## 188 157 61
table(sob1$area_factor)
##
## Menor a 10 10 a 40 Mas de 40
## 188 157 61
#FASE de cicat
tabla_prop <- sob1 %>%
dplyr::group_by(fase) %>%
dplyr::summarise(
n = sum(!is.na(fase)),
eventos = sum(cicat == 1, na.rm = TRUE),
prop = eventos / n,
se = sqrt(prop * (1 - prop) / n),
li = prop - 1.96 * se,
ls = prop + 1.96 * se
)
ggplot(tabla_prop, aes(x = fase, y = prop)) +
geom_col(fill = "#4E79A7", width = 0.6) +
geom_errorbar(aes(ymin = li, ymax = ls),
width = 0.2,
size = 0.8) +
geom_text(aes(label = paste0(round(prop*100,1), "%")),
vjust = -0.5,
size = 5) +
scale_y_continuous(limits = c(0,1),
labels = scales::percent_format()) +
labs(
x = "Area de la lesion",
y = "Proporcion de cicatrizacion (IC95%)"
) +
theme_minimal(base_size = 14)
#cica(fase)
sob1 <- sob1 %>%
mutate(fase_factor = factor(if_else(fase %in% c(2, 3), "Granu/infla", "Epit")))
sob1$fase_factor <- factor (sob1$fase_factor, levels= c ("Epit","Granu/infla"))
table(sob1$fase)
##
## 1 2 3
## 19 51 336
table(sob1$fase_factor)
##
## Epit Granu/infla
## 19 387
#isq
#ISQuEMIA2
#isq_factor2
library(dplyr)
sob1 <- sob1 %>%
mutate(isq_factor2 = factor(
case_when(
isq == 0 ~ "NO",
isq == 1 ~ "LEVE",
isq == 2 ~ "MODERADA",
isq == 3 ~ "GRAVE",
TRUE ~ NA_character_
),
levels = c("NO", "LEVE", "MODERADA", "GRAVE")
))
table(sob1$isq)
##
## 0 1 2 3
## 206 31 47 122
table(sob1$isq_factor)
##
## NO/leve SI
## 237 169
table(sob1$isq_factor2)
##
## NO LEVE MODERADA GRAVE
## 206 31 47 122
#quiero saber el porcentaje de pacientes isquémicos de mi muestra
x <- sum(sob1$isq_factor2 %in% c("LEVE","MODERADA","GRAVE"), na.rm = TRUE)
n <- sum(!is.na(sob1$isq_factor2))
prop.test(x, n)
##
## 1-sample proportions test with continuity correction
##
## data: x out of n, null probability 0.5
## X-squared = 0.06, df = 1, p-value = 0.8
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.443 0.542
## sample estimates:
## p
## 0.493
#porcentaje de isquemia moderada grave
xi <- sum(sob1$isq_factor2 %in% c("MODERADA","GRAVE"), na.rm = TRUE)
ni <- sum(!is.na(sob1$isq_factor2))
prop.test(xi, ni)
##
## 1-sample proportions test with continuity correction
##
## data: xi out of ni, null probability 0.5
## X-squared = 11, df = 1, p-value = 0.0009
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.368 0.466
## sample estimates:
## p
## 0.416
#porcentaje de cicatrizacion en no isq/leve
table(sob1_per_noisq$cicat_factor)
##
## No Cicatrizo Cicatrizo
## 75 162
xci <- sum(sob1_per_noisq$cicat_factor %in% c("Cicatrizo"), na.rm = TRUE)
nci <- sum(!is.na(sob1_per_noisq$cicat_factor))
prop.test(xci, nci)
##
## 1-sample proportions test with continuity correction
##
## data: xci out of nci, null probability 0.5
## X-squared = 31, df = 1, p-value = 0.00000002
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.620 0.741
## sample estimates:
## p
## 0.684
#porcentaje de amputacion en no isq/leve
table(sob1_per_noisq$ampu_factor)
##
## No Amputado Amputado
## 226 11
xa <- sum(sob1_per_noisq$ampu_factor %in% c("Amputado"), na.rm = TRUE)
na <- sum(!is.na(sob1_per_noisq$ampu_factor))
prop.test(xa, na)
##
## 1-sample proportions test with continuity correction
##
## data: xa out of na, null probability 0.5
## X-squared = 193, df = 1, p-value <0.0000000000000002
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.0246 0.0838
## sample estimates:
## p
## 0.0464
#porcentaje de muerte en no isq/leve
table(sob1_per_noisq$fallecio_factor)
##
## No Fallecido Fallecido
## 231 6
xf <- sum(sob1_per_noisq$fallecio_factor %in% c("Fallecido"), na.rm = TRUE)
nf <- sum(!is.na(sob1_per_noisq$fallecio_factor))
prop.test(xf, nf)
##
## 1-sample proportions test with continuity correction
##
## data: xf out of nf, null probability 0.5
## X-squared = 212, df = 1, p-value <0.0000000000000002
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.0103 0.0569
## sample estimates:
## p
## 0.0253
#porcentaje de cicatrizacion en isquemicos
table(sob1_per_isq$cicat_factor)
##
## No Cicatrizo Cicatrizo
## 108 61
xcii <- sum(sob1_per_isq$cicat_factor %in% c("Cicatrizo"), na.rm = TRUE)
ncii <- sum(!is.na(sob1_per_isq$cicat_factor))
prop.test(xcii, ncii)
##
## 1-sample proportions test with continuity correction
##
## data: xcii out of ncii, null probability 0.5
## X-squared = 13, df = 1, p-value = 0.0004
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.290 0.439
## sample estimates:
## p
## 0.361
#porcentaje de amputacion en isquemicos
table(sob1_per_isq$ampu_factor)
##
## No Amputado Amputado
## 123 46
xai <- sum(sob1_per_isq$ampu_factor %in% c("Amputado"), na.rm = TRUE)
nai <- sum(!is.na(sob1_per_isq$ampu_factor))
prop.test(xai, nai)
##
## 1-sample proportions test with continuity correction
##
## data: xai out of nai, null probability 0.5
## X-squared = 34, df = 1, p-value = 0.000000005
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.208 0.347
## sample estimates:
## p
## 0.272
#porcentaje de muerte en isquemicos
table(sob1_per_isq$fallecio_factor)
##
## No Fallecido Fallecido
## 161 8
xfi <- sum(sob1_per_isq$fallecio_factor %in% c("Fallecido"), na.rm = TRUE)
nfi<- sum(!is.na(sob1_per_isq$fallecio_factor))
prop.test(xfi, nfi)
##
## 1-sample proportions test with continuity correction
##
## data: xfi out of nfi, null probability 0.5
## X-squared = 137, df = 1, p-value <0.0000000000000002
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.0222 0.0944
## sample estimates:
## p
## 0.0473
#TABLA 1
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")
#continuas
#vars = c("dias_ev","san_elian", "sexo","tbq", "iam", "hta", "dial", "local","topo", "inf", "ede", "neu", "prof", "area", "zon", "fase" )
#tabla_1 <- CreateTableOne(vars = vars, strata = "isq_factor", factorVars = catvars, data = sob1)
#print(tabla_1)
#kableone(tabla_1)
#variables categorizadas
#Las variables van directamente sin el nombre del dataframe
catvars2 = c( "sexo","tbq", "iam", "hta", "dial", "loca_factor","topo_factor", "infe_factor", "ede_factor", "neur_factor", "prof_factor", "area_factor", "zon_factor", "fase_factor")
vars2 = c("edad","dias_ev","san_elian", "sexo","tbq", "iam", "hta", "dial", "loca_factor","topo_factor", "infe_factor", "ede_factor", "neur_factor", "prof_factor", "area_factor", "zon_factor", "fase_factor", "am_cont", "ant_pie" )
tabla_2 <- CreateTableOne(
vars = vars2,
strata = "isq_factor",
factorVars = catvars2,
data = sob1,
addOverall = TRUE
)
print(tabla_2)
## Stratified by isq_factor
## Overall NO/leve SI
## n 406 237 169
## edad (mean (SD)) 57.41 (11.09) 53.34 (9.97) 63.12 (10.03)
## dias_ev (mean (SD)) 50.26 (112.85) 47.52 (118.71) 54.08 (104.37)
## san_elian (mean (SD)) 18.26 (4.09) 16.88 (3.99) 20.19 (3.41)
## sexo = M (%) 324 (79.8) 191 (80.6) 133 (78.7)
## tbq (%)
## 0 169 (41.8) 107 (45.3) 62 (36.9)
## 1 80 (19.8) 41 (17.4) 39 (23.2)
## 2 155 (38.4) 88 (37.3) 67 (39.9)
## iam = 1 (%) 83 (20.5) 32 (13.6) 51 (30.4)
## hta = 1 (%) 273 (67.4) 144 (60.8) 129 (76.8)
## dial = 1 (%) 19 ( 4.7) 10 ( 4.2) 9 ( 5.3)
## loca_factor = Met/Tar (%) 210 (51.7) 135 (57.0) 75 (44.4)
## topo_factor = lat/Mas de dos (%) 254 (62.6) 133 (56.1) 121 (71.6)
## infe_factor (%)
## No 86 (21.2) 55 (23.2) 31 (18.3)
## Leve/Mod 255 (62.8) 146 (61.6) 109 (64.5)
## Grave 65 (16.0) 36 (15.2) 29 (17.2)
## ede_factor (%)
## Sin/local 241 (59.4) 135 (57.0) 106 (62.7)
## Unilateral 124 (30.5) 78 (32.9) 46 (27.2)
## Bilateral 41 (10.1) 24 (10.1) 17 (10.1)
## neur_factor = Mod/charcot (%) 377 (92.9) 230 (97.0) 147 (87.0)
## prof_factor = parcial/total (%) 374 (92.1) 211 (89.0) 163 (96.4)
## area_factor (%)
## Menor a 10 188 (46.3) 121 (51.1) 67 (39.6)
## 10 a 40 157 (38.7) 86 (36.3) 71 (42.0)
## Mas de 40 61 (15.0) 30 (12.7) 31 (18.3)
## zon_factor = Dos o mas (%) 164 (40.4) 83 (35.0) 81 (47.9)
## fase_factor = Granu/infla (%) 387 (95.3) 221 (93.2) 166 (98.2)
## am_cont = 1 (%) 23 ( 5.7) 5 ( 2.1) 18 (10.7)
## ant_pie (%)
## 0 142 (35.0) 69 (29.1) 73 (43.2)
## 1 263 (64.8) 167 (70.5) 96 (56.8)
## 2 1 ( 0.2) 1 ( 0.4) 0 ( 0.0)
## Stratified by isq_factor
## p test
## n
## edad (mean (SD)) <0.001
## dias_ev (mean (SD)) 0.565
## san_elian (mean (SD)) <0.001
## sexo = M (%) 0.732
## tbq (%) 0.171
## 0
## 1
## 2
## iam = 1 (%) <0.001
## hta = 1 (%) 0.001
## dial = 1 (%) 0.778
## loca_factor = Met/Tar (%) 0.016
## topo_factor = lat/Mas de dos (%) 0.002
## infe_factor (%) 0.479
## No
## Leve/Mod
## Grave
## ede_factor (%) 0.450
## Sin/local
## Unilateral
## Bilateral
## neur_factor = Mod/charcot (%) <0.001
## prof_factor = parcial/total (%) 0.011
## area_factor (%) 0.057
## Menor a 10
## 10 a 40
## Mas de 40
## zon_factor = Dos o mas (%) 0.012
## fase_factor = Granu/infla (%) 0.036
## am_cont = 1 (%) 0.001
## ant_pie (%) 0.010
## 0
## 1
## 2
print(tabla_2,
nonnormal = c("dias_ev", "san_elian"),
showAllLevels = TRUE,
quote = FALSE,
noSpaces = TRUE)
## Stratified by isq_factor
## level Overall
## n 406
## edad (mean (SD)) 57.41 (11.09)
## dias_ev (median [IQR]) 20.00 [10.00, 45.00]
## san_elian (median [IQR]) 18.00 [15.00, 21.00]
## sexo (%) F 82 (20.2)
## M 324 (79.8)
## tbq (%) 0 169 (41.8)
## 1 80 (19.8)
## 2 155 (38.4)
## iam (%) 0 321 (79.5)
## 1 83 (20.5)
## hta (%) 0 132 (32.6)
## 1 273 (67.4)
## dial (%) 0 387 (95.3)
## 1 19 (4.7)
## loca_factor (%) Fal 196 (48.3)
## Met/Tar 210 (51.7)
## topo_factor (%) dor/plan 152 (37.4)
## lat/Mas de dos 254 (62.6)
## infe_factor (%) No 86 (21.2)
## Leve/Mod 255 (62.8)
## Grave 65 (16.0)
## ede_factor (%) Sin/local 241 (59.4)
## Unilateral 124 (30.5)
## Bilateral 41 (10.1)
## neur_factor (%) No/leve 29 (7.1)
## Mod/charcot 377 (92.9)
## prof_factor (%) Piel 32 (7.9)
## parcial/total 374 (92.1)
## area_factor (%) Menor a 10 188 (46.3)
## 10 a 40 157 (38.7)
## Mas de 40 61 (15.0)
## zon_factor (%) Una 242 (59.6)
## Dos o mas 164 (40.4)
## fase_factor (%) Epit 19 (4.7)
## Granu/infla 387 (95.3)
## am_cont (%) 0 383 (94.3)
## 1 23 (5.7)
## ant_pie (%) 0 142 (35.0)
## 1 263 (64.8)
## 2 1 (0.2)
## Stratified by isq_factor
## NO/leve SI p
## n 237 169
## edad (mean (SD)) 53.34 (9.97) 63.12 (10.03) <0.001
## dias_ev (median [IQR]) 20.00 [7.50, 30.00] 25.00 [14.00, 60.00] 0.020
## san_elian (median [IQR]) 17.00 [14.00, 20.00] 20.00 [18.00, 23.00] <0.001
## sexo (%) 46 (19.4) 36 (21.3) 0.732
## 191 (80.6) 133 (78.7)
## tbq (%) 107 (45.3) 62 (36.9) 0.171
## 41 (17.4) 39 (23.2)
## 88 (37.3) 67 (39.9)
## iam (%) 204 (86.4) 117 (69.6) <0.001
## 32 (13.6) 51 (30.4)
## hta (%) 93 (39.2) 39 (23.2) 0.001
## 144 (60.8) 129 (76.8)
## dial (%) 227 (95.8) 160 (94.7) 0.778
## 10 (4.2) 9 (5.3)
## loca_factor (%) 102 (43.0) 94 (55.6) 0.016
## 135 (57.0) 75 (44.4)
## topo_factor (%) 104 (43.9) 48 (28.4) 0.002
## 133 (56.1) 121 (71.6)
## infe_factor (%) 55 (23.2) 31 (18.3) 0.479
## 146 (61.6) 109 (64.5)
## 36 (15.2) 29 (17.2)
## ede_factor (%) 135 (57.0) 106 (62.7) 0.450
## 78 (32.9) 46 (27.2)
## 24 (10.1) 17 (10.1)
## neur_factor (%) 7 (3.0) 22 (13.0) <0.001
## 230 (97.0) 147 (87.0)
## prof_factor (%) 26 (11.0) 6 (3.6) 0.011
## 211 (89.0) 163 (96.4)
## area_factor (%) 121 (51.1) 67 (39.6) 0.057
## 86 (36.3) 71 (42.0)
## 30 (12.7) 31 (18.3)
## zon_factor (%) 154 (65.0) 88 (52.1) 0.012
## 83 (35.0) 81 (47.9)
## fase_factor (%) 16 (6.8) 3 (1.8) 0.036
## 221 (93.2) 166 (98.2)
## am_cont (%) 232 (97.9) 151 (89.3) 0.001
## 5 (2.1) 18 (10.7)
## ant_pie (%) 69 (29.1) 73 (43.2) 0.010
## 167 (70.5) 96 (56.8)
## 1 (0.4) 0 (0.0)
## Stratified by isq_factor
## test
## n
## edad (mean (SD))
## dias_ev (median [IQR]) nonnorm
## san_elian (median [IQR]) nonnorm
## sexo (%)
##
## tbq (%)
##
##
## iam (%)
##
## hta (%)
##
## dial (%)
##
## loca_factor (%)
##
## topo_factor (%)
##
## infe_factor (%)
##
##
## ede_factor (%)
##
##
## neur_factor (%)
##
## prof_factor (%)
##
## area_factor (%)
##
##
## zon_factor (%)
##
## fase_factor (%)
##
## am_cont (%)
##
## ant_pie (%)
##
##
kableone(tabla_2)
| Overall | NO/leve | SI | p | test | |
|---|---|---|---|---|---|
| n | 406 | 237 | 169 | ||
| edad (mean (SD)) | 57.41 (11.09) | 53.34 (9.97) | 63.12 (10.03) | <0.001 | |
| dias_ev (mean (SD)) | 50.26 (112.85) | 47.52 (118.71) | 54.08 (104.37) | 0.565 | |
| san_elian (mean (SD)) | 18.26 (4.09) | 16.88 (3.99) | 20.19 (3.41) | <0.001 | |
| sexo = M (%) | 324 (79.8) | 191 (80.6) | 133 (78.7) | 0.732 | |
| tbq (%) | 0.171 | ||||
| 0 | 169 (41.8) | 107 (45.3) | 62 (36.9) | ||
| 1 | 80 (19.8) | 41 (17.4) | 39 (23.2) | ||
| 2 | 155 (38.4) | 88 (37.3) | 67 (39.9) | ||
| iam = 1 (%) | 83 (20.5) | 32 (13.6) | 51 (30.4) | <0.001 | |
| hta = 1 (%) | 273 (67.4) | 144 (60.8) | 129 (76.8) | 0.001 | |
| dial = 1 (%) | 19 ( 4.7) | 10 ( 4.2) | 9 ( 5.3) | 0.778 | |
| loca_factor = Met/Tar (%) | 210 (51.7) | 135 (57.0) | 75 (44.4) | 0.016 | |
| topo_factor = lat/Mas de dos (%) | 254 (62.6) | 133 (56.1) | 121 (71.6) | 0.002 | |
| infe_factor (%) | 0.479 | ||||
| No | 86 (21.2) | 55 (23.2) | 31 (18.3) | ||
| Leve/Mod | 255 (62.8) | 146 (61.6) | 109 (64.5) | ||
| Grave | 65 (16.0) | 36 (15.2) | 29 (17.2) | ||
| ede_factor (%) | 0.450 | ||||
| Sin/local | 241 (59.4) | 135 (57.0) | 106 (62.7) | ||
| Unilateral | 124 (30.5) | 78 (32.9) | 46 (27.2) | ||
| Bilateral | 41 (10.1) | 24 (10.1) | 17 (10.1) | ||
| neur_factor = Mod/charcot (%) | 377 (92.9) | 230 (97.0) | 147 (87.0) | <0.001 | |
| prof_factor = parcial/total (%) | 374 (92.1) | 211 (89.0) | 163 (96.4) | 0.011 | |
| area_factor (%) | 0.057 | ||||
| Menor a 10 | 188 (46.3) | 121 (51.1) | 67 (39.6) | ||
| 10 a 40 | 157 (38.7) | 86 (36.3) | 71 (42.0) | ||
| Mas de 40 | 61 (15.0) | 30 (12.7) | 31 (18.3) | ||
| zon_factor = Dos o mas (%) | 164 (40.4) | 83 (35.0) | 81 (47.9) | 0.012 | |
| fase_factor = Granu/infla (%) | 387 (95.3) | 221 (93.2) | 166 (98.2) | 0.036 | |
| am_cont = 1 (%) | 23 ( 5.7) | 5 ( 2.1) | 18 (10.7) | 0.001 | |
| ant_pie (%) | 0.010 | ||||
| 0 | 142 (35.0) | 69 (29.1) | 73 (43.2) | ||
| 1 | 263 (64.8) | 167 (70.5) | 96 (56.8) | ||
| 2 | 1 ( 0.2) | 1 ( 0.4) | 0 ( 0.0) |
#elemento surv tiempo a la cicatrización
tiempo_evento <- Surv(sob1$dias_out,sob1$cicat)
#evaluacion de la cantidad de eventos por tiempo de seguimiento a intervalos de a 30 dias
sob1 %>%
filter(cicat == 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))
Kaplan meier
# Graficar las curvas de Kaplan-Meier estratificadas por isq
km_global <- survfit(tiempo_evento ~ 1, data = sob1)#ponemos 1 para marcar que es crudo, sin estratificar por ninguna variable
#6b. Ajustar el modelo Kaplan-Meier estratificado por "beck_cat"
km_fit <- survfit(tiempo_evento ~ isq_factor,data = sob1)
ggsurvplot(
km_fit,
data = sob1,
fun = "event", # 👈 ESTO hace la curva ascendente
risk.table = TRUE,
pval = TRUE,
conf.int = TRUE,
cumcensor = TRUE,
ggtheme = theme_minimal(),
palette = "simpsons",
xlab = "Tiempo de seguimiento (dias)",
ylab = "Probabilidad acumulada del evento"
)
## Ignoring unknown labels:
## • linetype : "1"
## Ignoring unknown labels:
## • linetype : "1"
## Ignoring unknown labels:
## • linetype : "1"
## Ignoring unknown labels:
## • linetype : "1"
## Ignoring unknown labels:
## • colour : "Strata"
## Ignoring unknown labels:
## • colour : "Strata"
#logrank
logrank <- survdiff(tiempo_evento ~ isq_factor, data = sob1)
logrank
## Call:
## survdiff(formula = tiempo_evento ~ isq_factor, data = sob1)
##
## N Observed Expected (O-E)^2/E (O-E)^2/V
## isq_factor=NO/leve 237 162 120 14.4 32.3
## isq_factor=SI 169 61 103 16.9 32.3
##
## Chisq= 32.3 on 1 degrees of freedom, p= 0.00000001
summary(km_fit)$table
## records n.max n.start events rmean se(rmean) median 0.95LCL
## isq_factor=NO/leve 237 237 237 162 120 6.55 91 84
## isq_factor=SI 169 169 169 61 195 11.94 170 153
## 0.95UCL
## isq_factor=NO/leve 109
## isq_factor=SI 275
#mediana
km_fit$table[, c("median","0.95LCL","0.95UCL")]
## NULL
surv_median(km_fit)
## strata median lower upper
## 1 isq_factor=NO/leve 91 84 109
## 2 isq_factor=SI 170 153 275
#modelo de cox. Se realiza para evaluar los supuestos
#Efecto de la isquemia sobre el tiempo a la cicatrización sin eventos competitivos ajustado por edad y edema
cox_model <- coxph(tiempo_evento ~ isq_factor+ edad + ede_factor , data = sob1)
summary(cox_model)
## Call:
## coxph(formula = tiempo_evento ~ isq_factor + edad + ede_factor,
## data = sob1)
##
## n= 406, number of events= 223
##
## coef exp(coef) se(coef) z Pr(>|z|)
## isq_factorSI -0.71978 0.48686 0.16765 -4.29 0.000018 ***
## edad -0.01610 0.98402 0.00765 -2.11 0.035 *
## ede_factorUnilateral -0.20647 0.81345 0.15253 -1.35 0.176
## ede_factorBilateral -0.15043 0.86034 0.23500 -0.64 0.522
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## isq_factorSI 0.487 2.05 0.351 0.676
## edad 0.984 1.02 0.969 0.999
## ede_factorUnilateral 0.813 1.23 0.603 1.097
## ede_factorBilateral 0.860 1.16 0.543 1.364
##
## Concordance= 0.63 (se = 0.021 )
## Likelihood ratio test= 40.5 on 4 df, p=0.00000003
## Wald test = 37.1 on 4 df, p=0.0000002
## Score (logrank) test = 38.9 on 4 df, p=0.00000007
tab_model(cox_model,
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 |
| isq factorSI | 0.49 | 0.08 | 0.00 – Inf | <0.001 |
| edad | 0.98 | 0.01 | 0.00 – Inf | 0.035 |
| ede factor [Unilateral] | 0.81 | 0.12 | 0.00 – Inf | 0.176 |
| ede factorBilateral | 0.86 | 0.20 | 0.00 – Inf | 0.522 |
| Observations | 406 | |||
| R2 Nagelkerke | 0.095 | |||
confint(cox_model)
## 2.5 % 97.5 %
## isq_factorSI -1.0484 -0.39118
## edad -0.0311 -0.00111
## ede_factorUnilateral -0.5054 0.09249
## ede_factorBilateral -0.6110 0.31016
#supuesto de proporcionalidad
#Test de proporcionalidad de riesgos de Schoenfeld
test_ph <- cox.zph(cox_model)
test_ph
## chisq df p
## isq_factor 1.8077 1 0.18
## edad 0.0327 1 0.86
## ede_factor 1.4240 2 0.49
## GLOBAL 3.6145 4 0.46
#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.
## ggtheme is not a valid theme.
## Please use `theme()` to construct themes.
#gráficos loglog
##loglog isq_factor
ggsurvplot(
survfit(tiempo_evento ~ isq_factor, data = sob1),
fun = "cloglog",
xlab = "Tiempo (dias)",
ylab = "Log(-Log(S(t)))",
palette = "simpsons"
)
## Warning: ggtheme is not a valid theme.
## Please use `theme()` to construct themes.
## Ignoring unknown labels:
## • fill : "Strata"
## • linetype : "1"
## Ignoring unknown labels:
## • fill : "Strata"
## • linetype : "1"
#ggsurvplot(
# survfit(tiempo_evento ~ infe_factor, data = sob1),
# fun = "cloglog",
# xlab = "Tiempo (dias)",
# ylab = "Log(-Log(S(t)))",
# palette = "simpsons"
#)
ggsurvplot(
survfit(tiempo_evento ~ ede_factor, data = sob1),
fun = "cloglog",
xlab = "Tiempo (dias)",
ylab = "Log(-Log(S(t)))",
palette = "simpsons"
)
## Warning: ggtheme is not a valid theme.
## Please use `theme()` to construct themes.
## Ignoring unknown labels:
## • fill : "Strata"
## • linetype : "1"
## Ignoring unknown labels:
## • fill : "Strata"
## • linetype : "1"
#Residuos de Martingale y deviance para la adecuación del modelo
# Martingale y Deviance
ggcoxdiagnostics(cox_model, type = "martingale", linear.predictions = FALSE)
## `geom_smooth()` using formula = 'y ~ x'
ggcoxdiagnostics(cox_model, type = "deviance", linear.predictions = FALSE)
## `geom_smooth()` using formula = 'y ~ x'
#Discriminación y calibración del COX
#C de harrell
summary(cox_model)$concordance
## C se(C)
## 0.6301 0.0213
#bootstrap
#Indice D de Somer (Dxy), Metricas Q D U, slope y R2 con paquete `rms`
dd <- datadist(sob1); options(datadist = "dd")
## Warning in datadist(sob1): ...44 is constant
cox_metrics <- cph(tiempo_evento ~ edad + isq_factor + ede_factor,
data = sob1, 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.2601 0.2658 0.2460 0.0198 0.2403 200
## R2 0.0954 0.1049 0.0887 0.0162 0.0792 200
## Slope 1.0000 1.0000 0.9291 0.0709 0.9291 200
## D 0.0177 0.0199 0.0164 0.0035 0.0143 200
## U -0.0009 -0.0009 0.0006 -0.0015 0.0006 200
## Q 0.0186 0.0208 0.0158 0.0050 0.0136 200
## g 0.5290 0.5566 0.5027 0.0539 0.4751 200
round(cox_rms[,5],2)
## Dxy R2 Slope D U Q g
## 0.24 0.08 0.93 0.01 0.00 0.01 0.48
# 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 Cicatrizacion",
ylab = "Cicatrizacion Observada")
La curva azul está sistemáticamente por encima de la diagonal.
Eso sugiere que el modelo está sobreestimando la probabilidad de cicatrización.
Porque ignora que:
muchos pacientes mueren
muchos se amputan
Y por lo tanto, inflan la probabilidad teórica de cicatrizar.
#evento cica tomando evento competitivo am y muerte
sob1 <- sob1 %>%
mutate(
evento_cica = case_when(
estado_unif == "cerro_herida" ~ 1,
estado_unif %in% c( "fallecio", "amputacion") ~ 2,
estado_unif %in% c("perdido_seguimiento", "persiste") ~ 0,
TRUE ~ NA_real_
)
)
table(sob1$evento_cica)
##
## 0 1 2
## 112 223 71
#modelo de causa específica
#Opcion con objeto creado
#si evento es 1, es porque se amputo o persiste
#si evento es 2, es porque se murió o se perdió
tiempo_cicat <- Surv(sob1$dias_out, sob1$evento_cica==1)
tiempo_compet <- Surv(sob1$dias_out, sob1$evento_cica==2)
cox_cicat <- coxph(tiempo_cicat ~
isq_factor + edad+
ede_factor , data = sob1)
summary(cox_cicat)
## Call:
## coxph(formula = tiempo_cicat ~ isq_factor + edad + ede_factor,
## data = sob1)
##
## n= 406, number of events= 223
##
## coef exp(coef) se(coef) z Pr(>|z|)
## isq_factorSI -0.71978 0.48686 0.16765 -4.29 0.000018 ***
## edad -0.01610 0.98402 0.00765 -2.11 0.035 *
## ede_factorUnilateral -0.20647 0.81345 0.15253 -1.35 0.176
## ede_factorBilateral -0.15043 0.86034 0.23500 -0.64 0.522
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## isq_factorSI 0.487 2.05 0.351 0.676
## edad 0.984 1.02 0.969 0.999
## ede_factorUnilateral 0.813 1.23 0.603 1.097
## ede_factorBilateral 0.860 1.16 0.543 1.364
##
## Concordance= 0.63 (se = 0.021 )
## Likelihood ratio test= 40.5 on 4 df, p=0.00000003
## Wald test = 37.1 on 4 df, p=0.0000002
## Score (logrank) test = 38.9 on 4 df, p=0.00000007
cox_compet <- coxph(tiempo_compet ~
isq_factor + edad+
ede_factor , data = sob1)
summary(cox_compet)
## Call:
## coxph(formula = tiempo_compet ~ isq_factor + edad + ede_factor,
## data = sob1)
##
## n= 406, number of events= 71
##
## coef exp(coef) se(coef) z Pr(>|z|)
## isq_factorSI 1.2845 3.6128 0.3009 4.27 0.00002 ***
## edad 0.0268 1.0272 0.0124 2.16 0.030 *
## ede_factorUnilateral 0.5849 1.7948 0.2557 2.29 0.022 *
## ede_factorBilateral 0.2923 1.3395 0.4145 0.71 0.481
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## isq_factorSI 3.61 0.277 2.003 6.52
## edad 1.03 0.974 1.003 1.05
## ede_factorUnilateral 1.79 0.557 1.087 2.96
## ede_factorBilateral 1.34 0.747 0.594 3.02
##
## Concordance= 0.71 (se = 0.031 )
## Likelihood ratio test= 43 on 4 df, p=0.00000001
## Wald test = 36.9 on 4 df, p=0.0000002
## Score (logrank) test = 42.4 on 4 df, p=0.00000001
#CIF
cifivhx <- cuminc(Surv(dias_out, factor(evento_cica)) ~ isq_factor, data=sob1)
cifivhx
##
## ── cuminc() ────────────────────────────────────────────────────────────────────
## • Failure type "1"
## strata time n.risk estimate std.error 95% CI
## NO/leve 100 86 0.499 0.034 0.430, 0.564
## NO/leve 200 22 0.742 0.033 0.670, 0.801
## NO/leve 300 3 0.890 0.029 0.816, 0.936
## SI 100 71 0.183 0.032 0.126, 0.249
## SI 200 24 0.394 0.044 0.308, 0.479
## SI 300 8 0.496 0.051 0.393, 0.590
## • Failure type "2"
## strata time n.risk estimate std.error 95% CI
## NO/leve 100 86 0.075 0.018 0.045, 0.114
## NO/leve 200 22 0.075 0.018 0.045, 0.114
## NO/leve 300 3 0.075 0.018 0.045, 0.114
## SI 100 71 0.282 0.036 0.215, 0.353
## SI 200 24 0.337 0.039 0.263, 0.413
## SI 300 8 0.350 0.040 0.273, 0.428
## • Tests
## outcome statistic df p.value
## 1 56.8 1.00 <0.001
## 2 40.4 1.00 <0.001
#Gráfico CIF
library(tidycmprsk)
library(ggsurvfit)
ggcuminc(
cifivhx,
outcome = c(1, 2),
linetype_aes = TRUE
) +
scale_color_manual(
name = "Isquemia",
values = c("NO/leve" = "#56B4E9", "SI" = "#E69F00")
) +
scale_linetype_manual(
name = "Tipo de evento",
values = c("solid", "dashed"),
labels = c(
"Evento de interes (cicatrizacion)",
"Evento competitivo (muerte / amputacion mayor)"
)
) +
labs(
x = "Tiempo (dias)",
y = "Incidencia acumulada"
) +
theme_minimal() +
theme(
legend.position = "bottom"
)
## Warning: Removed 2 rows containing missing values or values outside the scale range
## (`geom_step()`).
#Modelo de causa específica Cuando hacés predicción con este modelo, lo que obtenés es:
“Probabilidad de cicatrizar si los eventos competitivos fueran censura”
Es decir:
Trata muerte y amputación como si fueran pérdidas no informativas.
La probabilidad predicha no es la CIF real.
Entonces tu gráfico 1 está calibrando:
Riesgo derivado del modelo causa-específica (no la incidencia acumulada real).
#modelo de causa específica
modelo_CSC <- CSC(
formula = Hist(dias_out, evento_cica) ~ isq_factor+edad + ede_factor, data = sob1,
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_cica) ~ isq_factor + edad +
## ede_factor, data = sob1, cause = 1)
##
## Right-censored response of a competing.risks model
##
## No.Observations: 406
##
## Pattern:
##
## Cause event right.censored
## 1 223 0
## 2 71 0
## unknown 0 112
##
##
## ----------> Cause: 1
##
## Call:
## coxph(formula = survival::Surv(time, status) ~ isq_factor + edad +
## ede_factor, x = TRUE, y = TRUE)
##
## n= 406, number of events= 223
##
## coef exp(coef) se(coef) z Pr(>|z|)
## isq_factorSI -0.71978 0.48686 0.16765 -4.29 0.000018 ***
## edad -0.01610 0.98402 0.00765 -2.11 0.035 *
## ede_factorUnilateral -0.20647 0.81345 0.15253 -1.35 0.176
## ede_factorBilateral -0.15043 0.86034 0.23500 -0.64 0.522
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## isq_factorSI 0.487 2.05 0.351 0.676
## edad 0.984 1.02 0.969 0.999
## ede_factorUnilateral 0.813 1.23 0.603 1.097
## ede_factorBilateral 0.860 1.16 0.543 1.364
##
## Concordance= 0.63 (se = 0.021 )
## Likelihood ratio test= 40.5 on 4 df, p=0.00000003
## Wald test = 37.1 on 4 df, p=0.0000002
## Score (logrank) test = 38.9 on 4 df, p=0.00000007
##
##
##
## ----------> Cause: 2
##
## Call:
## coxph(formula = survival::Surv(time, status) ~ isq_factor + edad +
## ede_factor, x = TRUE, y = TRUE)
##
## n= 406, number of events= 71
##
## coef exp(coef) se(coef) z Pr(>|z|)
## isq_factorSI 1.2845 3.6128 0.3009 4.27 0.00002 ***
## edad 0.0268 1.0272 0.0124 2.16 0.030 *
## ede_factorUnilateral 0.5849 1.7948 0.2557 2.29 0.022 *
## ede_factorBilateral 0.2923 1.3395 0.4145 0.71 0.481
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## isq_factorSI 3.61 0.277 2.003 6.52
## edad 1.03 0.974 1.003 1.05
## ede_factorUnilateral 1.79 0.557 1.087 2.96
## ede_factorBilateral 1.34 0.747 0.594 3.02
##
## Concordance= 0.71 (se = 0.031 )
## Likelihood ratio test= 43 on 4 df, p=0.00000001
## Wald test = 36.9 on 4 df, p=0.0000002
## Score (logrank) test = 42.4 on 4 df, p=0.00000001
#Modelo de Fine and Gray Probabilidad real acumulada de cicatrización considerando muerte y amputación como eventos competitivos.
Tu segundo gráfico está calibrando:
Probabilidad real acumulada observada vs predicha (CIF).
#modelo de Fine and gray
modelo_fg <- FGR(
formula = Hist(dias_out, evento_cica) ~ isq_factor + edad+ede_factor
, data = sob1,
cause = 1 # Aclara que Cicatrizacion es el evento de interés
)
modelo_fg
##
## Right-censored response of a competing.risks model
##
## No.Observations: 406
##
## Pattern:
##
## Cause event right.censored
## 1 223 0
## 2 71 0
## unknown 0 112
##
##
## Fine-Gray model: analysis of cause 1
##
## Competing Risks Regression
##
## Call:
## FGR(formula = Hist(dias_out, evento_cica) ~ isq_factor + edad +
## ede_factor, data = sob1, cause = 1)
##
## coef exp(coef) se(coef) z p-value
## isq_factorSI -0.9719 0.378 0.16781 -5.791 0.000000007
## edad -0.0172 0.983 0.00771 -2.236 0.025000000
## ede_factorUnilateral -0.3437 0.709 0.14962 -2.297 0.022000000
## ede_factorBilateral -0.1976 0.821 0.23140 -0.854 0.390000000
##
## exp(coef) exp(-coef) 2.5% 97.5%
## isq_factorSI 0.378 2.64 0.272 0.526
## edad 0.983 1.02 0.968 0.998
## ede_factorUnilateral 0.709 1.41 0.529 0.951
## ede_factorBilateral 0.821 1.22 0.521 1.292
##
## Num. cases = 406
## Pseudo Log-likelihood = -1151
## Pseudo likelihood ratio test = 70.8 on 4 df,
##
## Convergence: TRUE
#Gray test
library(cmprsk)
cuminc_obj <- cmprsk::cuminc(
ftime = sob1$dias_out,
fstatus = sob1$evento_cica,
group = sob1$isq_factor
)
cuminc_obj
## Tests:
## stat pv df
## 1 56.8 0.0000000000000484 1
## 2 40.4 0.0000000002049831 1
## Estimates and Variances:
## $est
## 100 200 300
## NO/leve 1 0.4989 0.7424 0.8903
## SI 1 0.1830 0.3941 0.4955
## NO/leve 2 0.0751 0.0751 0.0751
## SI 2 0.2822 0.3372 0.3500
##
## $var
## 100 200 300
## NO/leve 1 0.001167 0.001115 0.000864
## SI 1 0.000998 0.001915 0.002577
## NO/leve 2 0.000309 0.000309 0.000309
## SI 2 0.001267 0.001483 0.001592
¿Poner medianas de cicatrización?
En análisis con riesgos competitivos:
👉 La mediana basada en Kaplan–Meier NO corresponde 👉 La mediana basada en CIF tampoco es tan informativa clínicamente
Porque:
La CIF no es una función de supervivencia clásica
La mediana puede no ser alcanzable
Clínicamente es más interpretable decir:
“La probabilidad acumulada de cicatrización a 180 días fue 62% en pacientes sin isquemia vs 38% en pacientes con isquemia.”
Eso es muchísimo más potente.
*CIF (figura principal)
*Probabilidad absoluta a 180 días
*sHR (crudo y ajustado)
*Sensibilidad con cause-specific (opcional, no central)
# Evaluar performance predictiva con Score. AUC
score_fg <- Score(
object = list("FG model" = modelo_fg),
formula = Hist(dias_out, evento_cica) ~ 1,
data = sob1,
times = c(17:200),
metrics = "auc",
summary = "IPA",
cens.model = "km",
cause = 1
)
score_fg$AUC$score
## model times AUC se lower upper
## <fctr> <int> <num> <num> <num> <num>
## 1: FG model 17 0.503 0.1179 0.272 0.734
## 2: FG model 18 0.530 0.1064 0.322 0.739
## 3: FG model 19 0.530 0.1064 0.322 0.739
## 4: FG model 20 0.530 0.1064 0.322 0.739
## 5: FG model 21 0.574 0.0900 0.397 0.750
## ---
## 180: FG model 196 0.723 0.0313 0.662 0.785
## 181: FG model 197 0.720 0.0316 0.658 0.782
## 182: FG model 198 0.720 0.0316 0.658 0.782
## 183: FG model 199 0.725 0.0317 0.663 0.787
## 184: FG model 200 0.724 0.0320 0.661 0.787
#comparacion causa especifica y FyG
#score comparado con ipa
score_comp <-Score(
list("FG model" = modelo_fg, "CSC model" = modelo_CSC),
formula = Hist(dias_out, evento_cica) ~ 1,
data = sob1,
times = c(17: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 17 0.00000
## 2 Null model 18 0.00000
## 3 Null model 19 0.00000
## 4 Null model 20 0.00000
## 5 Null model 21 0.00000
## 6 Null model 22 0.00000
## 7 Null model 23 0.00000
## 8 Null model 24 0.00000
## 9 Null model 25 0.00000
## 10 Null model 26 0.00000
## 11 Null model 27 0.00000
## 12 Null model 28 0.00000
## 13 Null model 29 0.00000
## 14 Null model 30 0.00000
## 15 Null model 31 0.00000
## 16 Null model 32 0.00000
## 17 Null model 33 0.00000
## 18 Null model 34 0.00000
## 19 Null model 35 0.00000
## 20 Null model 36 0.00000
## 21 Null model 37 0.00000
## 22 Null model 38 0.00000
## 23 Null model 39 0.00000
## 24 Null model 40 0.00000
## 25 Null model 41 0.00000
## 26 Null model 42 0.00000
## 27 Null model 43 0.00000
## 28 Null model 44 0.00000
## 29 Null model 45 0.00000
## 30 Null model 46 0.00000
## 31 Null model 47 0.00000
## 32 Null model 48 0.00000
## 33 Null model 49 0.00000
## 34 Null model 50 0.00000
## 35 Null model 51 0.00000
## 36 Null model 52 0.00000
## 37 Null model 53 0.00000
## 38 Null model 54 0.00000
## 39 Null model 55 0.00000
## 40 Null model 56 0.00000
## 41 Null model 57 0.00000
## 42 Null model 58 0.00000
## 43 Null model 59 0.00000
## 44 Null model 60 0.00000
## 45 Null model 61 0.00000
## 46 Null model 62 0.00000
## 47 Null model 63 0.00000
## 48 Null model 64 0.00000
## 49 Null model 65 0.00000
## 50 Null model 66 0.00000
## 51 Null model 67 0.00000
## 52 Null model 68 0.00000
## 53 Null model 69 0.00000
## 54 Null model 70 0.00000
## 55 Null model 71 0.00000
## 56 Null model 72 0.00000
## 57 Null model 73 0.00000
## 58 Null model 74 0.00000
## 59 Null model 75 0.00000
## 60 Null model 76 0.00000
## 61 Null model 77 0.00000
## 62 Null model 78 0.00000
## 63 Null model 79 0.00000
## 64 Null model 80 0.00000
## 65 Null model 81 0.00000
## 66 Null model 82 0.00000
## 67 Null model 83 0.00000
## 68 Null model 84 0.00000
## 69 Null model 85 0.00000
## 70 Null model 86 0.00000
## 71 Null model 87 0.00000
## 72 Null model 88 0.00000
## 73 Null model 89 0.00000
## 74 Null model 90 0.00000
## 75 Null model 91 0.00000
## 76 Null model 92 0.00000
## 77 Null model 93 0.00000
## 78 Null model 94 0.00000
## 79 Null model 95 0.00000
## 80 Null model 96 0.00000
## 81 Null model 97 0.00000
## 82 Null model 98 0.00000
## 83 Null model 99 0.00000
## 84 Null model 100 0.00000
## 85 Null model 101 0.00000
## 86 Null model 102 0.00000
## 87 Null model 103 0.00000
## 88 Null model 104 0.00000
## 89 Null model 105 0.00000
## 90 Null model 106 0.00000
## 91 Null model 107 0.00000
## 92 Null model 108 0.00000
## 93 Null model 109 0.00000
## 94 Null model 110 0.00000
## 95 Null model 111 0.00000
## 96 Null model 112 0.00000
## 97 Null model 113 0.00000
## 98 Null model 114 0.00000
## 99 Null model 115 0.00000
## 100 Null model 116 0.00000
## 101 Null model 117 0.00000
## 102 Null model 118 0.00000
## 103 Null model 119 0.00000
## 104 Null model 120 0.00000
## 105 Null model 121 0.00000
## 106 Null model 122 0.00000
## 107 Null model 123 0.00000
## 108 Null model 124 0.00000
## 109 Null model 125 0.00000
## 110 Null model 126 0.00000
## 111 Null model 127 0.00000
## 112 Null model 128 0.00000
## 113 Null model 129 0.00000
## 114 Null model 130 0.00000
## 115 Null model 131 0.00000
## 116 Null model 132 0.00000
## 117 Null model 133 0.00000
## 118 Null model 134 0.00000
## 119 Null model 135 0.00000
## 120 Null model 136 0.00000
## 121 Null model 137 0.00000
## 122 Null model 138 0.00000
## 123 Null model 139 0.00000
## 124 Null model 140 0.00000
## 125 Null model 141 0.00000
## 126 Null model 142 0.00000
## 127 Null model 143 0.00000
## 128 Null model 144 0.00000
## 129 Null model 145 0.00000
## 130 Null model 146 0.00000
## 131 Null model 147 0.00000
## 132 Null model 148 0.00000
## 133 Null model 149 0.00000
## 134 Null model 150 0.00000
## 135 Null model 151 0.00000
## 136 Null model 152 0.00000
## 137 Null model 153 0.00000
## 138 Null model 154 0.00000
## 139 Null model 155 0.00000
## 140 Null model 156 0.00000
## 141 Null model 157 0.00000
## 142 Null model 158 0.00000
## 143 Null model 159 0.00000
## 144 Null model 160 0.00000
## 145 Null model 161 0.00000
## 146 Null model 162 0.00000
## 147 Null model 163 0.00000
## 148 Null model 164 0.00000
## 149 Null model 165 0.00000
## 150 Null model 166 0.00000
## 151 Null model 167 0.00000
## 152 Null model 168 0.00000
## 153 Null model 169 0.00000
## 154 Null model 170 0.00000
## 155 Null model 171 0.00000
## 156 Null model 172 0.00000
## 157 Null model 173 0.00000
## 158 Null model 174 0.00000
## 159 Null model 175 0.00000
## 160 Null model 176 0.00000
## 161 Null model 177 0.00000
## 162 Null model 178 0.00000
## 163 Null model 179 0.00000
## 164 Null model 180 0.00000
## 165 Null model 181 0.00000
## 166 Null model 182 0.00000
## 167 Null model 183 0.00000
## 168 Null model 184 0.00000
## 169 Null model 185 0.00000
## 170 Null model 186 0.00000
## 171 Null model 187 0.00000
## 172 Null model 188 0.00000
## 173 Null model 189 0.00000
## 174 Null model 190 0.00000
## 175 Null model 191 0.00000
## 176 Null model 192 0.00000
## 177 Null model 193 0.00000
## 178 Null model 194 0.00000
## 179 Null model 195 0.00000
## 180 Null model 196 0.00000
## 181 Null model 197 0.00000
## 182 Null model 198 0.00000
## 183 Null model 199 0.00000
## 184 Null model 200 0.00000
## 185 FG model 17 -0.00473
## 186 FG model 18 -0.00342
## 187 FG model 19 -0.00342
## 188 FG model 20 -0.00342
## 189 FG model 21 -0.00040
## 190 FG model 22 -0.00420
## 191 FG model 23 -0.00420
## 192 FG model 24 0.00449
## 193 FG model 25 0.00474
## 194 FG model 26 0.00474
## 195 FG model 27 0.00724
## 196 FG model 28 0.01362
## 197 FG model 29 0.01362
## 198 FG model 30 0.01362
## 199 FG model 31 0.01362
## 200 FG model 32 0.01656
## 201 FG model 33 0.02070
## 202 FG model 34 0.02073
## 203 FG model 35 0.03658
## 204 FG model 36 0.04297
## 205 FG model 37 0.04297
## 206 FG model 38 0.04297
## 207 FG model 39 0.04425
## 208 FG model 40 0.04251
## 209 FG model 41 0.04935
## 210 FG model 42 0.06500
## 211 FG model 43 0.07229
## 212 FG model 44 0.06823
## 213 FG model 45 0.06960
## 214 FG model 46 0.06494
## 215 FG model 47 0.07900
## 216 FG model 48 0.07900
## 217 FG model 49 0.07780
## 218 FG model 50 0.07328
## 219 FG model 51 0.07501
## 220 FG model 52 0.07510
## 221 FG model 53 0.07834
## 222 FG model 54 0.07681
## 223 FG model 55 0.07681
## 224 FG model 56 0.07665
## 225 FG model 57 0.07409
## 226 FG model 58 0.07123
## 227 FG model 59 0.06740
## 228 FG model 60 0.06638
## 229 FG model 61 0.06757
## 230 FG model 62 0.06757
## 231 FG model 63 0.06691
## 232 FG model 64 0.06952
## 233 FG model 65 0.06929
## 234 FG model 66 0.07067
## 235 FG model 67 0.07094
## 236 FG model 68 0.06580
## 237 FG model 69 0.06944
## 238 FG model 70 0.07471
## 239 FG model 71 0.08167
## 240 FG model 72 0.08915
## 241 FG model 73 0.08380
## 242 FG model 74 0.08380
## 243 FG model 75 0.08629
## 244 FG model 76 0.08104
## 245 FG model 77 0.08309
## 246 FG model 78 0.09034
## 247 FG model 79 0.09096
## 248 FG model 80 0.09409
## 249 FG model 81 0.09409
## 250 FG model 82 0.09531
## 251 FG model 83 0.09133
## 252 FG model 84 0.09397
## 253 FG model 85 0.09929
## 254 FG model 86 0.09544
## 255 FG model 87 0.09458
## 256 FG model 88 0.09843
## 257 FG model 89 0.10471
## 258 FG model 90 0.10348
## 259 FG model 91 0.12012
## 260 FG model 92 0.11877
## 261 FG model 93 0.11877
## 262 FG model 94 0.11877
## 263 FG model 95 0.12059
## 264 FG model 96 0.12606
## 265 FG model 97 0.10903
## 266 FG model 98 0.11382
## 267 FG model 99 0.11454
## 268 FG model 100 0.11454
## 269 FG model 101 0.11321
## 270 FG model 102 0.11680
## 271 FG model 103 0.11717
## 272 FG model 104 0.11175
## 273 FG model 105 0.11905
## 274 FG model 106 0.12098
## 275 FG model 107 0.12411
## 276 FG model 108 0.12061
## 277 FG model 109 0.11851
## 278 FG model 110 0.11949
## 279 FG model 111 0.12408
## 280 FG model 112 0.12127
## 281 FG model 113 0.12346
## 282 FG model 114 0.12500
## 283 FG model 115 0.12166
## 284 FG model 116 0.12166
## 285 FG model 117 0.11914
## 286 FG model 118 0.11914
## 287 FG model 119 0.13104
## 288 FG model 120 0.13055
## 289 FG model 121 0.12967
## 290 FG model 122 0.13407
## 291 FG model 123 0.13407
## 292 FG model 124 0.13407
## 293 FG model 125 0.13407
## 294 FG model 126 0.13912
## 295 FG model 127 0.14527
## 296 FG model 128 0.14474
## 297 FG model 129 0.14336
## 298 FG model 130 0.14519
## 299 FG model 131 0.14519
## 300 FG model 132 0.14519
## 301 FG model 133 0.14474
## 302 FG model 134 0.14474
## 303 FG model 135 0.14665
## 304 FG model 136 0.14665
## 305 FG model 137 0.14665
## 306 FG model 138 0.14249
## 307 FG model 139 0.14818
## 308 FG model 140 0.15151
## 309 FG model 141 0.15553
## 310 FG model 142 0.16455
## 311 FG model 143 0.16591
## 312 FG model 144 0.16354
## 313 FG model 145 0.16120
## 314 FG model 146 0.16120
## 315 FG model 147 0.16107
## 316 FG model 148 0.15475
## 317 FG model 149 0.15475
## 318 FG model 150 0.16012
## 319 FG model 151 0.15789
## 320 FG model 152 0.15789
## 321 FG model 153 0.14825
## 322 FG model 154 0.14076
## 323 FG model 155 0.14076
## 324 FG model 156 0.14076
## 325 FG model 157 0.13842
## 326 FG model 158 0.13527
## 327 FG model 159 0.13527
## 328 FG model 160 0.13022
## 329 FG model 161 0.13022
## 330 FG model 162 0.13815
## 331 FG model 163 0.13131
## 332 FG model 164 0.13131
## 333 FG model 165 0.13131
## 334 FG model 166 0.13178
## 335 FG model 167 0.13677
## 336 FG model 168 0.13380
## 337 FG model 169 0.13380
## 338 FG model 170 0.12691
## 339 FG model 171 0.12691
## 340 FG model 172 0.12361
## 341 FG model 173 0.12361
## 342 FG model 174 0.12375
## 343 FG model 175 0.12375
## 344 FG model 176 0.12375
## 345 FG model 177 0.12938
## 346 FG model 178 0.12938
## 347 FG model 179 0.12938
## 348 FG model 180 0.12938
## 349 FG model 181 0.14238
## 350 FG model 182 0.14925
## 351 FG model 183 0.14925
## 352 FG model 184 0.14925
## 353 FG model 185 0.14925
## 354 FG model 186 0.16729
## 355 FG model 187 0.16729
## 356 FG model 188 0.16729
## 357 FG model 189 0.16729
## 358 FG model 190 0.16767
## 359 FG model 191 0.15728
## 360 FG model 192 0.16272
## 361 FG model 193 0.16272
## 362 FG model 194 0.15336
## 363 FG model 195 0.15336
## 364 FG model 196 0.14951
## 365 FG model 197 0.14516
## 366 FG model 198 0.14516
## 367 FG model 199 0.14996
## 368 FG model 200 0.14799
## 369 CSC model 17 -0.00356
## 370 CSC model 18 -0.00231
## 371 CSC model 19 -0.00231
## 372 CSC model 20 -0.00231
## 373 CSC model 21 0.00051
## 374 CSC model 22 -0.00269
## 375 CSC model 23 -0.00269
## 376 CSC model 24 0.00469
## 377 CSC model 25 0.00494
## 378 CSC model 26 0.00494
## 379 CSC model 27 0.00778
## 380 CSC model 28 0.01304
## 381 CSC model 29 0.01304
## 382 CSC model 30 0.01304
## 383 CSC model 31 0.01304
## 384 CSC model 32 0.01541
## 385 CSC model 33 0.01976
## 386 CSC model 34 0.02071
## 387 CSC model 35 0.03474
## 388 CSC model 36 0.04022
## 389 CSC model 37 0.04022
## 390 CSC model 38 0.04022
## 391 CSC model 39 0.04123
## 392 CSC model 40 0.03973
## 393 CSC model 41 0.04586
## 394 CSC model 42 0.06016
## 395 CSC model 43 0.06691
## 396 CSC model 44 0.06295
## 397 CSC model 45 0.06413
## 398 CSC model 46 0.06018
## 399 CSC model 47 0.07416
## 400 CSC model 48 0.07416
## 401 CSC model 49 0.07289
## 402 CSC model 50 0.06858
## 403 CSC model 51 0.07003
## 404 CSC model 52 0.07055
## 405 CSC model 53 0.07371
## 406 CSC model 54 0.07208
## 407 CSC model 55 0.07208
## 408 CSC model 56 0.07178
## 409 CSC model 57 0.06994
## 410 CSC model 58 0.06756
## 411 CSC model 59 0.06406
## 412 CSC model 60 0.06334
## 413 CSC model 61 0.06513
## 414 CSC model 62 0.06513
## 415 CSC model 63 0.06473
## 416 CSC model 64 0.06684
## 417 CSC model 65 0.06645
## 418 CSC model 66 0.06762
## 419 CSC model 67 0.06841
## 420 CSC model 68 0.06337
## 421 CSC model 69 0.06649
## 422 CSC model 70 0.07172
## 423 CSC model 71 0.07776
## 424 CSC model 72 0.08477
## 425 CSC model 73 0.07980
## 426 CSC model 74 0.07980
## 427 CSC model 75 0.08228
## 428 CSC model 76 0.07705
## 429 CSC model 77 0.08012
## 430 CSC model 78 0.08769
## 431 CSC model 79 0.08879
## 432 CSC model 80 0.09162
## 433 CSC model 81 0.09162
## 434 CSC model 82 0.09239
## 435 CSC model 83 0.08864
## 436 CSC model 84 0.09199
## 437 CSC model 85 0.09700
## 438 CSC model 86 0.09343
## 439 CSC model 87 0.09284
## 440 CSC model 88 0.09625
## 441 CSC model 89 0.10196
## 442 CSC model 90 0.10070
## 443 CSC model 91 0.11648
## 444 CSC model 92 0.11513
## 445 CSC model 93 0.11513
## 446 CSC model 94 0.11513
## 447 CSC model 95 0.11682
## 448 CSC model 96 0.12232
## 449 CSC model 97 0.10598
## 450 CSC model 98 0.11137
## 451 CSC model 99 0.11169
## 452 CSC model 100 0.11169
## 453 CSC model 101 0.11036
## 454 CSC model 102 0.11358
## 455 CSC model 103 0.11360
## 456 CSC model 104 0.10839
## 457 CSC model 105 0.11496
## 458 CSC model 106 0.11675
## 459 CSC model 107 0.11927
## 460 CSC model 108 0.11674
## 461 CSC model 109 0.11415
## 462 CSC model 110 0.11560
## 463 CSC model 111 0.12093
## 464 CSC model 112 0.11754
## 465 CSC model 113 0.11959
## 466 CSC model 114 0.12072
## 467 CSC model 115 0.11744
## 468 CSC model 116 0.11744
## 469 CSC model 117 0.11639
## 470 CSC model 118 0.11639
## 471 CSC model 119 0.12790
## 472 CSC model 120 0.12711
## 473 CSC model 121 0.12674
## 474 CSC model 122 0.13119
## 475 CSC model 123 0.13119
## 476 CSC model 124 0.13119
## 477 CSC model 125 0.13119
## 478 CSC model 126 0.13596
## 479 CSC model 127 0.14210
## 480 CSC model 128 0.14209
## 481 CSC model 129 0.14146
## 482 CSC model 130 0.14330
## 483 CSC model 131 0.14330
## 484 CSC model 132 0.14330
## 485 CSC model 133 0.14305
## 486 CSC model 134 0.14305
## 487 CSC model 135 0.14552
## 488 CSC model 136 0.14552
## 489 CSC model 137 0.14552
## 490 CSC model 138 0.14182
## 491 CSC model 139 0.14727
## 492 CSC model 140 0.15046
## 493 CSC model 141 0.15436
## 494 CSC model 142 0.16376
## 495 CSC model 143 0.16558
## 496 CSC model 144 0.16319
## 497 CSC model 145 0.16072
## 498 CSC model 146 0.16072
## 499 CSC model 147 0.16056
## 500 CSC model 148 0.15449
## 501 CSC model 149 0.15449
## 502 CSC model 150 0.15959
## 503 CSC model 151 0.15741
## 504 CSC model 152 0.15741
## 505 CSC model 153 0.14825
## 506 CSC model 154 0.14090
## 507 CSC model 155 0.14090
## 508 CSC model 156 0.14090
## 509 CSC model 157 0.13858
## 510 CSC model 158 0.13631
## 511 CSC model 159 0.13631
## 512 CSC model 160 0.13040
## 513 CSC model 161 0.13040
## 514 CSC model 162 0.13816
## 515 CSC model 163 0.13086
## 516 CSC model 164 0.13086
## 517 CSC model 165 0.13086
## 518 CSC model 166 0.13164
## 519 CSC model 167 0.13683
## 520 CSC model 168 0.13373
## 521 CSC model 169 0.13373
## 522 CSC model 170 0.12685
## 523 CSC model 171 0.12685
## 524 CSC model 172 0.12338
## 525 CSC model 173 0.12338
## 526 CSC model 174 0.12372
## 527 CSC model 175 0.12372
## 528 CSC model 176 0.12372
## 529 CSC model 177 0.13027
## 530 CSC model 178 0.13027
## 531 CSC model 179 0.13027
## 532 CSC model 180 0.13027
## 533 CSC model 181 0.14351
## 534 CSC model 182 0.15017
## 535 CSC model 183 0.15017
## 536 CSC model 184 0.15017
## 537 CSC model 185 0.15017
## 538 CSC model 186 0.16840
## 539 CSC model 187 0.16840
## 540 CSC model 188 0.16840
## 541 CSC model 189 0.16840
## 542 CSC model 190 0.16954
## 543 CSC model 191 0.15779
## 544 CSC model 192 0.16312
## 545 CSC model 193 0.16312
## 546 CSC model 194 0.15315
## 547 CSC model 195 0.15315
## 548 CSC model 196 0.14899
## 549 CSC model 197 0.14428
## 550 CSC model 198 0.14428
## 551 CSC model 199 0.15025
## 552 CSC model 200 0.14889
# 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 39 rows containing missing values or values outside the scale range
## (`geom_line()`).
## Warning: Removed 39 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Warning: Removed 39 rows containing missing values or values outside the scale range
## (`geom_text()`).
IPA = Index of Prediction Accuracy (Índice de Precisión Predictiva)
Es una medida que evalúa qué tan bien un modelo predice el riesgo en el tiempo, y se basa en el Brier score. Brier score: Mide el error cuadrático medio entre:lo que el modelo predice (probabilidad de evento a tiempo t) y lo que realmente ocurrió (valor esperado 0 a 0.12) IPA = 0 → el modelo no mejora al modelo nulo
IPA > 0 → mejora predictiva
IPA = 1 → predicción perfecta
IPA < 0 → peor que no usar modelo 😅
En la práctica:
0.05–0.10 ya puede ser clínicamente relevante
0.15 suele ser buen desempeño
#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.85), 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")
#Interpretamos que año a año la capacidad discriminativa de los modelos se mantiene alta, tanto en CSC como en FGR
# Calibracion global
s <- Score(list("FGR" = modelo_fg),
formula = Hist(dias_out, evento_cica) ~ 1,
data = sob1,
plots = "calibration",
summary = "IPA",
cause = 1)
plotCalibration(s, models = "FGR" )
#altman
edades <- seq(30, 85, by = 1)
new_no <- data.frame(
isq_factor = factor(rep(levels(sob1$isq_factor)[1], length(edades)),
levels = levels(sob1$isq_factor)),
edad = edades,
ede_factor = factor(rep("Sin/local", length(edades)),
levels = levels(sob1$ede_factor))
)
new_si <- new_no
new_si$isq_factor <- factor(rep(levels(sob1$isq_factor)[2], length(edades)),
levels = levels(sob1$isq_factor))
pred_no <- predictRisk(modelo_fg,
newdata = new_no,
times = 180,
cause = 1)
pred_si <- predictRisk(modelo_fg,
newdata = new_si,
times = 180,
cause = 1)
plot(edades, pred_no,
type = "l",
lwd = 3,
xlab = "Edad (años)",
ylab = "Probabilidad de cicatrización a 180 días",
ylim = c(0, max(pred_no, pred_si)),
col = "black")
lines(edades, pred_si,
lwd = 3,
lty = 2,
col = "black")
legend("bottomleft",
legend = c("Sin isquemia/isq leve", "Con isquemia moderada/grave"),
lwd = 3,
lty = c(1,2),
bty = "n")
#ANALISIS DE SENSIBILIDAD
#excluyendo del análisis a los pacientes con herida persistente seguidos 30 días o menos
sob1_menos30 <- sob1 %>%
filter(!(estado_unif == "persiste" & dias_out < 31))
tiempo_evento_s <- Surv(sob1_menos30$dias_out,sob1_menos30$cicat)
#modelo de cox
#Efecto de la isquemia sobre el tiempo a la cicatrización sin eventos competitivos ajustado por edad y edema
cox_model_s <- coxph(tiempo_evento_s ~ isq_factor+ edad + ede_factor , data = sob1_menos30)
summary(cox_model_s)
## Call:
## coxph(formula = tiempo_evento_s ~ isq_factor + edad + ede_factor,
## data = sob1_menos30)
##
## n= 390, number of events= 223
##
## coef exp(coef) se(coef) z Pr(>|z|)
## isq_factorSI -0.71920 0.48714 0.16763 -4.29 0.000018 ***
## edad -0.01613 0.98400 0.00764 -2.11 0.035 *
## ede_factorUnilateral -0.20657 0.81337 0.15254 -1.35 0.176
## ede_factorBilateral -0.15199 0.85899 0.23499 -0.65 0.518
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## isq_factorSI 0.487 2.05 0.351 0.677
## edad 0.984 1.02 0.969 0.999
## ede_factorUnilateral 0.813 1.23 0.603 1.097
## ede_factorBilateral 0.859 1.16 0.542 1.362
##
## Concordance= 0.63 (se = 0.021 )
## Likelihood ratio test= 40.5 on 4 df, p=0.00000003
## Wald test = 37.1 on 4 df, p=0.0000002
## Score (logrank) test = 38.9 on 4 df, p=0.00000007
tab_model(cox_model_s,
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 |
| isq factorSI | 0.49 | 0.08 | 0.00 – Inf | <0.001 |
| edad | 0.98 | 0.01 | 0.00 – Inf | 0.035 |
| ede factor [Unilateral] | 0.81 | 0.12 | 0.00 – Inf | 0.176 |
| ede factorBilateral | 0.86 | 0.20 | 0.00 – Inf | 0.518 |
| Observations | 390 | |||
| R2 Nagelkerke | 0.099 | |||
confint(cox_model_s)
## 2.5 % 97.5 %
## isq_factorSI -1.0478 -0.39065
## edad -0.0311 -0.00115
## ede_factorUnilateral -0.5055 0.09240
## ede_factorBilateral -0.6126 0.30859
#Test de proporcionalidad de riesgos de Schoenfeld
test_ph_s <- cox.zph(cox_model_s)
test_ph_s
## chisq df p
## isq_factor 1.7970 1 0.18
## edad 0.0335 1 0.85
## ede_factor 1.4034 2 0.50
## GLOBAL 3.5787 4 0.47
#Gráficos por variables de residuos de Schoenfeld en el tiempo
ggcoxzph(test_ph_s)
## 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.
## ggtheme is not a valid theme.
## Please use `theme()` to construct themes.
#modelo de Fine and gray
modelo_fg_s <- FGR(
formula = Hist(dias_out, evento_cica) ~ isq_factor + edad+ede_factor
, data = sob1_menos30,
cause = 1 # Aclara que Cicatrizacion es el evento de interés
)
modelo_fg_s
##
## Right-censored response of a competing.risks model
##
## No.Observations: 390
##
## Pattern:
##
## Cause event right.censored
## 1 223 0
## 2 71 0
## unknown 0 96
##
##
## Fine-Gray model: analysis of cause 1
##
## Competing Risks Regression
##
## Call:
## FGR(formula = Hist(dias_out, evento_cica) ~ isq_factor + edad +
## ede_factor, data = sob1_menos30, cause = 1)
##
## coef exp(coef) se(coef) z p-value
## isq_factorSI -0.9733 0.378 0.16798 -5.79 0.0000000069
## edad -0.0173 0.983 0.00771 -2.24 0.0250000000
## ede_factorUnilateral -0.3477 0.706 0.14997 -2.32 0.0200000000
## ede_factorBilateral -0.1990 0.820 0.23122 -0.86 0.3900000000
##
## exp(coef) exp(-coef) 2.5% 97.5%
## isq_factorSI 0.378 2.65 0.272 0.525
## edad 0.983 1.02 0.968 0.998
## ede_factorUnilateral 0.706 1.42 0.526 0.948
## ede_factorBilateral 0.820 1.22 0.521 1.289
##
## Num. cases = 390
## Pseudo Log-likelihood = -1151
## Pseudo likelihood ratio test = 71.2 on 4 df,
##
## Convergence: TRUE
# Calibracion global
ss <- Score(list("FGR" = modelo_fg_s),
formula = Hist(dias_out, evento_cica) ~ 1,
data = sob1_menos30,
plots = "calibration",
summary = "IPA",
cause = 1)
plotCalibration(ss, models = "FGR" )
#Considerando a los pacientes con herida persistente seguidos 30 días o menoscomo TODOS CICATRIZADOS sob1_sens
sob1_sens <- sob1
sob1_sens <- sob1 %>%
mutate(
estado_unif = ifelse(
estado_unif == "persiste" & dias_out < 31,
"cerro_herida",
estado_unif
)
)
table(sob1_sens$estado_unif)
##
## amputacion cerro_herida fallecio persiste
## 57 239 14 96
tiempo_evento_s1 <- Surv(sob1_sens$dias_out,sob1_sens$cicat)
#modelo de cox
#Efecto de la isquemia sobre el tiempo a la cicatrización sin eventos competitivos ajustado por edad y edema
cox_model_s1 <- coxph(tiempo_evento_s1 ~ isq_factor+ edad + ede_factor , data = sob1_sens)
summary(cox_model_s1)
## Call:
## coxph(formula = tiempo_evento_s1 ~ isq_factor + edad + ede_factor,
## data = sob1_sens)
##
## n= 406, number of events= 223
##
## coef exp(coef) se(coef) z Pr(>|z|)
## isq_factorSI -0.71978 0.48686 0.16765 -4.29 0.000018 ***
## edad -0.01610 0.98402 0.00765 -2.11 0.035 *
## ede_factorUnilateral -0.20647 0.81345 0.15253 -1.35 0.176
## ede_factorBilateral -0.15043 0.86034 0.23500 -0.64 0.522
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## isq_factorSI 0.487 2.05 0.351 0.676
## edad 0.984 1.02 0.969 0.999
## ede_factorUnilateral 0.813 1.23 0.603 1.097
## ede_factorBilateral 0.860 1.16 0.543 1.364
##
## Concordance= 0.63 (se = 0.021 )
## Likelihood ratio test= 40.5 on 4 df, p=0.00000003
## Wald test = 37.1 on 4 df, p=0.0000002
## Score (logrank) test = 38.9 on 4 df, p=0.00000007
tab_model(cox_model_s1,
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 |
| isq factorSI | 0.49 | 0.08 | 0.00 – Inf | <0.001 |
| edad | 0.98 | 0.01 | 0.00 – Inf | 0.035 |
| ede factor [Unilateral] | 0.81 | 0.12 | 0.00 – Inf | 0.176 |
| ede factorBilateral | 0.86 | 0.20 | 0.00 – Inf | 0.522 |
| Observations | 406 | |||
| R2 Nagelkerke | 0.095 | |||
confint(cox_model_s1)
## 2.5 % 97.5 %
## isq_factorSI -1.0484 -0.39118
## edad -0.0311 -0.00111
## ede_factorUnilateral -0.5054 0.09249
## ede_factorBilateral -0.6110 0.31016
#Test de proporcionalidad de riesgos de Schoenfeld
test_ph_s1 <- cox.zph(cox_model_s1)
test_ph_s1
## chisq df p
## isq_factor 1.8077 1 0.18
## edad 0.0327 1 0.86
## ede_factor 1.4240 2 0.49
## GLOBAL 3.6145 4 0.46
#Gráficos por variables de residuos de Schoenfeld en el tiempo
ggcoxzph(test_ph_s1)
## 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.
## ggtheme is not a valid theme.
## Please use `theme()` to construct themes.
#evento cica: agrega como cicatrizados a los perdidos
sob1_sens <- sob1_sens %>%
mutate(
evento_cica = ifelse(
sob1$estado_unif == "persiste" & dias_out < 31,
1,
evento_cica
)
)
#modelo de Fine and gray
modelo_fg_s1 <- FGR(
formula = Hist(dias_out, evento_cica) ~ isq_factor + edad+ede_factor
, data = sob1_sens,
cause = 1 # Aclara que Cicatrizacion es el evento de interés
)
modelo_fg_s1
##
## Right-censored response of a competing.risks model
##
## No.Observations: 406
##
## Pattern:
##
## Cause event right.censored
## 1 239 0
## 2 71 0
## unknown 0 96
##
##
## Fine-Gray model: analysis of cause 1
##
## Competing Risks Regression
##
## Call:
## FGR(formula = Hist(dias_out, evento_cica) ~ isq_factor + edad +
## ede_factor, data = sob1_sens, cause = 1)
##
## coef exp(coef) se(coef) z p-value
## isq_factorSI -0.9534 0.385 0.16094 -5.924 0.0000000031
## edad -0.0168 0.983 0.00718 -2.339 0.0190000000
## ede_factorUnilateral -0.3064 0.736 0.14465 -2.118 0.0340000000
## ede_factorBilateral -0.2083 0.812 0.22283 -0.935 0.3500000000
##
## exp(coef) exp(-coef) 2.5% 97.5%
## isq_factorSI 0.385 2.59 0.281 0.528
## edad 0.983 1.02 0.970 0.997
## ede_factorUnilateral 0.736 1.36 0.554 0.977
## ede_factorBilateral 0.812 1.23 0.525 1.257
##
## Num. cases = 406
## Pseudo Log-likelihood = -1247
## Pseudo likelihood ratio test = 72.2 on 4 df,
##
## Convergence: TRUE
# Calibracion global
s1 <- Score(list("FGR" = modelo_fg_s1),
formula = Hist(dias_out, evento_cica) ~ 1,
data = sob1_sens,
plots = "calibration",
summary = "IPA",
cause = 1)
plotCalibration(s1, models = "FGR" )
#Análisis exploratorio sobre el efecto de la isquemia sobre la AM tomando como competitivos muerte y cicatrizacion
#evento_ampu
sob1 <- sob1 %>%
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(sob1$evento_ampu)
##
## 0 1 2
## 112 57 237
tiempo_evento_am <- Surv(sob1$dias_out,sob1$ampu)
#modelo de cox
#Efecto de la isquemia sobre el tiempo a la amputacion
cox_model_a <- coxph(tiempo_evento_am ~ isq_factor+ edad + ede_factor , data = sob1)
summary(cox_model_a)
## Call:
## coxph(formula = tiempo_evento_am ~ isq_factor + edad + ede_factor,
## data = sob1)
##
## n= 406, number of events= 57
##
## coef exp(coef) se(coef) z Pr(>|z|)
## isq_factorSI 1.5974 4.9404 0.3586 4.45 0.0000084 ***
## edad 0.0232 1.0235 0.0138 1.68 0.093 .
## ede_factorUnilateral 0.6092 1.8389 0.2835 2.15 0.032 *
## ede_factorBilateral 0.1648 1.1792 0.4856 0.34 0.734
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## isq_factorSI 4.94 0.202 2.446 9.98
## edad 1.02 0.977 0.996 1.05
## ede_factorUnilateral 1.84 0.544 1.055 3.21
## ede_factorBilateral 1.18 0.848 0.455 3.05
##
## Concordance= 0.737 (se = 0.029 )
## Likelihood ratio test= 42.6 on 4 df, p=0.00000001
## Wald test = 33.9 on 4 df, p=0.0000008
## Score (logrank) test = 41.6 on 4 df, p=0.00000002
tab_model(cox_model_a,
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 |
| isq factorSI | 4.94 | 1.77 | 0.00 – Inf | <0.001 |
| edad | 1.02 | 0.01 | 0.00 – Inf | 0.093 |
| ede factor [Unilateral] | 1.84 | 0.52 | 0.00 – Inf | 0.032 |
| ede factorBilateral | 1.18 | 0.57 | 0.00 – Inf | 0.734 |
| Observations | 406 | |||
| R2 Nagelkerke | 0.125 | |||
confint(cox_model_a)
## 2.5 % 97.5 %
## isq_factorSI 0.89454 2.3003
## edad -0.00385 0.0503
## ede_factorUnilateral 0.05352 1.1648
## ede_factorBilateral -0.78693 1.1165
#Test de proporcionalidad de riesgos de Schoenfeld
test_ph_a <- cox.zph(cox_model_a)
test_ph_a
## chisq df p
## isq_factor 1.568891 1 0.21
## edad 0.000702 1 0.98
## ede_factor 3.858376 2 0.15
## GLOBAL 5.486547 4 0.24
#Gráficos por variables de residuos de Schoenfeld en el tiempo
ggcoxzph(test_ph_a)
## 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.
## ggtheme is not a valid theme.
## Please use `theme()` to construct themes.
#modelo de Fine and gray
modelo_fg_a <- FGR(
formula = Hist(dias_out, evento_ampu) ~ isq_factor + edad+ede_factor
, data = sob1,
cause = 1 # Aclara que Cicatrizacion es el evento de interés
)
modelo_fg_a
##
## Right-censored response of a competing.risks model
##
## No.Observations: 406
##
## Pattern:
##
## Cause event right.censored
## 1 57 0
## 2 237 0
## unknown 0 112
##
##
## Fine-Gray model: analysis of cause 1
##
## Competing Risks Regression
##
## Call:
## FGR(formula = Hist(dias_out, evento_ampu) ~ isq_factor + edad +
## ede_factor, data = sob1, cause = 1)
##
## coef exp(coef) se(coef) z p-value
## isq_factorSI 1.7075 5.52 0.3684 4.635 0.0000036
## edad 0.0213 1.02 0.0115 1.850 0.0640000
## ede_factorUnilateral 0.6072 1.84 0.2865 2.120 0.0340000
## ede_factorBilateral 0.1664 1.18 0.4689 0.355 0.7200000
##
## exp(coef) exp(-coef) 2.5% 97.5%
## isq_factorSI 5.52 0.181 2.679 11.35
## edad 1.02 0.979 0.999 1.04
## ede_factorUnilateral 1.84 0.545 1.047 3.22
## ede_factorBilateral 1.18 0.847 0.471 2.96
##
## Num. cases = 406
## Pseudo Log-likelihood = -310
## Pseudo likelihood ratio test = 47.3 on 4 df,
##
## Convergence: TRUE
# Calibracion global
sa <- Score(list("FGR" = modelo_fg_a),
formula = Hist(dias_out, evento_ampu) ~ 1,
data = sob1,
plots = "calibration",
summary = "IPA",
cause = 1)
plotCalibration(sa, models = "FGR" )
table(sob1$evento_ampu)
##
## 0 1 2
## 112 57 237
#cif
#CIF
cifivhxa <- cuminc(Surv(dias_out, factor(evento_ampu)) ~ isq_factor, data=sob1)
cifivhxa
##
## ── cuminc() ────────────────────────────────────────────────────────────────────
## • Failure type "1"
## strata time n.risk estimate std.error 95% CI
## NO/leve 100 86 0.049 0.014 0.026, 0.082
## NO/leve 200 22 0.049 0.014 0.026, 0.082
## NO/leve 300 3 0.049 0.014 0.026, 0.082
## SI 100 71 0.244 0.034 0.181, 0.312
## SI 200 24 0.283 0.036 0.214, 0.356
## SI 300 8 0.296 0.038 0.224, 0.372
## • Failure type "2"
## strata time n.risk estimate std.error 95% CI
## NO/leve 100 86 0.525 0.034 0.456, 0.590
## NO/leve 200 22 0.769 0.032 0.698, 0.825
## NO/leve 300 3 0.917 0.028 0.842, 0.957
## SI 100 71 0.221 0.034 0.159, 0.290
## SI 200 24 0.448 0.044 0.360, 0.532
## SI 300 8 0.549 0.051 0.445, 0.642
## • Tests
## outcome statistic df p.value
## 1 40.4 1.00 <0.001
## 2 50.8 1.00 <0.001
ggcuminc(
cifivhxa,
outcome = c(1, 2),
linetype_aes = TRUE
) +
scale_color_manual(
name = "Isquemia",
values = c("NO/leve" = "#56B4E9", "SI" = "#E69F00")
) +
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 2 rows containing missing values or values outside the scale range
## (`geom_step()`).
#altman
#altman
edades <- seq(30, 85, by = 1)
new_no_a <- data.frame(
isq_factor = factor(rep(levels(sob1$isq_factor)[1], length(edades)),
levels = levels(sob1$isq_factor)),
edad = edades,
ede_factor = factor(rep("Sin/local", length(edades)),
levels = levels(sob1$ede_factor))
)
new_si_a <- new_no_a
new_si_a$isq_factor <- factor(rep(levels(sob1$isq_factor)[2], length(edades)),
levels = levels(sob1$isq_factor))
pred_no_a <- predictRisk(modelo_fg_a,
newdata = new_no_a,
times = 180,
cause = 1)
pred_si_a <- predictRisk(modelo_fg_a,
newdata = new_si_a,
times = 180,
cause = 1)
plot(edades, pred_no_a,
type = "l",
lwd = 3,
xlab = "Edad (años)",
ylab = "Probabilidad de amputacion a 180 días",
ylim = c(0, max(pred_no_a, pred_si_a)),
col = "black")
lines(edades, pred_si_a,
lwd = 3,
lty = 2,
col = "black")
legend("bottomleft",
legend = c("Sin isquemia/isq leve", "Con isquemia moderada/grave"),
lwd = 3,
lty = c(1,2),
bty = "n")
#Gray test
cuminc_obja <- cmprsk::cuminc(
ftime = sob1$dias_out,
fstatus = sob1$evento_ampu,
group = sob1$isq_factor
)
cuminc_obja
## Tests:
## stat pv df
## 1 40.4 0.00000000020845 1
## 2 50.8 0.00000000000105 1
## Estimates and Variances:
## $est
## 100 200 300
## NO/leve 1 0.0487 0.0487 0.0487
## SI 1 0.2440 0.2833 0.2961
## NO/leve 2 0.5253 0.7688 0.9167
## SI 2 0.2212 0.4480 0.5494
##
## $var
## 100 200 300
## NO/leve 1 0.000207 0.000207 0.000207
## SI 1 0.001141 0.001322 0.001441
## NO/leve 2 0.001165 0.001055 0.000769
## SI 2 0.001148 0.001970 0.002550
#modelo de Fine and gray
table(sob1$infe_factor)
##
## No Leve/Mod Grave
## 86 255 65
table(sob1$evento_cica)
##
## 0 1 2
## 112 223 71
#no se puede hacer fine and gray. voy a hacer un modelo esratificado para la variable infección
sob1_grave <- subset(sob1, infe_factor == "Grave")
sob1_levemod <- subset(sob1, infe_factor == "Leve/Mod")
sob1_sin <- subset(sob1, infe_factor == "No")
#sin infeccion
modelo_fg_sin <- FGR( formula = Hist(dias_out, evento_cica) ~ isq_factor + edad+ede_factor , data = sob1_sin, cause = 1) # Aclara que Cicatrizacion es el evento de interés
modelo_fg_sin
##
## Right-censored response of a competing.risks model
##
## No.Observations: 86
##
## Pattern:
##
## Cause event right.censored
## 1 48 0
## 2 11 0
## unknown 0 27
##
##
## Fine-Gray model: analysis of cause 1
##
## Competing Risks Regression
##
## Call:
## FGR(formula = Hist(dias_out, evento_cica) ~ isq_factor + edad +
## ede_factor, data = sob1_sin, cause = 1)
##
## coef exp(coef) se(coef) z p-value
## isq_factorSI -1.2354 0.291 0.4967 -2.487 0.013
## edad -0.0178 0.982 0.0155 -1.149 0.250
## ede_factorUnilateral 0.0648 1.067 0.4263 0.152 0.880
## ede_factorBilateral -0.3101 0.733 0.3725 -0.832 0.410
##
## exp(coef) exp(-coef) 2.5% 97.5%
## isq_factorSI 0.291 3.440 0.110 0.77
## edad 0.982 1.018 0.953 1.01
## ede_factorUnilateral 1.067 0.937 0.463 2.46
## ede_factorBilateral 0.733 1.364 0.353 1.52
##
## Num. cases = 86
## Pseudo Log-likelihood = -172
## Pseudo likelihood ratio test = 19.4 on 4 df,
##
## Convergence: TRUE
#infeccion leve/mod
modelo_fg_levemod <- FGR( formula = Hist(dias_out, evento_cica) ~ isq_factor + edad+ede_factor , data = sob1_levemod, cause = 1) # Aclara que Cicatrizacion es el evento de interés
modelo_fg_levemod
##
## Right-censored response of a competing.risks model
##
## No.Observations: 255
##
## Pattern:
##
## Cause event right.censored
## 1 147 0
## 2 36 0
## unknown 0 72
##
##
## Fine-Gray model: analysis of cause 1
##
## Competing Risks Regression
##
## Call:
## FGR(formula = Hist(dias_out, evento_cica) ~ isq_factor + edad +
## ede_factor, data = sob1_levemod, cause = 1)
##
## coef exp(coef) se(coef) z p-value
## isq_factorSI -0.9114 0.402 0.18345 -4.968 0.00000068
## edad -0.0145 0.986 0.00925 -1.570 0.12000000
## ede_factorUnilateral 0.0232 1.023 0.18241 0.127 0.90000000
## ede_factorBilateral -0.0382 0.962 0.28301 -0.135 0.89000000
##
## exp(coef) exp(-coef) 2.5% 97.5%
## isq_factorSI 0.402 2.488 0.281 0.576
## edad 0.986 1.015 0.968 1.004
## ede_factorUnilateral 1.023 0.977 0.716 1.463
## ede_factorBilateral 0.962 1.039 0.553 1.676
##
## Num. cases = 255
## Pseudo Log-likelihood = -689
## Pseudo likelihood ratio test = 38 on 4 df,
##
## Convergence: TRUE
#infeccion grave
modelo_fg_grave <- FGR( formula = Hist(dias_out, evento_cica) ~ isq_factor + edad+ede_factor , data = sob1_grave, cause = 1) # Aclara que Cicatrizacion es el evento de interés
modelo_fg_grave
##
## Right-censored response of a competing.risks model
##
## No.Observations: 65
##
## Pattern:
##
## Cause event right.censored
## 1 28 0
## 2 24 0
## unknown 0 13
##
##
## Fine-Gray model: analysis of cause 1
##
## Competing Risks Regression
##
## Call:
## FGR(formula = Hist(dias_out, evento_cica) ~ isq_factor + edad +
## ede_factor, data = sob1_grave, cause = 1)
##
## coef exp(coef) se(coef) z p-value
## isq_factorSI -1.9935 0.136 0.6891 -2.8929 0.00380
## edad -0.0115 0.989 0.0276 -0.4161 0.68000
## ede_factorUnilateral -1.4872 0.226 0.4127 -3.6038 0.00031
## ede_factorBilateral 0.0882 1.092 1.2836 0.0687 0.95000
##
## exp(coef) exp(-coef) 2.5% 97.5%
## isq_factorSI 0.136 7.341 0.0353 0.526
## edad 0.989 1.012 0.9364 1.044
## ede_factorUnilateral 0.226 4.425 0.1007 0.507
## ede_factorBilateral 1.092 0.916 0.0882 13.517
##
## Num. cases = 65
## Pseudo Log-likelihood = -87.9
## Pseudo likelihood ratio test = 27.4 on 4 df,
##
## Convergence: TRUE
#gráficos de cif para cada categoría de infección
#SIN INFECCIÓN
#cif
#CIF
cifivhxasin <- cuminc(Surv(dias_out, factor(evento_cica)) ~ isq_factor, data=sob1_sin)
cifivhxasin
##
## ── cuminc() ────────────────────────────────────────────────────────────────────
## • Failure type "1"
## strata time n.risk estimate std.error 95% CI
## NO/leve 50.0 37 0.295 0.063 0.180, 0.420
## NO/leve 100 25 0.464 0.069 0.326, 0.592
## NO/leve 150 12 0.645 0.071 0.488, 0.765
## NO/leve 200 7 0.709 0.072 0.541, 0.824
## NO/leve 250 4 0.793 0.074 0.599, 0.901
## NO/leve 300 1 0.963 0.089 0.011, 1.00
## SI 50.0 19 0.097 0.054 0.024, 0.232
## SI 100 13 0.210 0.079 0.082, 0.377
## SI 150 10 0.210 0.079 0.082, 0.377
## SI 200 6 0.269 0.095 0.109, 0.460
## SI 250 3 0.269 0.095 0.109, 0.460
## SI 300 2 0.269 0.095 0.109, 0.460
## • Failure type "2"
## strata time n.risk estimate std.error 95% CI
## NO/leve 50.0 37 0.019 0.019 0.001, 0.088
## NO/leve 100 25 0.037 0.026 0.007, 0.114
## NO/leve 150 12 0.037 0.026 0.007, 0.114
## NO/leve 200 7 0.037 0.026 0.007, 0.114
## NO/leve 250 4 0.037 0.026 0.007, 0.114
## NO/leve 300 1 0.037 0.026 0.007, 0.114
## SI 50.0 19 0.233 0.079 0.100, 0.398
## SI 100 13 0.268 0.083 0.124, 0.437
## SI 150 10 0.312 0.090 0.151, 0.488
## SI 200 6 0.312 0.090 0.151, 0.488
## SI 250 3 0.312 0.090 0.151, 0.488
## SI 300 2 0.312 0.090 0.151, 0.488
## • Tests
## outcome statistic df p.value
## 1 15.5 1.00 <0.001
## 2 12.1 1.00 <0.001
ggcuminc(
cifivhxasin,
outcome = c(1, 2),
linetype_aes = TRUE
) +
scale_color_manual(
name = "Isquemia",
values = c("NO/leve" = "#56B4E9", "SI" = "#E69F00")
) +
scale_linetype_manual(
name = "Tipo de evento",
values = c("solid", "dashed"),
labels = c(
"Evento de interes (Cicatrizacion)",
"Evento competitivo (muerte / amputacion)"
)
) +
labs(
x = "Tiempo (dias)",
y = "Incidencia acumulada"
) +
theme_minimal() +
theme(
legend.position = "bottom"
)
## Warning: Removed 4 rows containing missing values or values outside the scale range
## (`geom_step()`).
#INFECCIon leve/mod
#cif
#CIF
cifivhxasleve <- cuminc(Surv(dias_out, factor(evento_cica)) ~ isq_factor, data=sob1_levemod)
cifivhxasleve
##
## ── cuminc() ────────────────────────────────────────────────────────────────────
## • Failure type "1"
## strata time n.risk estimate std.error 95% CI
## NO/leve 100 44 0.574 0.044 0.482, 0.655
## NO/leve 200 8 0.824 0.041 0.727, 0.890
## NO/leve 300 1 0.902 0.054 0.723, 0.968
## SI 100 50 0.210 0.041 0.136, 0.296
## SI 200 13 0.486 0.056 0.373, 0.590
## SI 300 5 0.579 0.060 0.452, 0.687
## • Failure type "2"
## strata time n.risk estimate std.error 95% CI
## NO/leve 100 44 0.051 0.019 0.022, 0.096
## NO/leve 200 8 0.051 0.019 0.022, 0.096
## NO/leve 300 1 0.051 0.019 0.022, 0.096
## SI 100 50 0.231 0.042 0.154, 0.316
## SI 200 13 0.288 0.046 0.202, 0.380
## SI 300 5 0.288 0.046 0.202, 0.380
## • Tests
## outcome statistic df p.value
## 1 37.1 1.00 <0.001
## 2 22.2 1.00 <0.001
ggcuminc(
cifivhxasleve,
outcome = c(1, 2),
linetype_aes = TRUE
) +
scale_color_manual(
name = "Isquemia",
values = c("NO/leve" = "#56B4E9", "SI" = "#E69F00")
) +
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 10 rows containing missing values or values outside the scale range
## (`geom_step()`).
#INFECCIon grave
#cif
#CIF
cifivhxasgrave <- cuminc(Surv(dias_out, factor(evento_cica)) ~ isq_factor, data=sob1_grave)
cifivhxasgrave
##
## ── cuminc() ────────────────────────────────────────────────────────────────────
## • Failure type "1"
## strata time n.risk estimate std.error 95% CI
## NO/leve 50.0 25 0.111 0.053 0.034, 0.239
## NO/leve 100 17 0.283 0.078 0.145, 0.438
## NO/leve 150 12 0.428 0.086 0.260, 0.586
## NO/leve 200 7 0.527 0.089 0.341, 0.683
## NO/leve 250 1 0.734 0.085 0.524, 0.862
## NO/leve 300 1 0.734 0.085 0.524, 0.862
## SI 50.0 16 0.000 0.000 NA, NA
## SI 100 8 0.047 0.048 0.003, 0.203
## SI 150 5 0.164 0.090 0.038, 0.369
## SI 200 5 0.164 0.090 0.038, 0.369
## SI 250 3 0.164 0.090 0.038, 0.369
## SI 300 1 0.320 0.126 0.106, 0.560
## • Failure type "2"
## strata time n.risk estimate std.error 95% CI
## NO/leve 50.0 25 0.194 0.067 0.084, 0.338
## NO/leve 100 17 0.223 0.071 0.103, 0.372
## NO/leve 150 12 0.223 0.071 0.103, 0.372
## NO/leve 200 7 0.223 0.071 0.103, 0.372
## NO/leve 250 1 0.223 0.071 0.103, 0.372
## NO/leve 300 1 0.223 0.071 0.103, 0.372
## SI 50.0 16 0.448 0.095 0.261, 0.619
## SI 100 8 0.485 0.096 0.291, 0.654
## SI 150 5 0.544 0.104 0.324, 0.719
## SI 200 5 0.544 0.104 0.324, 0.719
## SI 250 3 0.602 0.109 0.360, 0.777
## SI 300 1 0.602 0.109 0.360, 0.777
## • Tests
## outcome statistic df p.value
## 1 9.28 1.00 0.002
## 2 8.13 1.00 0.004
ggcuminc(
cifivhxasgrave,
outcome = c(1, 2),
linetype_aes = TRUE
) +
scale_color_manual(
name = "Isquemia",
values = c("NO/leve" = "#56B4E9", "SI" = "#E69F00")
) +
scale_linetype_manual(
name = "Tipo de evento",
values = c("solid", "dashed"),
labels = c(
"Evento de interes (cicatrizacion)",
"Evento competitivo (muerte / amputacion)"
)
) +
labs(
x = "Tiempo (dias)",
y = "Incidencia acumulada"
) +
theme_minimal() +
theme(
legend.position = "bottom"
)
## Warning: Removed 2 rows containing missing values or values outside the scale range
## (`geom_step()`).
#Análisis secundario
table(sob1$isq_factor2)
##
## NO LEVE MODERADA GRAVE
## 206 31 47 122
#Efecto de la isquemia sobre el tiempo a la cicatrización sin eventos competitivos ajustado por edad y edema
cox_modelisq2 <- coxph(tiempo_evento ~ isq_factor2+ edad + ede_factor , data = sob1)
summary(cox_modelisq2)
## Call:
## coxph(formula = tiempo_evento ~ isq_factor2 + edad + ede_factor,
## data = sob1)
##
## n= 406, number of events= 223
##
## coef exp(coef) se(coef) z Pr(>|z|)
## isq_factor2LEVE 0.0302 1.0306 0.2251 0.13 0.89339
## isq_factor2MODERADA -0.7480 0.4733 0.2394 -3.12 0.00178 **
## isq_factor2GRAVE -0.6937 0.4997 0.2008 -3.45 0.00055 ***
## edad -0.0163 0.9838 0.0077 -2.12 0.03421 *
## ede_factorUnilateral -0.2029 0.8163 0.1547 -1.31 0.18953
## ede_factorBilateral -0.1465 0.8638 0.2356 -0.62 0.53413
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## isq_factor2LEVE 1.031 0.97 0.663 1.602
## isq_factor2MODERADA 0.473 2.11 0.296 0.757
## isq_factor2GRAVE 0.500 2.00 0.337 0.741
## edad 0.984 1.02 0.969 0.999
## ede_factorUnilateral 0.816 1.22 0.603 1.105
## ede_factorBilateral 0.864 1.16 0.544 1.371
##
## Concordance= 0.63 (se = 0.021 )
## Likelihood ratio test= 40.6 on 6 df, p=0.0000003
## Wald test = 37.2 on 6 df, p=0.000002
## Score (logrank) test = 39 on 6 df, p=0.0000007
tab_model(cox_modelisq2,
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 |
| isq factor2LEVE | 1.03 | 0.23 | 0.00 – Inf | 0.893 |
| isq factor2MODERADA | 0.47 | 0.11 | 0.00 – Inf | 0.002 |
| isq factor2GRAVE | 0.50 | 0.10 | 0.00 – Inf | 0.001 |
| edad | 0.98 | 0.01 | 0.00 – Inf | 0.034 |
| ede factor [Unilateral] | 0.82 | 0.13 | 0.00 – Inf | 0.190 |
| ede factorBilateral | 0.86 | 0.20 | 0.00 – Inf | 0.534 |
| Observations | 406 | |||
| R2 Nagelkerke | 0.096 | |||
confint(cox_modelisq2)
## 2.5 % 97.5 %
## isq_factor2LEVE -0.4110 0.47135
## isq_factor2MODERADA -1.2172 -0.27882
## isq_factor2GRAVE -1.0872 -0.30013
## edad -0.0314 -0.00121
## ede_factorUnilateral -0.5061 0.10023
## ede_factorBilateral -0.6082 0.31525
#
cifivhxas22 <- cuminc(Surv(dias_out, factor(evento_cica)) ~ isq_factor2, data=sob1)
cifivhxas22
##
## ── cuminc() ────────────────────────────────────────────────────────────────────
## • Failure type "1"
## strata time n.risk estimate std.error 95% CI
## NO 100 73 0.503 0.037 0.429, 0.572
## NO 200 20 0.726 0.036 0.647, 0.790
## NO 300 3 0.875 0.035 0.787, 0.928
## LEVE 100 13 0.478 0.096 0.284, 0.649
## LEVE 200 2 0.858 0.086 0.578, 0.958
## LEVE 300 0 0.968 0.064 0.190, 0.999
## MODERADA 100 22 0.240 0.068 0.122, 0.380
## MODERADA 200 12 0.463 0.083 0.297, 0.613
## MODERADA 300 3 0.636 0.106 0.394, 0.802
## GRAVE 100 49 0.162 0.035 0.100, 0.237
## GRAVE 200 12 0.376 0.053 0.273, 0.479
## GRAVE 300 5 0.442 0.058 0.327, 0.551
## • Failure type "2"
## strata time n.risk estimate std.error 95% CI
## NO 100 73 0.082 0.020 0.049, 0.126
## NO 200 20 0.082 0.020 0.049, 0.126
## NO 300 3 0.082 0.020 0.049, 0.126
## LEVE 100 13 0.032 0.032 0.002, 0.144
## LEVE 200 2 0.032 0.032 0.002, 0.144
## LEVE 300 0 0.032 0.032 0.002, 0.144
## MODERADA 100 22 0.161 0.057 0.069, 0.287
## MODERADA 200 12 0.161 0.057 0.069, 0.287
## MODERADA 300 3 0.161 0.057 0.069, 0.287
## GRAVE 100 49 0.329 0.044 0.246, 0.415
## GRAVE 200 12 0.407 0.048 0.313, 0.498
## GRAVE 300 5 0.426 0.050 0.327, 0.522
## • Tests
## outcome statistic df p.value
## 1 57.7 3.00 <0.001
## 2 53.7 3.00 <0.001
ggcuminc(
cifivhxas22,
outcome = c(1, 2),
linetype_aes = TRUE
) +
scale_color_manual(
name = "Isquemia",
values = c("NO" = "#56B4E9", "LEVE" = "#E69F00", "MODERADA"="#B58", "GRAVE"="#009E73")
) +
scale_linetype_manual(
name = "Tipo de evento",
values = c("solid", "dashed"),
labels = c(
"Evento de interes (cicatrizacion)",
"Evento competitivo (muerte / amputacion)"
)
) +
labs(
x = "Tiempo (dias)",
y = "Incidencia acumulada"
) +
theme_minimal() +
theme(
legend.position = "bottom"
)
## Warning: Removed 34 rows containing missing values or values outside the scale range
## (`geom_step()`).
#Test de proporcionalidad de riesgos de Schoenfeld
test_ph_isq2 <- cox.zph(cox_modelisq2)
test_ph_isq2
## chisq df p
## isq_factor2 3.8524 3 0.28
## edad 0.0327 1 0.86
## ede_factor 1.3943 2 0.50
## GLOBAL 5.6890 6 0.46
#Gráficos por variables de residuos de Schoenfeld en el tiempo
ggcoxzph(test_ph_isq2)
## Warning: ggtheme is not a valid theme.
## Please use `theme()` to construct themes.
## 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.
#modelo de Fine and gray
modelo_fg_isq2 <- FGR(
formula = Hist(dias_out, evento_cica) ~ isq_factor2 + edad+ede_factor
, data = sob1,
cause = 1 # Aclara que Cicatrizacion es el evento de interés
)
modelo_fg_isq2
##
## Right-censored response of a competing.risks model
##
## No.Observations: 406
##
## Pattern:
##
## Cause event right.censored
## 1 223 0
## 2 71 0
## unknown 0 112
##
##
## Fine-Gray model: analysis of cause 1
##
## Competing Risks Regression
##
## Call:
## FGR(formula = Hist(dias_out, evento_cica) ~ isq_factor2 + edad +
## ede_factor, data = sob1, cause = 1)
##
## coef exp(coef) se(coef) z p-value
## isq_factor2LEVE 0.0950 1.100 0.19799 0.480 0.630000000
## isq_factor2MODERADA -0.6968 0.498 0.22574 -3.087 0.002000000
## isq_factor2GRAVE -1.0946 0.335 0.20344 -5.380 0.000000074
## edad -0.0163 0.984 0.00782 -2.082 0.037000000
## ede_factorUnilateral -0.3405 0.711 0.15203 -2.240 0.025000000
## ede_factorBilateral -0.2122 0.809 0.23300 -0.911 0.360000000
##
## exp(coef) exp(-coef) 2.5% 97.5%
## isq_factor2LEVE 1.100 0.909 0.746 1.621
## isq_factor2MODERADA 0.498 2.007 0.320 0.775
## isq_factor2GRAVE 0.335 2.988 0.225 0.499
## edad 0.984 1.016 0.969 0.999
## ede_factorUnilateral 0.711 1.406 0.528 0.958
## ede_factorBilateral 0.809 1.236 0.512 1.277
##
## Num. cases = 406
## Pseudo Log-likelihood = -1150
## Pseudo likelihood ratio test = 73.1 on 6 df,
##
## Convergence: TRUE
# Calibracion global
s_isq2 <- Score(list("FGR" = modelo_fg_isq2),
formula = Hist(dias_out, evento_cica) ~ 1,
data = sob1,
plots = "calibration",
summary = "IPA",
cause = 1)
plotCalibration(s_isq2, models = "FGR" )