Calculadora de SOFA Score en Bases de Datos

Variables

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 safiestá disponible.

double
safi

Índice SAFI (saturación de oxígeno / fracción inspirada de oxígeno) al momento de la sospecha.

Variable opcional si pafi está disponible.

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 glasgow está disponible.

integer
glasgow

Puntaje de Escala Glasgow (3-15)

Variable opcional si rass está disponible.

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.

Código

# 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)
}

Ejemplo de uso

# 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.