Para utilizar la siguiente calculadora se deberá utilizar la función sofa_my_df(df=dataframe)
. El dataframe a ingresar debe tener las siguientes variables.
Variable | Descripción | Tipo |
---|---|---|
arm |
Asistencia respiratoria mecánica (0. No. 1. Sí). | integer |
pafi |
Índice PAFI (presión arterial de oxígeno / fracción inspirada de oxígeno) al momento de la sospecha (mmHg). Variable opcional si |
double |
safi |
Índice SAFI (saturación de oxígeno / fracción inspirada de oxígeno) al momento de la sospecha. Variable opcional si |
double |
creat |
Creatininemia el día de la sospecha (mg/dL) | double |
bb |
Bilirrubinemia el día de la sospecha (mg/dL) | double |
plt |
Plaquetas en sangre el día de la sospecha (x 10^9/L) | double |
tam |
Tensión arterial media al momento de la sospecha (mmHg) | double |
flu_urin |
Diuresis en las últimas 24hs (ml/día) | double |
rass |
Puntaje de Escala RASS (-5 a +5) Variable opcional si |
integer |
glasgow |
Puntaje de Escala Glasgow (3-15) Variable opcional si |
integer |
dobu |
Uso de dobutamina en la hora previa a la sospecha (0. No. 1. Sí). | integer |
dopa |
Dosis de dopamina en la hora previa a la sospecha (ug/kg/min) | double |
nepi |
Dosis de norepinefrina en la hora previa a la sospecha (ug/kg/min) | double |
Los datos que no se encuentren disponibles deben encontrarse como NA
explícito.
La función devolverá el dataframe ingresado con la columna sofa
y el resultado.
# SOFA Respiratorio -------------------------------------------------------
sofa_score_resp <- function(pafi, arm, safi) {
if ((is.na(pafi) & is.na(safi)) | is.na(arm)) {stop("Faltan variables respiratorias")}
if (is.na(safi)) {
if (pafi<= 100 & arm==1) {resp <- 4
} else if (pafi<= 200 & pafi >100 & arm==1) {resp <- 3
} else if (pafi<= 300) {resp <- 2
} else if (pafi<= 400 & pafi >300) {resp <- 1
} else if (pafi>400) {resp <- 0
}
} else {
if (safi<= 66 & arm==1) {resp <- 4
} else if (safi<= 141 & safi >66 & arm==1) {resp <- 3
} else if (safi<= 220) {resp <- 2
} else if (safi<= 301 & safi >220) {resp <- 1
} else if (safi>301) {resp <- 0
}
}
return(resp)
}
# SOFA Hepato -------------------------------------------------------------
sofa_score_hep <- function(bb) {
if (is.na(bb)) {stop("Faltan variables hepáticas")}
if (bb<1.2) {hep <- 0
} else if (bb >= 1.2 & bb <2) {hep <- 1
} else if (bb >= 2 & bb <6) {hep <- 2
} else if (bb >= 6 & bb <12) {hep <- 3
} else if (bb >=12) {hep <- 4
}
return(hep)
}
# SOFA Hemato -------------------------------------------------------------
sofa_score_hem <- function(plt) {
if (is.na(plt)) {
stop("Faltan variables hematológicas")
}
if (plt >150) {hem <- 0
} else if (plt <=150 & plt >100) {hem <- 1
} else if (plt <=100 & plt >50) {hem <- 2
} else if (plt <=50 & plt >20) {hem <- 3
} else if (plt <=20 & !is.na(plt)) {hem <- 4
}
return(hem)
}
# SOFA Neuro --------------------------------------------------------------
sofa_score_neur <- function(glasgow, rass) {
if (!is.na(glasgow)) {
if (glasgow==15) {neur <- 0
} else if (glasgow <15 & glasgow >= 13) {neur <- 1
} else if (glasgow <13 & glasgow>= 10) {neur <- 2
} else if (glasgow <10 & glasgow>= 6) {neur <- 3
} else if (glasgow <6 & glasgow>=3) {neur <- 4
}
} else {
if(!is.na(rass)) {
if (rass>=0) {neur <- 0
} else if (rass == -1) {neur <- 1
} else if (rass == -2) {neur <- 2
} else if (rass == -3) {neur <-3
} else if (rass <=-4) {neur <- 4
}
} else {stop("Faltan variables neurológicas")}
}
return(neur)
}
# SOFA Renal --------------------------------------------------------------
sofa_score_renal <- function(creat, flu_urin) {
if (!is.na(flu_urin)) {
if (flu_urin<200) {
renal <- 4
flu_urin_uso <- TRUE
} else if (flu_urin<500 & flu_urin>=200) {
renal <- 3
flu_urin_uso <- TRUE
} else {flu_urin_uso <- FALSE}
} else {flu_urin_uso <- FALSE}
if (!is.na(creat)) {
if (creat >=5) {renal <- 4
} else if (!flu_urin_uso & creat >= 3.5 & creat <5) {renal <- 3
} else if (!flu_urin_uso & creat >= 2 & creat <3.5) {renal <- 2
} else if (!flu_urin_uso & creat >= 1.2 & creat <2) {renal <- 1
} else if (!flu_urin_uso & creat<1.2) {renal <- 0
}
} else {stop("Faltan variables renales")}
return(renal)
}
# SOFA Cardio -------------------------------------------------------------
sofa_score_cardio <- function(tam, dobu, dopa, nepi) {
if (is.na(tam)) {stop("Faltan variables hemodinámicas")}
if (tam<70) {cardio <- 1
} else {cardio <- 0}
if (!is.na(dobu)) {
if (dobu==1) {cardio <- 2}
}
if (!is.na(dopa)) {
if (dopa>15) {cardio <- 4}
else if (dopa>5 & dopa<=15) {cardio <- 3}
else if (dopa<=5 & dopa>0) {cardio <- 2}
}
if (!is.na(nepi)) {
if (nepi>0.1) {cardio <- 4}
else if (nepi <= 0.1 & nepi>0) {cardio <- 3}
}
return(cardio)
}
# SOFA Score --------------------------------------------------------------
calc_sofa_score <- function(pafi=NA, # PaO2/FIO2 en mmHg
arm=NA, # Asistencia respiratoria mecánica (0 No 1 si)
safi=NA,
glasgow=NA,
rass=NA, # RASS en paciente sedado
plt=NA, # 10^3/mm3
bb=NA, # en mg/dL
creat=NA, # en mg/dL
flu_urin=NA, # en mL/diaa
tam=NA, # Tension arterial media en mmHg
dobu=NA, # Uso de vasoactivos al menos 1h para mantener PAM>65
dopa=NA, # en mcg/kg/min
nepi=NA # en mcg/kg/min,
) {
sofa_score <- sofa_score_resp(pafi, arm, safi) +
sofa_score_neur(glasgow, rass) +
sofa_score_hem(plt) +
sofa_score_hep(bb) +
sofa_score_renal(creat, flu_urin) +
sofa_score_cardio(tam, dobu, dopa, nepi)
return(as.integer(sofa_score))
}
sofa_my_df <- function(df) {
selector <- c("pafi","arm","safi","glasgow","rass","plt","bb","creat","flu_urin","tam","dobu","dopa","nepi")
df$sofa <- NA
df["sofa"] <- as.integer(unlist(df["sofa"]))
for (i in 1:nrow(df)) {
if (is.na(df[i,"pafi"]) & is.na(df[i,"safi"])) {
next
} else {
arg_list <- as.list(df[i,selector])
df[i,"sofa"] <- do.call(calc_sofa_score, arg_list)
}
}
return(df)
}
# Example
my_example_df <- structure(list(id = c(1, 2, 3, 4, 5, 6, 7), pafi = c(416, 195.8,
141, 113, 167.14, 231, 126.15), safi = c(NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), creat = c(3.24,
1.05, 1.34, 1.39, 0.82, 1.14, 0.88), bb = c(5, 1, 1.9, 1, 1,
1, 1), plt = c(25, 68, 126, 190, 26.2, 285, 238), tam = c(89,
78, 50, 49, 85, 60, 71), flu_urin = c(1655, 3480, 75, 504, 2575,
615, 2710), rass = c(-5, 0, -5, NA, -1, -1, 5), glasgow = c(NA,
NA, NA, 15, NA, NA, NA), dobu = c(0, 0, 0, 1, 0, 0, 0), dopa = c(0,
0, 0, 0, 0, 0, 0), nepi = c(0, 0, 40, 1.15, 0, 2.27, 0), arm = c(1,
0, 1, 0, 1, 0, 1)), row.names = c(NA, -7L), class = c("tbl_df",
"tbl", "data.frame"))
# Run Function
sofa_my_df(my_example_df)
## id pafi safi creat bb plt tam flu_urin rass glasgow dobu dopa nepi arm
## 1 1 416.00 NA 3.24 5.0 25.0 89 1655 -5 NA 0 0 0.00 1
## 2 2 195.80 NA 1.05 1.0 68.0 78 3480 0 NA 0 0 0.00 0
## 3 3 141.00 NA 1.34 1.9 126.0 50 75 -5 NA 0 0 40.00 1
## 4 4 113.00 NA 1.39 1.0 190.0 49 504 NA 15 1 0 1.15 0
## 5 5 167.14 NA 0.82 1.0 26.2 85 2575 -1 NA 0 0 0.00 1
## 6 6 231.00 NA 1.14 1.0 285.0 60 615 -1 NA 0 0 2.27 0
## 7 7 126.15 NA 0.88 1.0 238.0 71 2710 5 NA 0 0 0.00 1
## sofa
## 1 11
## 2 4
## 3 17
## 4 7
## 5 7
## 6 7
## 7 3
La equivalencia entre Glasgow y RASS fue realizada de acuerdo al artíuclo de Viglino D, Maignan M, Debaty G. A modified Sequential Organ Failure Assessment score using the Richmond Agitation-Sedation Scale in critically ill patients. J Thorac Dis. marzo de 2016;8(3):311-3.