1 Descripción

En este documento -v1.1- nos enfocaremos en presentar, revisar y aplicar los métodos estadísticos de la publicación: “A Randomized Comparison Between the Pentax AWS Video Laryngoscope and the Macintosh Laryngoscope in Morbidly Obese Patients”, ver aquí artículo, publicado en ANESTHESIA & ANALGESIA (2011), revista oficial de la International Anesthesia Research Society.

Nuestro propósito principal es brindar apoyo en la aplicación de la modelación estadística a profesionistas y estudiantes de ciencias biológicas y de la salud, para ello, emplearemos este ejemplo de ensayos clínicos. Es deseable que los lectores cuenten con un conocimiento básico de estadística descriptiva, estadística inferencial, y de investigación. Presentaremos los conceptos, tanto estadísticos como de salud, de manera accesible.

Otro de nuestros propósitos es fomentar la utilización del software libre R como herramienta para llevar a cabo el análisis estadístico en ciencias de la salud. Para ello, se presentarán los métodos, técnicas y ejemplos relevantes que permitan a los lectores comprender cómo utilizar dicha herramienta. Aunque se asume cierta familiaridad con los conceptos estadísticos, se proporcionará una orientación paso a paso para la adecuada comprensión y aplicación.

Es importante precisar que este documento NO ES UN TRABAJO EXHAUSTIVO de aplicación estadística ni de ciencias de la salud y, sólo promueve la divulgación educativa para adentrase en las aplicaciones estadísticas y fue producto de colaboración de los autores en el marco de las estancias de verano 2023 que organiza CIMAT. Para correcciones, contribuciones y trabajos especializados (o con mayor rigor estadístico) favor de ponerse en contacto con el autor de correspondencia.

A continuación, presentaremos el contexto y los generales relevantes de la publicación que vamos a trabajar.

2 Introducción

La proporción de pacientes obesos y con obesidad mórbida está aumentando rápidamente en todo el mundo. Se conoce que en estos pacientes la intubación traqueal puede presentar mayor dificultad debido al espacio reducido y la limitación orofaríngea, misma que provoca una visualización inadecuada.(1) Las intubaciones traqueales difíciles y fallidas en estos pacientes se encuentran entre las principales causas de mortalidad y morbilidad relacionadas con la anestesia.(2)

Los especialistas en el área de la salud saben que una buena visión laríngea facilita la intubación traqueal y, por ello, se han introducido nuevas tecnologías para mejorar la visualización. Los videolaringoscopios, como Pentax AWS, suelen utilizar cámaras en miniatura para facilitar la visualización de la laringe.

El Pentax AWS (Figura 2.1) es un novedoso videolaringoscopio, disponible en Japón desde 2006, diseñado para facilitar la intubación proporcionando una imagen de vídeo de la glotis. Incorpora una cámara de vídeo en miniatura y un monitor LCD integrado alimentado por pilas con una cuchilla desechable que se acopla al sistema de base y, la incorporación de una pantalla LCD permite ver la glotis simultáneamente a la inserción del tubo endotraqueal. En este sentido, se diferencia de otros videolaringoscopios, los cuales utilizan monitores externos. El Pentax AWS también difiere en tener un canal lateral que posiciona la guía al tubo endotraqueal. Diversos estudios sugieren que este video-laringoscopio puede ayudar a intubar de mejor forma, pero los estudios aún siguen siendo escasos.(3) El método convencional para realizar laringoscopia ha sido con el laringoscopio Macintosh estándar con hoja nº4 (Figura 2.2). Siendo la principal diferencia no tener una cámara de video integrada como el Pentax AWS.(4)

Pentax AWS

Figure 2.1: Pentax AWS

Macintosh estándar

Figure 2.2: Macintosh estándar

2.1 Hipótesis de investigación

La intubación con Pentax AWS tiene mayor eficacia y rapidez comparada con el dispositivo Macintosh estándar.

2.2 Población de estudio

Pacientes con obesidad mórbida (índice de masa corporal entre 30 y 50 kg/\(x^{2}\)) que requerían intubación orotraqueal para cirugía electiva.

2.3 Diseño

Ensayo clínico aleatorizado de dos brazos (grupos). La aleatorización fue con números aleatorios generados por computadora y la asignación de grupos fue ciega.

En todos los casos, la cabeza del paciente se colocó en posición neutral sobre una almohada de espuma “donut” y el laringoscopista era libre de manipular la cabeza según fuera necesario para obtener la mejor vista posible.

Todas las tráqueas de los pacientes fueron intubadas por 1 de 2 anestesiólogos asistentes, cada uno de los cuales había utilizado previamente el Pentax AWS de 5 a 10 veces antes de comenzar el estudio.

2.4 Experimento

El estudio comienza con la administración de oxígeno y la inducción de la anestesia general en los pacientes para después asignarlos al azar a la técnica de intubación, ya sea Macintosh (n = 49) o el Pentax AWS (n = 50).

De 105 pacientes incluidos, cuatro no completaron el estudio por cancelación de cirugía o porque el anestesiólogo no pudo llegar al quirófano a tiempo, y dos pacientes del grupo Pentax AWS tuvieron resultados primarios faltantes. Por lo tanto, los datos están disponibles sólo para 99 pacientes.

2.5 Procedimientos

En los siguientes videos, se muestra la intubación de pacientes.

Para el que corresponde al laringoscopio Macintosh ver: https://www.youtube.com/watch?v=4b0M3zJcQ2A

3 Objetivos de nuestra publicación

  • Presentar y aplicar comprensivamente la modelación estadística para la comparación del método Pentax AWS y Macintosh en pacientes con obesidad mórbida.

  • Contrastar los resultados estadísticos obtenidos en el presente documento versus los obtenidos en la publicación.

  • Presentar el desarrollo y programación de los métodos estadísticos usando R.

4 Materiales

4.1 Instalación y activación de librerías

### Instalación

list.of.packages <- c("medicaldata", "Hmisc", "janitor","dplyr","ggplot2","cowplot","gmodels","rstatix","psych",
                      "RColorBrewer","ggpubr","car","stats", "corrplot", "tidyverse","MVN","DescTools",
                      "broom","survival", "survminer","vembedr", "kableExtra", "gtsummary", "forcats",
                      "MASS","smd")

new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
if(length(new.packages)) install.packages(new.packages)
### Activación

# Manejo de datos

library(dplyr)
library(Hmisc)
library(janitor)
library(gmodels)
library(rstatix)
library(car)
library(stats)
library(tidyverse)
library(MVN)
library(DescTools)
library(broom)
library(survival)
library(survminer)
library(forcats)
library(MASS)
library(smd)

# Visualización de datos

library(ggplot2)
library(cowplot)
library(psych)
library(RColorBrewer)
library(ggpubr)
library(corrplot)
library(gtsummary)

# Incrustar videos de youtube
library(vembedr)

# Manejo de tablas
library(kableExtra)

# Creación de Rmarkdown
library(rmarkdown) 

# Bases de datos (BD)
library(medicaldata)

4.2 Base de datos: Laringoscopia

La información se encuentra disponible en la paquetería medicaldata de R. Una vez instalada y activada esta librería se puede cargar la base de datos (BD) como se muestra a continuación.

data(laryngoscope, package="medicaldata" )
names(laryngoscope) #Muestra los nombres de las variables en la BD original
#>  [1] "age"                      "gender"                  
#>  [3] "asa"                      "BMI"                     
#>  [5] "Mallampati"               "Randomization"           
#>  [7] "attempt1_time"            "attempt1_S_F"            
#>  [9] "attempt2_time"            "attempt2_assigned_method"
#> [11] "attempt2_S_F"             "attempt3_time"           
#> [13] "attempt3_assigned_method" "attempt3_S_F"            
#> [15] "attempts"                 "failures"                
#> [17] "total_intubation_time"    "intubation_overall_S_F"  
#> [19] "bleeding"                 "ease"                    
#> [21] "sore_throat"              "view"

4.3 Gestión de datos

4.3.1 Etiquetado de variables

Utilizaremos la función rename() para renombrar las variables, utilizar la siguiente estructura: “nuevo nombre” = “nombre antiguo”.

laringoscopia <- rename(laryngoscope, 
                 Edad = age, Sexo = gender, Estado_fisico = asa, 
                 IMC = BMI, Mallampati = Mallampati, Grupo = Randomization, 
                 Tiempo_total_intubacion = total_intubation_time,  Num_intentos = attempts, Nivel_dificultad = ease, 
                 Tiempo_1_intento = attempt1_time, Exito_1_intento = attempt1_S_F, 
                 Tiempo_2_intento = attempt2_time, Exito_2_intento = attempt2_S_F,
                 Metodo_2_intento = attempt2_assigned_method, Tiempo_3_intento = attempt3_time, 
                 Metodo_3_intento = attempt3_assigned_method, Exito_3_intento = attempt3_S_F, 
                 Fracasos = failures, Exito_intubacion = intubation_overall_S_F, 
                 Sangrado = bleeding, Dolor_garganta = sore_throat, Vista_glotis = view)

4.3.2 Tratamiento de variables

Es importante definir los tipos de variables que se utilizarán en el análisis estadístico. En esta parte se utiliza la función factor() en la cual se indican las variables que serán declaradas como factores, sus niveles y las etiquetas de los niveles.

# Factores del estudio

laringoscopia$Sexo <- factor(laringoscopia$Sexo, levels = c(0,1), labels = c("Femenino","Masculino"))

laringoscopia$Grupo <- factor(laringoscopia$Grupo, levels = c(0,1), labels = c("Macintosh","Pentax_AWS"))

laringoscopia$Estado_fisico <- factor(laringoscopia$Estado_fisico, levels = c(2,3,4), labels = c("II","III","IV"))

laringoscopia$Exito_1_intento <- factor(laringoscopia$Exito_1_intento, levels = c(0,1), labels = c("No","Si"))

laringoscopia$Exito_2_intento  <- factor(laringoscopia$Exito_2_intento , levels = c(0,1), labels = c("No","Si"))

laringoscopia$Exito_3_intento <- factor(laringoscopia$Exito_3_intento, levels = c(0,1), labels = c("No","Si"))

laringoscopia$Fracasos <- factor(laringoscopia$Fracasos, levels = c(1,2,3), labels = c("1","2","3"))

laringoscopia$Exito_intubacion <- factor(laringoscopia$Exito_intubacion, levels = c(0,1), labels= c("No","Si"))

laringoscopia$Sangrado  <- factor(laringoscopia$Sangrado , levels = c(0,1), labels = c("No","Si"))

laringoscopia$Dolor_garganta  <- factor(laringoscopia$Dolor_garganta , levels = c(0,1,2,3), labels = c("Ninguno","Leve","Moderado","Severo"))

laringoscopia$Vista_glotis  <- factor(laringoscopia$Vista_glotis , levels = c(0,1), labels = c("Malo","Bueno"))

laringoscopia$Metodo_2_intento <- factor(laringoscopia$Metodo_2_intento, levels = c(0,1), labels = c("No","Si"))

laringoscopia$Metodo_3_intento <- factor(laringoscopia$Metodo_3_intento, levels = c(0,1), labels = c("No","Si"))

** Primeros 10 pacientes **

head(laringoscopia,10)
#>    Edad     Sexo Estado_fisico   IMC Mallampati     Grupo Tiempo_1_intento
#> 1    51 Femenino           III 56.20          1 Macintosh            29.00
#> 2    52 Femenino           III 44.60          2 Macintosh            29.00
#> 3    37 Femenino           III 41.60          1 Macintosh            31.00
#> 4    20 Femenino           III 46.32          2 Macintosh            31.00
#> 5    35 Femenino           III 61.00          2 Macintosh            21.00
#> 6    39 Femenino           III 44.00          2 Macintosh            10.00
#> 7    52 Femenino           III 44.00          2 Macintosh            13.00
#> 8    59 Femenino           III 41.90          2 Macintosh            23.00
#> 9    32 Femenino           III 47.00          1 Macintosh            15.00
#> 10   24 Femenino           III 45.00          1 Macintosh             8.96
#>    Exito_1_intento Tiempo_2_intento Metodo_2_intento Exito_2_intento
#> 1               Si               NA             <NA>            <NA>
#> 2               Si               NA             <NA>            <NA>
#> 3               No               60               Si              Si
#> 4               No               46               Si              Si
#> 5               Si               NA             <NA>            <NA>
#> 6               Si               NA             <NA>            <NA>
#> 7               Si               NA             <NA>            <NA>
#> 8               Si               NA             <NA>            <NA>
#> 9               Si               NA             <NA>            <NA>
#> 10              Si               NA             <NA>            <NA>
#>    Tiempo_3_intento Metodo_3_intento Exito_3_intento Num_intentos Fracasos
#> 1                NA             <NA>            <NA>            1     <NA>
#> 2                NA             <NA>            <NA>            1     <NA>
#> 3                NA             <NA>            <NA>            2        1
#> 4                NA             <NA>            <NA>            2        1
#> 5                NA             <NA>            <NA>            1     <NA>
#> 6                NA             <NA>            <NA>            1     <NA>
#> 7                NA             <NA>            <NA>            1     <NA>
#> 8                NA             <NA>            <NA>            1     <NA>
#> 9                NA             <NA>            <NA>            1     <NA>
#> 10               NA             <NA>            <NA>            1     <NA>
#>    Tiempo_total_intubacion Exito_intubacion Sangrado Nivel_dificultad
#> 1                    29.00               Si       No                5
#> 2                    29.00               Si       No               20
#> 3                    91.00               Si       No               80
#> 4                    77.00               Si       No               80
#> 5                    21.00               Si       No               20
#> 6                    10.00               Si       No                2
#> 7                    13.00               Si       No               10
#> 8                    23.00               Si       No               60
#> 9                    15.00               Si       No               15
#> 10                    8.96               Si       No                0
#>    Dolor_garganta Vista_glotis
#> 1         Ninguno        Bueno
#> 2         Ninguno        Bueno
#> 3         Ninguno         Malo
#> 4            <NA>         Malo
#> 5         Ninguno        Bueno
#> 6         Ninguno        Bueno
#> 7            Leve        Bueno
#> 8         Ninguno        Bueno
#> 9        Moderado        Bueno
#> 10           Leve        Bueno

** Últimos 10 pacientes **

tail(laringoscopia,10)
#>    Edad      Sexo Estado_fisico   IMC Mallampati      Grupo Tiempo_1_intento
#> 90   52  Femenino            II 44.20          1 Pentax_AWS               49
#> 91   72  Femenino           III 41.00          2 Pentax_AWS               30
#> 92   52  Femenino            II 34.10          2 Pentax_AWS               36
#> 93   58  Femenino           III    NA          1 Pentax_AWS               35
#> 94   49 Masculino           III 41.41          2 Pentax_AWS               47
#> 95   58 Masculino           III    NA          4 Pentax_AWS               49
#> 96   51  Femenino            II 41.10          1 Pentax_AWS               29
#> 97   59 Masculino           III 40.00          1 Pentax_AWS               29
#> 98   58  Femenino           III 34.09          1 Pentax_AWS               41
#> 99   52 Masculino            II 36.81          3 Pentax_AWS               34
#>    Exito_1_intento Tiempo_2_intento Metodo_2_intento Exito_2_intento
#> 90              No               49               Si              No
#> 91              Si               NA             <NA>            <NA>
#> 92              Si               NA             <NA>            <NA>
#> 93              Si               NA             <NA>            <NA>
#> 94              Si               NA             <NA>            <NA>
#> 95              Si               NA             <NA>            <NA>
#> 96              Si               NA             <NA>            <NA>
#> 97              No               27               Si              Si
#> 98              No               49               Si              Si
#> 99              Si               NA             <NA>            <NA>
#>    Tiempo_3_intento Metodo_3_intento Exito_3_intento Num_intentos Fracasos
#> 90               30               No              Si            3        2
#> 91               NA             <NA>            <NA>            1     <NA>
#> 92               NA             <NA>            <NA>            1     <NA>
#> 93               NA             <NA>            <NA>            1     <NA>
#> 94               NA             <NA>            <NA>            1     <NA>
#> 95               NA             <NA>            <NA>            1     <NA>
#> 96               NA             <NA>            <NA>            1     <NA>
#> 97               NA             <NA>            <NA>            2        1
#> 98               NA             <NA>            <NA>            2        1
#> 99               NA             <NA>            <NA>            1     <NA>
#>    Tiempo_total_intubacion Exito_intubacion Sangrado Nivel_dificultad
#> 90                      98               No       No              100
#> 91                      30               Si       No               40
#> 92                      36               Si       No               25
#> 93                      35               Si       No               20
#> 94                      47               Si       No               30
#> 95                      49               Si       No               85
#> 96                      29               Si       No               15
#> 97                      56               Si       No               55
#> 98                      90               Si       No               90
#> 99                      34               Si       No               15
#>    Dolor_garganta Vista_glotis
#> 90       Moderado        Bueno
#> 91        Ninguno        Bueno
#> 92        Ninguno        Bueno
#> 93        Ninguno        Bueno
#> 94       Moderado        Bueno
#> 95        Ninguno         Malo
#> 96        Ninguno        Bueno
#> 97        Ninguno        Bueno
#> 98       Moderado         Malo
#> 99        Ninguno        Bueno

NOTA IMPORTANTE. Para la reproducción de los resultados del artículo se utilizará la BD original y no la transformada. A continuación, presentamos paso a paso el análisis estadístico y el manejo del software R.

5 Tabla basal o de referencia

La función tbl_summary() calcula estadísticas descriptivas para variables continuas, categóricas y dicotómicas. Presentamos los resultados en una tabla de resumen personalizada lista para su publicación. (5)

En la tabla 1 se inspeccionan las variables iniciales del estudio con el propósito de evaluar la homogeneidad entre los grupos de tratamiento (Balance o pareo). Se calcula la diferencia entre Pentax AWX y Macintosh en la media o proporción según corresponda a la variable y se calcula también el intervalo de confianza al 95% y el valor p para la diferencia estandarizada.


tabla1 <-  medicaldata::laryngoscope %>%
  
  # Selección de las variables
  
  select("Randomization", "age", "gender", "BMI",  "asa", "Mallampati") %>%
  
  # Cambiar nombres de los niveles del grupo de tratamiento
  
  mutate(Randomization = factor(Randomization, labels = c("Macintosh", "Pentax_AWS"))) %>%
  
  # Cambiar orden de los niveles del grupo de tratamiento
  
  mutate(Randomization = fct_relevel(Randomization, "Pentax_AWS", "Macintosh")) %>%
  
  # Tabla de estadísticas descriptivas
  
  tbl_summary(by = Randomization,                                   
              missing = "no",                               
              statistic = list(c("age", "BMI") ~ "{mean} ({sd})",
                               c("asa", "Mallampati", "gender") ~ "{n} ({p}%)")) %>%  
  
  # Diferencia estandarizada por grupo
  
  add_difference(test = list(all_continuous() ~ "smd",
                             all_categorical() ~ "smd")) %>%
  
  # Mostrar los nombres de las etiquetas de los niveles en cursiva
  
  italicize_levels() %>%                                    
  
  # Cambio de encabezado arriba de las columnas de los grupos
  
  modify_spanning_header(c("stat_1", "stat_2") ~ "*Grupos:*") %>%
  
  # Cambio del encabezado de la columna de las variables 
  
  modify_header(label = "*Característica*") %>% 
  
  # Titulo de la tabla

  modify_caption("Distribución de características demográficas y clínicas de los pacientes.") %>% 
  
  # Etiquetas de columnas y renglones en negritas
  
  bold_labels() 

tabla1
(\#tab:tabla1)Distribución de características demográficas y clínicas de los pacientes.
Característica
Grupos:
Difference2 95% CI2,3
Pentax_AWS
N = 50
1
Macintosh
N = 49
1
age 50 (12) 49 (14) 0.14 -0.26, 0.53
gender 11 (22%) 10 (20%) 0.04 -0.36, 0.43
BMI 41.4 (4.4) 42.5 (5.9) -0.21 -0.61, 0.19
asa

-0.28 -0.68, 0.11
    2 15 (30%) 7 (14%)

    3 32 (64%) 40 (82%)

    4 3 (6.0%) 2 (4.1%)

Mallampati

-0.12 -0.51, 0.28
    1 21 (42%) 14 (29%)

    2 18 (36%) 21 (44%)

    3 7 (14%) 13 (27%)

    4 4 (8.0%) 0 (0%)

1 Mean (SD); n (%)
2 Standardized Mean Difference
3 CI = Confidence Interval

6 Análisis estadístico

Iniciamos con el análisis exploratorio (AE) de las variables respuesta o resultado: Tiempo total de intubación (variable primaria) y las variables secundarias: número de intentos y el grado de dificultad; posteriormente, estudiamos el balanceo de los brazos: Pentax AWS Vs Macintosh (grupos aleatorizados). El balanceo, también conocido como pareo, fue evaluado con la diferencia estandarizada (i.e., diferencia en medias o proporciones divididas por la desviación estándar combinada). Cualquier covariable con diferencia estandarizada mayor a 0.25 (en valor absoluto) fue ajustada en el análisis, a menos que se especifique lo contrario.

El tiempo total de la intubación fue definido como el tiempo desde el inicio del primer intento de inserción del laringoscopio hasta obtener una señal del capnograma, dentro del código se puede encontrar dicha variable como: total_intubation_time. Si un intento con el dispositivo asignado fallaba, entonces otro intento u otra técnica se ensayaba y fue registrado en las variables attempt2_S_F y attempt3_S_F. La intubación usando el método asignado dentro de los 100 segundos, independientemente del número de intentos, se consideró exitoso y fue registrado en la variable: intubation_overall_S_F.

Para los pacientes que cambiaron al otro método o cuyas tráqueas fueron entubadas en un tiempo mayor a 100 segundos, la intubación fue censurada (i.e., el tiempo total de intubación no ocurrió) y fue almacenada en la variable: failures.

La vista de la glotis para cada laringoscopia fue evaluada utilizando el sistema de calificación Cormack-Lehane (variable: view). La dificultad o facilidad de la intubación traqueal se registró en una escala de Likert (0 = extremadamente fácil a 100 = extremadamente difícil) en la variable: ease, la presencia de manchas de sangre fue registrada en la variable: bleeding (0 = no y 1 = si), y para la gravedad de cualquier dolor de garganta postoperatorio ( variable: sore_throat) se registró con una escala likert (0 = ninguna, 1 = baja , 2 = moderada y 3 = severa).

Empleamos la función attach() para un manejo simple de variables usando sus nombres únicamente:

attach(laryngoscope)

La función str() proporciona una visión detallada de la estructura de la base de datos, permitiendo identificar el tipo de dato asociado a cada variable y nos ayuda a vislumbrar el tipo de análisis estadístico según el tipo de dato.

# Estructura de los datos
str(laryngoscope)
#> 'data.frame':    99 obs. of  22 variables:
#>  $ age                     : num  51 52 37 20 35 39 52 59 32 24 ...
#>  $ gender                  : num  0 0 0 0 0 0 0 0 0 0 ...
#>  $ asa                     : num  3 3 3 3 3 3 3 3 3 3 ...
#>  $ BMI                     : num  56.2 44.6 41.6 46.3 61 ...
#>  $ Mallampati              : num  1 2 1 2 2 2 2 2 1 1 ...
#>  $ Randomization           : num  0 0 0 0 0 0 0 0 0 0 ...
#>  $ attempt1_time           : num  29 29 31 31 21 10 13 23 15 8.96 ...
#>  $ attempt1_S_F            : num  1 1 0 0 1 1 1 1 1 1 ...
#>  $ attempt2_time           : num  NA NA 60 46 NA NA NA NA NA NA ...
#>  $ attempt2_assigned_method: num  NA NA 1 1 NA NA NA NA NA NA ...
#>  $ attempt2_S_F            : num  NA NA 1 1 NA NA NA NA NA NA ...
#>  $ attempt3_time           : num  NA NA NA NA NA NA NA NA NA NA ...
#>  $ attempt3_assigned_method: num  NA NA NA NA NA NA NA NA NA NA ...
#>  $ attempt3_S_F            : num  NA NA NA NA NA NA NA NA NA NA ...
#>  $ attempts                : num  1 1 2 2 1 1 1 1 1 1 ...
#>  $ failures                : num  0 0 1 1 0 0 0 0 0 0 ...
#>  $ total_intubation_time   : num  29 29 91 77 21 10 13 23 15 8.96 ...
#>  $ intubation_overall_S_F  : num  1 1 1 1 1 1 1 1 1 1 ...
#>  $ bleeding                : num  0 0 0 0 0 0 0 0 0 0 ...
#>  $ ease                    : num  5 20 80 80 20 2 10 60 15 0 ...
#>  $ sore_throat             : num  0 0 0 NA 0 0 1 0 2 1 ...
#>  $ view                    : num  1 1 0 0 1 1 1 1 1 1 ...

Se tiene una base de datos con información de 99 pacientes y 22 variables de tipo numérico.

6.1 Univariado

Realizamos un análisis descriptivo y gráfico “apropiado” a las variables respuesta que nos interesa estudiar. El tiempo total es continuo y por tanto es adecuado hacer un resumen de estadísticos (valor mínimo, Q1, Q2, Media, Q3 y valor máximo), un boxplot y un histograma; la variable número de intentos es de conteo (puede ser trabajada como ordinal), presentamos un tabla de frecuencias para cada valor y un gráfico de barras (también se puede emplear uno de pastel); por último, la variable dificultad fue colectada en un rango de 0-100 y puede ser estudiada tanto por resumen de estadísticos o por tabla de frecuencias. A continuación, se presentan el código empleado y los resultados obtenidos.

###### Tiempo total de intubación
summary(laryngoscope$total_intubation_time) # Estadísticos resumen
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>    8.96   24.37   31.00   37.48   45.37  100.00
Hmisc::describe(laryngoscope$total_intubation_time)
#> laryngoscope$total_intubation_time 
#>        n  missing distinct     Info     Mean      Gmd      .05      .10 
#>       99        0       74    0.999    37.48    21.65    13.72    16.63 
#>      .25      .50      .75      .90      .95 
#>    24.37    31.00    45.37    70.40    87.30 
#> 
#> lowest : 8.96  10    11.57 12.42 13   , highest: 87    90    91    98    100
boxplot(laryngoscope$total_intubation_time, main = "Tiempo total de intubación", ylab = "Tiempo (segundos)") 

hist(laryngoscope$total_intubation_time, nclass=10, main = "Tiempo total de intubación",xlab = "Tiempo (segundos)", ylab = "Frecuencia")

### Tiempo total de intubación por grupos
laryngoscope %>%
  mutate(Randomization = factor(Randomization, labels = c("Macintosh", "Pentax_AWS"))) %>%
  ggplot(aes(x = total_intubation_time )) + 
       geom_histogram(aes(y = ..density..), colour = 1, fill = "white",binwidth = 10) +
       geom_density(col=2, lwd=1) +
       facet_wrap(~ Randomization)

###### Dificultad de intubación
table(laryngoscope$ease) # En tabla
#> 
#>   0   2   5  10  15  20  25  30  35  40  50  55  60  70  75  80  85  90 100 
#>   2   1   4  13   8   5   3   6   2   9   2   1  14   6   2   6   5   5   5
summary(laryngoscope$ease) # Estadísticos resumen
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>    0.00   15.00   40.00   45.22   70.00  100.00
boxplot(laryngoscope$ease, main = "Nivel de dificultad", ylab = "Dificultad") 

hist(laryngoscope$ease, nclass=10, main = "Nivel de dificultad",xlab = "Escala de dificultad", ylab = "Frecuencia")


### Dificultad de intubación por grupos
laryngoscope %>%
  mutate(Randomization = factor(Randomization, labels = c("Macintosh", "Pentax_AWS"))) %>%
  ggplot(aes(x = ease)) + 
       geom_histogram(aes(y = ..density..), colour = 1, fill = "white") +
       geom_density(col=2, lwd=1) +
       facet_wrap(~ Randomization)

6.1.1 Normalidad

Una cuestión importante en la modelación estadística es identificar si las muestras provienen de una distribución normal o Gaussiana, este conocimiento nos ayudará a definir el enfoque estadístico: paramétrico, semi-paramétrico o no paramétrico. Para evaluar la normalidad de las variables cuantitativas continuas se puede utilizar la función mvn() que nos brinda la prueba de Shapiro Wilks.

Si el valor p (probabilidad de rechazar \(H_0\)) es menor al nivel de significancia (\(alpha=0.05=5\)%), se rechaza la hipótesis nula (\(H_0\): Los datos no se distribuyen de forma normal).


normalidad <- mvn(laryngoscope[,c(17,20)], univariateTest = "SW", desc = FALSE)
normalidad$univariateNormality
#>           Test              Variable Statistic   p value Normality
#> 1 Shapiro-Wilk total_intubation_time    0.8475  <0.001      NO    
#> 2 Shapiro-Wilk         ease             0.9240  <0.001      NO

Rechazamos la hipótesis nula de normalidad y, por tanto, utilizaremos el modelo de riesgos proporcionales de Cox (semi-parametrico) y las pruebas no paramétricas de Kaplan-Meier y la log-rank para estudiar la relación del ** tiempo de intubación** y los factores de estudio.

6.2 Bivariado (Asociación)

6.2.1 Pueba Exacta de Fisher

La prueba exacta de Fisher es una prueba estadística (NO PARAMÉTRICA) utilizada para estudiar la asociación entre dos variables categóricas en una tabla de contingencia, se recomienda su uso cuando alguna celda de la tabla presenta frecuencias observadas iguales o menores a 5. Esta prueba calcula la probabilidad de obtener la distribución de frecuencias observadas. Si la probabilidad resultante es menor a 0.05 se rechaza la hipótesis nula y se concluye que hay evidencia suficiente para afirmar la asociación entre dos variables categóricas.(6)

Hipótesis nula (\(H_0\)): No hay asociación entre las dos variables categóricas; es decir, la distribución de las frecuencias es independiente.

Hipótesis alternativa (\(H_1\)): Existe asociación entre las dos variables categóricas (No hay independencia).

Variable: Éxito de intubación en general

# Prueba exacta de Fisher 
table(laryngoscope$intubation_overall_S_F, laryngoscope$Randomization) #El primer componente es para Filas y el segundo para Columnas
#>    
#>      0  1
#>   0  0  4
#>   1 49 46

prueba_fisher_intub <- fisher.test(table(laryngoscope$intubation_overall_S_F, laryngoscope$Randomization))
prueba_fisher_intub
#> 
#>  Fisher's Exact Test for Count Data
#> 
#> data:  table(laryngoscope$intubation_overall_S_F, laryngoscope$Randomization)
#> p-value = 0.1175
#> alternative hypothesis: true odds ratio is not equal to 1
#> 95 percent confidence interval:
#>  0.000000 1.508182
#> sample estimates:
#> odds ratio 
#>          0

# Obtener valor p

valorp_exitoGe <- round(prueba_fisher_intub$p.value,2)

# Tabla de estadísticas descriptivas

tbl_est_exito_intu <- laryngoscope %>%
  dplyr::select(Randomization, intubation_overall_S_F) %>%
  tbl_summary(by = Randomization) %>%
  bold_labels()
tbl_est_exito_intu
Characteristic 0
N = 49
1
1
N = 50
1
intubation_overall_S_F 49 (100%) 46 (92%)
1 n (%)

# Extracción de valores de los resultados de las estadísticas

exitogeneral_estadi <- as_tibble(tbl_est_exito_intu$table_body)
pentax_aws_stats_exitoGe <- exitogeneral_estadi$stat_2
macintosh_stats_exitoGe <- exitogeneral_estadi$stat_1

Dado que no hubo casos (0) en la casilla de Macintosh (Código=0) y cuando no hubo éxito de intubación (Código=0), es decir con Macintosh todos fueron intubados y sólo cuatro casos no fue posible la intubación cuando se utilizó Pentax AWS (Código=1); aqui no fue poeible estimar un valor de asociación con la prueba exacta de Fisher.

Variable: Sangrado

# Prueba exacta de Fisher
table(laryngoscope$bleeding, laryngoscope$Randomization)
#>    
#>      0  1
#>   0 49 48
#>   1  0  2

prueba_fisher_sangrado <- fisher.test(table(laryngoscope$bleeding, laryngoscope$Randomization))
prueba_fisher_sangrado
#> 
#>  Fisher's Exact Test for Count Data
#> 
#> data:  table(laryngoscope$bleeding, laryngoscope$Randomization)
#> p-value = 0.4949
#> alternative hypothesis: true odds ratio is not equal to 1
#> 95 percent confidence interval:
#>  0.1846149       Inf
#> sample estimates:
#> odds ratio 
#>        Inf

# Obtener valor p

valorp_sangrado <- round(prueba_fisher_sangrado$p.value,2)

# Tabla de estadísticas descriptivas

tbl_est_sangrado <- laryngoscope %>%
  dplyr::select(Randomization, bleeding) %>%
  tbl_summary(by = Randomization) %>%
  bold_labels()
tbl_est_sangrado
Characteristic 0
N = 49
1
1
N = 50
1
bleeding 0 (0%) 2 (4.0%)
1 n (%)

# Extracción de valores para tabla resumen de resultados

sangrado_estadi <- as_tibble(tbl_est_sangrado$table_body)
pentax_aws_stats_sangrado <- sangrado_estadi$stat_2
macintosh_stats_sangrado <- sangrado_estadi$stat_1

6.3 Modelación paramétrica

Hacemos este tipo de modelación cuando asumimos que conocemos el modelo de donde provienen los datos (por ejemplo uno normal) y lo único que necesitamos es estimar los paramétros de dicho modelo, el método de estimación con mayor aplicación es máxima verosimilitud, qué es un principio estadístico utilizado para estimar los parámetros desconocidos de un modelo probabilístico. Busca encontrar los valores de los parámetros que hacen que los datos observados sean más probables bajo el modelo dado.

6.3.1 ANOVA

La herramienta estadística de Análisis de la Varianza (ANOVA) fue desarrollada por Ronald Fisher a principios del siglo XX y su campo de aplicación inicial fue en la agricultura. El ANOVA es una herramienta de análisis que particiona la variación total de los datos en un conjunto de fuentes de variación para comparar las medias de dos o más grupos diferentes y determinar si existe alguna diferencia significativa entre ellos. El objetivo principal del ANOVA es evaluar si las diferencias observadas en las medias de los grupos son el resultado de la variación aleatoria o si existen diferencias reales y significativas.

En el análisis de varianza, se parte de la hipótesis nula (\(H_0\)) de que NO hay diferencia significativa entre las medias de los grupos. Luego, se realiza una prueba de hipótesis para determinar si existe evidencia suficiente para rechazar la hipótesis nula a favor de la hipótesis alternativa (\(H_1\)), que indica que al menos una de las medias de los grupos es diferente.(7)

El código siguiente realiza un ANOVA para determinar si hay una diferencia significativa en la variable respuesta ease (Nivel de dificultad de intubación) entre los diferentes niveles de la variable Randomization (Pentax AWS o Macintosh).

# Ajustar un modelo de regresión lineal 

anova_result <- lm(ease ~ Randomization, data = laryngoscope)
summary(anova_result)
#> 
#> Call:
#> lm(formula = ease ~ Randomization, data = laryngoscope)
#> 
#> Residuals:
#>    Min     1Q Median     3Q    Max 
#> -47.10 -27.65  -2.10  25.40  51.80 
#> 
#> Coefficients:
#>               Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)     38.204      4.258   8.971 2.23e-14 ***
#> Randomization   13.896      5.992   2.319   0.0225 *  
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 29.81 on 97 degrees of freedom
#> Multiple R-squared:  0.05253,    Adjusted R-squared:  0.04276 
#> F-statistic: 5.378 on 1 and 97 DF,  p-value: 0.02249

# Obtener valor p

p_value_nivel <- round(summary(anova_result)$coefficients["Randomization", "Pr(>|t|)"],2)

# Tabla de estadísticas descriptivas

tbl_descriptivas_nivel <- laryngoscope %>% 
  select(ease, Randomization) %>%
  mutate(Randomization = factor(Randomization, labels = c("Macintosh", "Pentax_AWS"))) %>%
  mutate(Randomization = fct_relevel(Randomization, "Pentax_AWS", "Macintosh")) %>%
  tbl_summary( by = Randomization,  
               statistic = list(ease ~ "{mean} ± {sd}")) %>% 
  add_difference(test = list(all_continuous() ~ "smd")) 
tbl_descriptivas_nivel
Characteristic Pentax_AWS
N = 50
1
Macintosh
N = 49
1
Difference2 95% CI2,3
ease 52 ± 31 38 ± 28 0.47 0.07, 0.87
1 Mean ± SD
2 Standardized Mean Difference
3 CI = Confidence Interval

# Extracción de valores para tabla resumen de resultados

nivel_estadi <- as_tibble(tbl_descriptivas_nivel$table_body)
pentax_aws_stats_nivel <- nivel_estadi$stat_1
macintosh_stats_nivel <- nivel_estadi$stat_2

La función lm() en R se emplea para ajustar modelos lineales. Al especificar el argumento data = laryngoscope, estamos indicando que el modelo debe ajustarse utilizando el dataframe laryngoscope.

Mediante la función summary(), obtenemos un resumen detallado del modelo ajustado, lo que nos permite inspeccionar las estadísticas asociadas con la variable Randomization. Una métrica clave a considerar es el valor \(p\), que proporciona una cuantificación de la evidencia en contra de la hipótesis nula \(H_0\).

Dado que se obtuvo un valor \(p = 0.02\) y considerando un nivel de significancia \(\alpha = 0.05\), se tiene evidencia suficiente para rechazar la hipótesis nula \(H_0\). Esto sugiere que existen diferencias estadísticamente significativas entre los grupos de tratamiento con respecto a la variable respuesta ease.

6.3.2 Regresión logística

La regresión logística es una técnica estadística utilizada para modelar la relación entre una variable respuesta binaria (variable dependiente dicotómica) y uno o más predictores (variables independientes) que pueden ser categóricos o continuos. Es una de las técnicas más comunes en el análisis de datos con variables dependientes dicotómicas, donde el objetivo es predecir la probabilidad de que ocurra un evento o una categoría específica. Se utiliza una función logística (también conocida como función de enlace logit).

Éxito de intubacion en el primer intento

# Modelo de regresion logística 

model <- glm(attempt1_S_F ~ Randomization + asa + Mallampati, data = laryngoscope, family = binomial)
summary(model)
#> 
#> Call:
#> glm(formula = attempt1_S_F ~ Randomization + asa + Mallampati, 
#>     family = binomial, data = laryngoscope)
#> 
#> Coefficients:
#>               Estimate Std. Error z value Pr(>|z|)  
#> (Intercept)     3.4387     2.0865   1.648   0.0993 .
#> Randomization  -0.6186     0.6693  -0.924   0.3553  
#> asa            -0.4690     0.6486  -0.723   0.4696  
#> Mallampati      0.1705     0.3852   0.443   0.6580  
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> (Dispersion parameter for binomial family taken to be 1)
#> 
#>     Null deviance: 68.832  on 97  degrees of freedom
#> Residual deviance: 67.337  on 94  degrees of freedom
#>   (1 observation deleted due to missingness)
#> AIC: 75.337
#> 
#> Number of Fisher Scoring iterations: 5

# # Tabla para modelo de regresion logística 

tbl_regresion <- tbl_regression(model, exponentiate = TRUE)
tbl_regresion
Characteristic OR1 95% CI1 p-value
Randomization 0.54 0.13, 1.94 0.4
asa 0.63 0.17, 2.18 0.5
Mallampati 1.19 0.58, 2.69 0.7
1 OR = Odds Ratio, CI = Confidence Interval

# Tabla de estadística descriptiva

tbl_estad_exito1 <- laryngoscope %>%
  dplyr::select(Randomization, attempt1_S_F) %>%
  tbl_summary(by = Randomization) %>%
  bold_labels()
tbl_estad_exito1
Characteristic 0
N = 49
1
1
N = 50
1
attempt1_S_F 45 (92%) 43 (86%)
1 n (%)

# Extracción de valores de los resultados de las estadísticas

exito_estadi <- as_tibble(tbl_estad_exito1$table_body)
pentax_aws_stats_exito1 <- exito_estadi$stat_2
macintosh_stats_exito1 <- exito_estadi$stat_1
exito_estadi
#> # A tibble: 1 × 7
#>   variable     var_type    row_type var_label    label        stat_1   stat_2  
#>   <chr>        <chr>       <chr>    <chr>        <chr>        <chr>    <chr>   
#> 1 attempt1_S_F dichotomous label    attempt1_S_F attempt1_S_F 45 (92%) 43 (86%)


# Extracción de valores para tabla resumen de resultados

modelo_exito1 <- as_tibble(tbl_regresion$table_body[1,])
oddR_exito1 <- round(modelo_exito1$estimate,2)
ConfLo_exito1 <- round(modelo_exito1$conf.low,2)
ConfSu_exito1 <- round(modelo_exito1$conf.high,2)
p_value_exito1 <- round(modelo_exito1$p.value,2)

Vista de la glotis

model_glotis <- glm(view ~ Randomization + asa + Mallampati, data = laryngoscope, family = binomial)
summary(model_glotis)
#> 
#> Call:
#> glm(formula = view ~ Randomization + asa + Mallampati, family = binomial, 
#>     data = laryngoscope)
#> 
#> Coefficients:
#>               Estimate Std. Error z value Pr(>|z|)  
#> (Intercept)     3.1861     1.8249   1.746   0.0808 .
#> Randomization   0.5331     0.5384   0.990   0.3221  
#> asa            -0.5514     0.5795  -0.952   0.3413  
#> Mallampati     -0.1794     0.3106  -0.578   0.5635  
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> (Dispersion parameter for binomial family taken to be 1)
#> 
#>     Null deviance: 93.476  on 97  degrees of freedom
#> Residual deviance: 90.814  on 94  degrees of freedom
#>   (1 observation deleted due to missingness)
#> AIC: 98.814
#> 
#> Number of Fisher Scoring iterations: 4

tbl_modelo_glotis <- tbl_regression(model_glotis, exponentiate = TRUE)
tbl_modelo_glotis
Characteristic OR1 95% CI1 p-value
Randomization 1.70 0.60, 5.10 0.3
asa 0.58 0.17, 1.74 0.3
Mallampati 0.84 0.46, 1.56 0.6
1 OR = Odds Ratio, CI = Confidence Interval

tbl_estad_glotis <- laryngoscope %>%
  dplyr::select(Randomization, view) %>%
  tbl_summary(by = Randomization) %>%
  bold_labels()
tbl_estad_glotis
Characteristic 0
N = 49
1
1
N = 50
1
view 38 (78%) 43 (86%)
1 n (%)

# Extracción de valores de los resultados de las estadísticas

glotis_estadi <- as_tibble(tbl_estad_glotis$table_body)
pentax_aws_stats_glotis <- glotis_estadi$stat_2
macintosh_stats_glotis <- glotis_estadi$stat_1
glotis_estadi
#> # A tibble: 1 × 7
#>   variable var_type    row_type var_label label stat_1   stat_2  
#>   <chr>    <chr>       <chr>    <chr>     <chr> <chr>    <chr>   
#> 1 view     dichotomous label    view      view  38 (78%) 43 (86%)

# Extracción de valores del modelo para tabla resumen de resultados
glotis_modelo <- as_tibble(tbl_modelo_glotis$table_body[1,])
oddR_glotis <- round(glotis_modelo$estimate,2)
ConfLo_glotis <- round(glotis_modelo$conf.low,2)
ConfSu_glotis <- round(glotis_modelo$conf.high,2)
p_value_glotis <- round(glotis_modelo$p.value,2)

6.3.3 Regresión logística ordinal

La regresión logística ordinal (o de odds proporcionales), modela la relación entre variables independientes cuantitativas y/o cualitativas y una variable respuesta con orden natural. Se usa cuando la proporción de odds es constante para distintos valores de las variables independientes. En R, se aplica con la función polr(), que es una función de la librería MASS que ajusta modelos de regresión para variables respuesta con distribución ordinal, con funciones enlace logit o probit. Si los coeficientes son significativos (\(p\) < 0.05), se puede afirmar que hay un efecto significativo de las variables independientes en los odds.

Dolor de garganta

# Modelo de regresion de odds proporcionales u ordinal

modelo_dolor <- polr(as.factor(sore_throat) ~ Randomization + asa + Mallampati, data = laryngoscope)
summary(modelo_dolor)
#> Call:
#> polr(formula = as.factor(sore_throat) ~ Randomization + asa + 
#>     Mallampati, data = laryngoscope)
#> 
#> Coefficients:
#>                   Value Std. Error  t value
#> Randomization  0.069860     0.4327  0.16143
#> asa            0.590238     0.4466  1.32176
#> Mallampati    -0.002668     0.2583 -0.01033
#> 
#> Intercepts:
#>     Value   Std. Error t value
#> 0|1  2.4307  1.4085     1.7258
#> 1|2  3.7964  1.4403     2.6357
#> 2|3  5.1832  1.5216     3.4064
#> 
#> Residual Deviance: 175.2702 
#> AIC: 187.2702 
#> (2 observations deleted due to missingness)

tbl_modelo_dolor <- tbl_regression(modelo_dolor, exponentiate = TRUE)
tbl_modelo_dolor
Characteristic OR1 95% CI1
Randomization 1.07 0.46, 2.52
asa 1.80 0.77, 4.51
Mallampati 1.00 0.59, 1.65
1 OR = Odds Ratio, CI = Confidence Interval

# Obtener valor p

valor_p_dolorg <- round(modelo_dolor$coefficients["Randomization"],2)

# Tabla de estadísticas descriptivas

tbl_estad_dolor <- laryngoscope %>%
  select(Randomization, sore_throat) %>%
  tbl_summary(
    by = Randomization,
    statistic = list(all_categorical() ~ "{n} ({p}%)"
    )
  )
tbl_estad_dolor
Characteristic 0
N = 49
1
1
N = 50
1
sore_throat

    0 32 (67%) 34 (68%)
    1 12 (25%) 9 (18%)
    2 3 (6.3%) 5 (10%)
    3 1 (2.1%) 2 (4.0%)
    Unknown 1 0
1 n (%)

# Extracción de valores para tabla resumen de resultados

dolor_estadi <- as_tibble(tbl_estad_dolor$table_body)

pentax_aws_stats_dolor_l1 <- dolor_estadi$stat_2[2]
pentax_aws_stats_dolor_l2 <- dolor_estadi$stat_2[3]
pentax_aws_stats_dolor_l3 <- dolor_estadi$stat_2[4]
pentax_aws_stats_dolor_l4 <- dolor_estadi$stat_2[5]

macintosh_stats_dolor_l1 <- dolor_estadi$stat_1[2]
macintosh_stats_dolor_l2 <- dolor_estadi$stat_1[3]
macintosh_stats_dolor_l3 <- dolor_estadi$stat_1[4]
macintosh_stats_dolor_l4 <- dolor_estadi$stat_1[5]

# Extracción de valores del modelo para tabla resumen de resultados

tabla_dolor <- as_tibble(tbl_modelo_dolor$table_body[1,])
oddR_dolor <- round(tabla_dolor$estimate,2)
ConfLo_dolor <- round(tabla_dolor$conf.low,2)
ConfSu_dolor <- round(tabla_dolor$conf.high,2)

6.4 Modelación NO paramétrica

6.4.1 Suma de rangos de Wilcoxon

La prueba de suma de rangos de Wilcoxon se utiliza como una alternativa a la prueba t de Student, dado que la distribución de las variables sobre las cuales se realizan las comparaciones no siguen una distribución normal. La prueba evalúa las hipótesis:

Hipótesis nula (\(H_0\)): No hay diferencia significativa entre las distribuciones de las dos muestras.

Hipótesis alternativa (\(H_1\)): Existe una diferencia significativa entre las distribuciones de las dos muestras.

Si el valor \(p\) resultante es menor que el nivel de significancia predefinido (generalmente 0.05), se rechaza la hipótesis nula, lo que sugiere que hay evidencia suficiente para afirmar que existe una diferencia significativa entre las dos muestras.
En R se puede utilizar la función wilcox.test() como se muestra en el código siguiente.

Número de intentos de intubación

# Prueba de suma de rangos de Wilcoxon 

wilcox_test <- wilcox.test(attempts ~ Randomization, data = laryngoscope)
wilcox_test
#> 
#>  Wilcoxon rank sum test with continuity correction
#> 
#> data:  attempts by Randomization
#> W = 1172, p-value = 0.482
#> alternative hypothesis: true location shift is not equal to 0

# Extracción de valores de la prueba

valorp_intentos <- round(wilcox_test$p.value,2)

# Tabla de estadísticas descriptivas

tbl_intentos <- laryngoscope %>%
  select(Randomization, attempts) %>%
  tbl_summary(
    by = Randomization,
    statistic = list(
      all_continuous() ~ "{mean} ({sd})",
      all_categorical() ~ "{n} ({p}%)"
    )
  )
tbl_intentos
Characteristic 0
N = 49
1
1
N = 50
1
attempts

    1 45 (92%) 44 (88%)
    2 4 (8.2%) 3 (6.0%)
    3 0 (0%) 3 (6.0%)
1 n (%)

# Extracción de valores para tabla resumen de resultados

intentos_estadi <- as_tibble(tbl_intentos$table_body)
pentax_aws_stats_intentos_l1 <- intentos_estadi$stat_2[2]
pentax_aws_stats_intentos_l2 <- intentos_estadi$stat_2[3]
pentax_aws_stats_intentos_l3 <- intentos_estadi$stat_2[4]

macintosh_stats_intentos_l1 <- intentos_estadi$stat_1[2]
macintosh_stats_intentos_l2 <- intentos_estadi$stat_1[3]
macintosh_stats_intentos_l3 <- intentos_estadi$stat_1[4]

6.4.2 Kaplan-Meier

El procedimiento de Kaplan-Meier es una técnica estadística no paramétrica utilizada para estimar la función de supervivencia en estudios de sobrevida o análisis de tiempo hasta la ocurrencia de un evento (ejemplo: muerte). El análisis de supervivencia se enfoca en estudiar el tiempo transcurrido hasta que se produce un evento de interés en una muestra de individuos o elementos.

Kaplan-Meier construye una curva de supervivencia al estimar la función de supervivencia S(t) en diferentes puntos de tiempo. La curva de supervivencia muestra cómo la probabilidad de supervivencia cambia a lo largo del tiempo. Para estimar S(t), se utilizan las tasas de supervivencia en cada intervalo de tiempo basadas en el número de eventos ocurridos y la cantidad de individuos en riesgo de experimentar el evento en cada intervalo.(8)

En esta práctica se utilizará la prueba de Kaplan-Meier para estimar el éxito en el porcentaje de intubación a lo largo del tiempo.

# Ajustar el modelo de supervivencia para el grupo Macintosh

fit_macintosh <- survfit(Surv(total_intubation_time, intubation_overall_S_F) ~ Randomization, data = laryngoscope[Randomization == "0",])

# Ajustar el modelo de supervivencia para el grupo Pentax_AWS

fit_pentax_aws <- survfit(Surv(total_intubation_time, intubation_overall_S_F) ~ Randomization, data = laryngoscope[Randomization == "1",])

# Grafica las curvas de supervivencia para ambos grupos
par(mfrow = c(1, 1))  # Organiza el gráfico en una sola fila

# Coloca las etiquetas del eje Y en formato de porcentajes invertidos
options(scipen=999)  # Evita la notación científica en los ejes

# Grafica la curva de supervivencia para el grupo 'Macintosh'
plot(fit_macintosh, col = "blue", lwd = 2, main = "Curvas de Supervivencia de Kaplan-Meier",
     xlab = "Tiempo total de incubación (s)", ylab = "% de exito de intubación", xlim = c(0, max(total_intubation_time)),
     ylim = c(1, 0), yaxt = "n")  # Invierte el eje Y

# Grafica la curva de supervivencia para el grupo 'Pentax_AWS'
lines(fit_pentax_aws, col = "red", lwd = 2)

# Modifica las etiquetas del eje Y para mostrar porcentajes invertidos
porcentajes_invertidos <- seq(0, 100, by = 10)
etiquetas_eje_y <- sprintf("%1.0f%%", rev(porcentajes_invertidos))
axis(2, at = rev(porcentajes_invertidos) / 100, labels = etiquetas_eje_y)

# Agrega leyendas
legend("topleft", legend = c("Macintosh", "Pentax_AWS"), col = c("blue", "red"), lwd = 2)

# Agrega etiquetas de tamaño de muestra en la parte de abajo a la derecha
muestra_macintosh <- sum(Randomization == "0")
muestra_pentax_aws <- sum(Randomization == "1")
muestra_texto <- paste("N Macintosh=", muestra_macintosh, "  N Pentax AWS =", muestra_pentax_aws)

text(x = 40, y = 0, labels = muestra_texto, pos = 4, adj = 1)

Otra forma de realizar las curvas de Kaplan-Meier integrando el intervalo de confianza de las curvas y el valor \(p\) para la diferencia entre ellas, es con el código siguiente.

# Creación de función de supervivencia

survObject <- Surv(total_intubation_time, intubation_overall_S_F)

# Creación de curvas de supervivencia 

fit <- survfit(survObject ~ Randomization, data = laryngoscope)
summary(fit)
#> Call: survfit(formula = survObject ~ Randomization, data = laryngoscope)
#> 
#>                 Randomization=0 
#>   time n.risk n.event survival std.err lower 95% CI upper 95% CI
#>   8.96     49       1   0.9796  0.0202      0.94079        1.000
#>  10.00     48       1   0.9592  0.0283      0.90535        1.000
#>  11.57     47       1   0.9388  0.0342      0.87399        1.000
#>  13.00     46       1   0.9184  0.0391      0.84482        0.998
#>  13.80     45       1   0.8980  0.0432      0.81708        0.987
#>  15.00     44       1   0.8776  0.0468      0.79040        0.974
#>  15.92     43       1   0.8571  0.0500      0.76456        0.961
#>  16.53     42       1   0.8367  0.0528      0.73939        0.947
#>  16.66     41       1   0.8163  0.0553      0.71480        0.932
#>  19.00     40       1   0.7959  0.0576      0.69071        0.917
#>  21.00     39       1   0.7755  0.0596      0.66706        0.902
#>  21.21     38       1   0.7551  0.0614      0.64381        0.886
#>  21.90     37       1   0.7347  0.0631      0.62092        0.869
#>  22.00     36       2   0.6939  0.0658      0.57612        0.836
#>  22.98     34       1   0.6735  0.0670      0.55417        0.818
#>  23.00     33       2   0.6327  0.0689      0.51110        0.783
#>  23.22     31       1   0.6122  0.0696      0.48995        0.765
#>  23.60     30       1   0.5918  0.0702      0.46905        0.747
#>  24.00     29       1   0.5714  0.0707      0.44839        0.728
#>  24.74     28       1   0.5510  0.0711      0.42796        0.709
#>  25.00     27       1   0.5306  0.0713      0.40776        0.690
#>  25.31     26       1   0.5102  0.0714      0.38779        0.671
#>  26.00     25       1   0.4898  0.0714      0.36805        0.652
#>  27.00     24       2   0.4490  0.0711      0.32924        0.612
#>  28.00     22       2   0.4082  0.0702      0.29135        0.572
#>  29.00     20       6   0.2857  0.0645      0.18351        0.445
#>  29.42     14       1   0.2653  0.0631      0.16649        0.423
#>  29.45     13       1   0.2449  0.0614      0.14978        0.400
#>  32.00     12       1   0.2245  0.0596      0.13341        0.378
#>  32.47     11       1   0.2041  0.0576      0.11740        0.355
#>  33.00     10       2   0.1633  0.0528      0.08662        0.308
#>  37.00      8       1   0.1429  0.0500      0.07195        0.284
#>  39.00      7       1   0.1224  0.0468      0.05787        0.259
#>  42.13      6       1   0.1020  0.0432      0.04447        0.234
#>  44.13      5       1   0.0816  0.0391      0.03192        0.209
#>  69.00      4       1   0.0612  0.0342      0.02045        0.183
#>  77.00      3       1   0.0408  0.0283      0.01050        0.159
#>  87.00      2       1   0.0204  0.0202      0.00293        0.142
#>  91.00      1       1   0.0000     NaN           NA           NA
#> 
#>                 Randomization=1 
#>   time n.risk n.event survival std.err lower 95% CI upper 95% CI
#>   12.4     50       1    0.980  0.0198      0.94195        1.000
#>   14.2     49       1    0.960  0.0277      0.90719        1.000
#>   17.4     48       1    0.940  0.0336      0.87643        1.000
#>   23.6     47       1    0.920  0.0384      0.84779        0.998
#>   28.0     46       2    0.880  0.0460      0.79438        0.975
#>   29.0     44       3    0.820  0.0543      0.72014        0.934
#>   29.5     41       1    0.800  0.0566      0.69647        0.919
#>   29.5     40       1    0.780  0.0586      0.67323        0.904
#>   30.0     39       1    0.760  0.0604      0.65038        0.888
#>   31.0     38       2    0.720  0.0635      0.60571        0.856
#>   33.0     36       1    0.700  0.0648      0.58384        0.839
#>   34.0     35       2    0.660  0.0670      0.54093        0.805
#>   34.6     33       1    0.640  0.0679      0.51987        0.788
#>   35.0     32       3    0.580  0.0698      0.45813        0.734
#>   36.0     29       1    0.560  0.0702      0.43801        0.716
#>   36.0     28       1    0.540  0.0705      0.41811        0.697
#>   36.5     27       1    0.520  0.0707      0.39843        0.679
#>   38.0     26       1    0.500  0.0707      0.37896        0.660
#>   38.3     25       1    0.480  0.0707      0.35971        0.641
#>   38.9     24       1    0.460  0.0705      0.34067        0.621
#>   39.0     23       1    0.440  0.0702      0.32185        0.602
#>   44.0     22       1    0.420  0.0698      0.30324        0.582
#>   46.6     21       1    0.400  0.0693      0.28486        0.562
#>   47.0     20       1    0.380  0.0686      0.26670        0.541
#>   48.0     19       1    0.360  0.0679      0.24877        0.521
#>   48.0     18       1    0.340  0.0670      0.23108        0.500
#>   48.2     17       1    0.320  0.0660      0.21363        0.479
#>   49.0     16       2    0.280  0.0635      0.17952        0.437
#>   50.0     14       1    0.260  0.0620      0.16289        0.415
#>   50.1     13       1    0.240  0.0604      0.14655        0.393
#>   52.0     12       2    0.200  0.0566      0.11489        0.348
#>   56.0     10       1    0.180  0.0543      0.09962        0.325
#>   59.6      9       1    0.160  0.0518      0.08478        0.302
#>   70.0      8       1    0.140  0.0491      0.07043        0.278
#>   72.0      7       1    0.120  0.0460      0.05665        0.254
#>   90.0      4       1    0.090  0.0432      0.03516        0.230
#>  100.0      2       1    0.045  0.0384      0.00843        0.240

# Prueba de log-rank para la diferencia entre las curvas de los grupos

logRank <- survdiff(survObject ~ Randomization)

# Calculo del valor p de la prueba log-rank

pval <- pchisq(logRank$chisq, length(logRank$n) - 1) 
# Crear gráfica 

ggsurvplot(fit, data=laryngoscope, pval = round(pval,10), xlab="Tiempo", ylab="Éxito de intubación %", conf.int = T,legend.labs = c("Macintosh", "Pentax AWS")) 

De la gráfica anterior observamos que el laringoscopio Macintosh (representado en color rojo) no presenta diferencia con el laringoscopio Pentax AWS que incluso ofrece peores resultados.

6.5 Modelación semi-paramétrica

6.5.1 Modelo de riesgos proporcionales de Cox

En ensayos clínicos o estudios observacionales que buscan evaluar el impacto de una intervención sobre el tiempo hasta la aparición de un evento de interés, es esencial considerar y ajustar por el efecto de otras variables, conocidas como covariables o covariantes. Estas pueden estar directamente relacionadas con el evento bajo estudio. Ejemplos de covariantes incluyen variables demográficas como la edad o el sexo; indicadores de laboratorio, como el nivel de bilirrubina o la presión arterial; y otros factores, como la duración de exposición a una terapia anterior o la naturaleza específica de una enfermedad. Estas covariantes, al ser consideradas, permiten obtener resultados más precisos y confiables en el análisis.(9)

El modelo de Cox establece la relación entre la distribución del tiempo de fallo y las covariantes, donde las covariantes tienen un efecto multiplicativo en la función de riesgo.

En muchos estudios epidemiológicos en los que se compara una población expuesta a cierta condición, por ejemplo asbestos, con otra no expuesta, la tasa de riesgos o hazard ratio, es a menudo la única medida de efecto que se considera y se interpreta como la razón entre la tasa de incidencia del grupo expuesto y la tasa de incidencia del grupo no expuesto.

Una de las aplicaciones más importantes del modelo de riesgos proporcionales se da en un ensayo clínico en el que se comparan las supervivencias de dos poblaciones. Si las funciones de riesgo para cada población son \(λ_0(t)\) y \(λ_1(t)\), el modelo establece \(λ_1(t) = e^β λ_0(t)\), y las funciones de supervivencia están relacionadas mediante \(S_1(t) = S_0(t)e^β\). Si se introducen otras covariantes, el modelo de Cox permite obtener una estimación del efecto del tratamiento ajustado por la presencia de las mismas. La inclusión de una covariante con alto poder predictivo, además de la variable tratamiento, añade ventajas adicionales.

En esta práctica se utiliza un modelo de Cox para evaluar la relación entre el tiempo total de intubación, la variable tratamiento (Pentax AWS o Macintosh), y las covariables estado físico (asa) y mallampati.

# Crear un objeto de supervivencia

surv_obj <- Surv(total_intubation_time, intubation_overall_S_F)

# Crear un modelo de cox

modelo_cox <- coxph(surv_obj ~  Randomization + asa + Mallampati, data = laryngoscope)
summary(modelo_cox)
#> Call:
#> coxph(formula = surv_obj ~ Randomization + asa + Mallampati, 
#>     data = laryngoscope)
#> 
#>   n= 98, number of events= 94 
#>    (1 observation deleted due to missingness)
#> 
#>                   coef exp(coef) se(coef)      z Pr(>|z|)    
#> Randomization -1.06738   0.34391  0.22401 -4.765 1.89e-06 ***
#> asa           -0.45267   0.63593  0.23910 -1.893   0.0583 .  
#> Mallampati     0.02296   1.02323  0.12130  0.189   0.8498    
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#>               exp(coef) exp(-coef) lower .95 upper .95
#> Randomization    0.3439     2.9078    0.2217    0.5335
#> asa              0.6359     1.5725    0.3980    1.0161
#> Mallampati       1.0232     0.9773    0.8067    1.2979
#> 
#> Concordance= 0.684  (se = 0.027 )
#> Likelihood ratio test= 23.48  on 3 df,   p=3e-05
#> Wald test            = 22.91  on 3 df,   p=4e-05
#> Score (logrank) test = 24.58  on 3 df,   p=2e-05

# Obtener resultados del modelo en una tabla

tbl_cox <- tbl_regression(modelo_cox, exponentiate = TRUE, label= Randomization ~ "Tiempo total de intubación")
tbl_cox 
Characteristic HR1 95% CI1 p-value
Tiempo total de intubación 0.34 0.22, 0.53 <0.001
asa 0.64 0.40, 1.02 0.058
Mallampati 1.02 0.81, 1.30 0.8
1 HR = Hazard Ratio, CI = Confidence Interval

# Obtener resultados solo para la variable de tratamiento

tbl_efecto_tratamiento <- tbl_cox %>%
  modify_table_body(~.x[.x$variable == "Randomization", ])
tbl_efecto_tratamiento
Characteristic HR1 95% CI1 p-value
Tiempo total de intubación 0.34 0.22, 0.53 <0.001
1 HR = Hazard Ratio, CI = Confidence Interval

# Tabla de estadísticas descriptivas 

tbl_descriptivas_tiem <- laryngoscope %>%
  
  select(total_intubation_time, Randomization) %>%
  
  mutate(Randomization = factor(Randomization, labels = c("Macintosh", "Pentax_AWS"))) %>%
  
  tbl_summary(by = Randomization, 
              statistic = total_intubation_time ~ "{median} ({p25}, {p75})",
              label = list(total_intubation_time = "Tiempo total de intubación"))
tbl_descriptivas_tiem
Characteristic Macintosh
N = 49
1
Pentax_AWS
N = 50
1
Tiempo total de intubación 26 (22, 29) 38 (31, 50)
1 Median (Q1, Q3)

# Extracción de valores del modelo para tabla resumen de resultados

tiem_estadi <- as_tibble(tbl_descriptivas_tiem$table_body)
pentax_aws_stats_tiem <- tiem_estadi$stat_2
macintosh_stats_tiem <- tiem_estadi$stat_1


modelo_tiem <- as_tibble(tbl_efecto_tratamiento$table_body)
oddR_tiem <- round(modelo_tiem$estimate,2)
ConfLo_tiem <- round(modelo_tiem$conf.low,2)
ConfSu_tiem <- round(modelo_tiem$conf.high,2)
pvalue_tiem <- modelo_tiem$p.value
p_value_tiem <- if (pvalue_tiem < 0.001) "<0.001" else round(value, 3)

El código de arriba realiza un análisis de supervivencia utilizando el modelo de riesgos proporcionales de Cox. Antes de interpretar los resultados, es importante entender el contexto y las variables:

  • total_intubation_time: Representa el tiempo que se tarda en un ensayo clínico en entubar a una persona.

  • intubation_overall_S_F: Es un indicador de censura. Si se logró entubar a la persona, tiene un valor de 1 (evento ocurrido), y si no, un valor de 0 (censurado).

  • Randomization: Es una variable que indica el grupo de tratamiento al que estaba asignado el paciente.

  • asa y Mallampati: Son covariables, es decir, variables que se consideran en el modelo para ajustar el efecto de la variable principal (Randomization).

La función coxph se utiliza para ajustar el modelo de Cox, y tbl_regression se utiliza para obtener una tabla con los resultados del modelo.

El Hazard Ratio (HR) para la variable Randomization se obtiene de la tabla tbl_efecto_tratamiento la cual extrae los resultados para la variable principal (Randomization).

Interpretación del Hazard Ratio (HR) para Randomization:

  • HR = 1: No hay diferencia en el riesgo de intubación entre los grupos de tratamiento.
  • HR > 1: El grupo de tratamiento asociado con el HR tiene un mayor riesgo de intubación en comparación con el grupo de referencia.
  • HR < 1: El grupo de tratamiento asociado con el HR tiene un menor riesgo de intubación en comparación con el grupo de referencia.

El Hazard Ratio de 0.34 indica que la riesgo de intubación en el grupo Pentax AWS es 0.34 veces (o 34% del riesgo) en comparación con el grupo de referencia, después de ajustar por las covariables asa y Mallampati.

Dado que Randomization es una variable binaria que indica si un paciente recibió el tratamiento Pentax AWS (valor = 1) o el tratamiento Macintosh (valor = 0), y el HR para Randomization es 0.34, entonces esto sugiere que los pacientes que recibieron el tratamiento Pentax AWS tienen una posibilidad 66% menor de ser intubados en comparación con aquellos que recibieron el tratamiento Macintosh, manteniendo constantes las covariables asa y Mallampati.

Es importante recordar que, además del valor del HR, se debe considerar el intervalo de confianza asociado y el valor \(p\). Si el intervalo de confianza no incluye el valor 1 y el valor \(p\) es menor que 0.05 (o el nivel de significancia que hayas elegido), entonces podemos decir que la diferencia es estadísticamente significativa.

6.6 Tabla resumen de resultados

final_results <- data.frame(
  `Variables respuesta` = c("Respuesta primaria", "Tiempo de intubacion total", "Respuesta secundaria", "Nivel de dificultad de intubacion", " ","Exito de intubacion en el primer intento", "Exito de intubacion", "Numero de intentos de intubacion", "1", "2","3","Vista de la glotis", "Sangrado", "Dolor de garganta", "Ninguno","Leve","Moderado","Severo"),
  
  `Pentax AWS` = c(" ", pentax_aws_stats_tiem, " ", pentax_aws_stats_nivel, " ", pentax_aws_stats_exito1, pentax_aws_stats_exitoGe, " ", pentax_aws_stats_intentos_l1, pentax_aws_stats_intentos_l2, pentax_aws_stats_intentos_l3, pentax_aws_stats_glotis, pentax_aws_stats_sangrado, " ",pentax_aws_stats_dolor_l1, pentax_aws_stats_dolor_l2, pentax_aws_stats_dolor_l3, pentax_aws_stats_dolor_l4),
  
  `Macintosh` = c(" ", macintosh_stats_tiem, " ", macintosh_stats_nivel, " ", macintosh_stats_exito1, macintosh_stats_exitoGe, " ", macintosh_stats_intentos_l1, macintosh_stats_intentos_l2, macintosh_stats_intentos_l3, macintosh_stats_glotis, macintosh_stats_sangrado , " ", macintosh_stats_dolor_l1, macintosh_stats_dolor_l2, macintosh_stats_dolor_l3, macintosh_stats_dolor_l4),
  
  `Efecto del tratamiento(95% IC)` = c("Hazard ratio", paste(oddR_tiem, " (", ConfLo_tiem, "-", ConfSu_tiem, ")", sep = ""), "Diferencia de media", " " ,"Odds ratio",paste(oddR_exito1, " (", ConfLo_exito1, "-", ConfSu_exito1, ")", sep = ""), "Inestimable", "N/A"," "," "," ", paste(oddR_glotis, " (", ConfLo_glotis, "-", ConfSu_glotis, ")", sep = ""), "Inestimable", paste(oddR_dolor, " (", ConfLo_dolor, "-", ConfSu_dolor, ")", sep = ""), " ", " ", " ", " "),
  
  `Valor p` = c(" ", p_value_tiem, " ", p_value_nivel, " ",p_value_exito1, valorp_exitoGe, valorp_intentos, " ", " ", " ", p_value_glotis, valorp_sangrado, valor_p_dolorg, " ", " ", " ", " ")
)
# Print the table
final_results %>%
  kable() %>%
  kable_styling(full_width = F)
Variables.respuesta Pentax.AWS Macintosh Efecto.del.tratamiento.95..IC. Valor.p
Respuesta primaria Hazard ratio
Tiempo de intubacion total 38 (31, 50) 26 (22, 29) 0.34 (0.22-0.53) <0.001
Respuesta secundaria Diferencia de media
Nivel de dificultad de intubacion 52 ± 31 38 ± 28 0.02
Odds ratio
Exito de intubacion en el primer intento 43 (86%) 45 (92%) 0.54 (0.13-1.94) 0.36
Exito de intubacion 46 (92%) 49 (100%) Inestimable 0.12
Numero de intentos de intubacion N/A 0.48
1 44 (88%) 45 (92%)
2 3 (6.0%) 4 (8.2%)
3 3 (6.0%) 0 (0%)
Vista de la glotis 43 (86%) 38 (78%) 1.7 (0.6-5.1) 0.32
Sangrado 2 (4.0%) 0 (0%) Inestimable 0.49
Dolor de garganta 1.07 (0.46-2.52) 0.07
Ninguno 34 (68%) 32 (67%)
Leve 9 (18%) 12 (25%)
Moderado 5 (10%) 3 (6.3%)
Severo 2 (4.0%) 1 (2.1%)

7 Análisis de resultados

Efectividad y Tiempo de Intubación: Se observó que el grupo que utilizó Pentax AWS obtuvo un éxito de intubación del 86% en el primer intento, aumentando significativamente al 92% en el segundo intento. En comparación, el grupo Macintosh logró un éxito del 92% en el primer intento, alcanzando un 100% en el segundo intento. Además, se encontró que el tiempo promedio de intubación fue de 38 segundos para Pentax AWS y de 26 segundos para Macintosh. Estos resultados coinciden con los datos presentados en el artículo original.

Análisis de Riesgo: Los resultados principales se centran en el tiempo de intubación y el análisis de riesgo. En este sentido, se calculó un Hazard Ratio (HR) de 0.35 con un intervalo de confianza del 95% (0.23 a 0.55) para el tiempo de intubación. Esto implica que el grupo Macintosh tiene un riesgo significativamente menor en comparación con el grupo de estudio Pentax AWS. Este valor es respaldado por un valor de \(p\) menor a 0.001, lo que confirma la significancia estadística de la asociación.

Dificultad de Intubación: La dificultad de intubación se evaluó mediante la comparación de los grupos Pentax AWS y Macintosh. Se obtuvo un valor para Macintosh de media de 35 mientras que para el grupo Pentax AWS se tuvo un valor de 53. En el artículo reportan un valor de 40 y 52 respectivamente para los grupos. Se encontró que el grupo Pentax AWS experimentó una mayor dificultad en comparación con el grupo Macintosh, con un valor de \(p\) de 0.02. Este resultado es estadísticamente significativo y respalda las conclusiones del artículo original, aunque se encontraran valores ligeramente diferentes.

Al examinar los grupos de Pentax AWS y Macintosh, se observó que el 86% de los pacientes en el grupo de Pentax AWS presentaron una vista “buena” de la glotis, en comparación con el 78% en el grupo Macintosh. El cálculo de un valor de p de 0.32 para esta comparación sugiere que la diferencia en la dificultad de intubación, evaluada a través del parámetro de Cormack-Lehane, no es estadísticamente significativa entre los grupos. Los resultados obtenidos coinciden con las conclusiones reportadas en el artículo original.

No se encontraron diferencias significativas entre los grupos en el número de intentos, la presencia de sangrado y dolor de garganta, con valores de \(p\) de 0.48, 0.49 y 0.07, respectivamente. Si bien estos valores difieren de los reportados en el artículo, es importante notar que en ambos casos los valores de \(p\) obtenidos también son mayores a 0.05, indicando que obtuvimos tendencias similares.

8 Conclusión

Con nuestra revisión de los cálculos del artículo “Comparación aleatoria entre el videolaringoscopio Pentax AWS y el laringoscopio Macintosh en pacientes con obesidad mórbida” reproducimos, en su mayoría, las cifras publicados, las tendencias y conclusiones generales se mantuvieron. Estos resultados refuerzan la importancia de elegir el dispositivo adecuado en función de la situación clínica, al tiempo que subrayan la relevancia de la replicabilidad en la investigación médica.

El software estadístico R fue una herramienta efectiva, valiosa y suficiente para la realización de análisis en ciencias biologícas y de la salud, dado que cuenta con gran cantidad de librerías pertinentes para análisis estadístico y bioestadístico. Los resultados obtenidos en este ejercicio respaldan las conclusiones previas y destacan la utilidad de R en este tipo de investigaciones.

Para trabajos futuros se pretende desarrollar aún más los métodos estadísticos, hacer la validación de supuestos, investigar la potencia estadística de las pruebas y ampliar la revisión de conceptos médicos (por ejemplo ASA), que con un poco de esfuerzo adicional el lector puede revisar en la intenet.

Consideramos que nuestro objetivo principal y secundario fueron cumplidos, es decir, los profesionistas y estudiantes de ciencias biologícas y médicas cuentan con un ejemplo de modelación estadística en ciencias de la salud usando R.

9 Cítanos

Entrada de BibTeX para usarios de Latex:

@Article{bioestadis_R, author = {Humberto Martínez Bautista, Ricardo A. Rodriguez Ojeda and María de Lourdes Delgadillo Hurtado}, title = {Una comprensiva revisión estadística del artículo: Comparación aleatoria entre el video-laringoscopio Pentax AWS y el laringoscopio Macintosh en pacientes con obesidad mórbida}

10 Anexo

10.1 Diccionario

Variable Etiqueta Unidad Codificación
Edad Edad Años
Sexo Sexo Femenino,Masculino
Estado_fisico Estado físico, asignado por la Sociedad Americana de Anestesiólogos I= Un paciente sano normal; II = Un paciente con enfermedad sistémica leve; III = Un paciente con enfermedad sistémica grave; IV = Un paciente con enfermedad sistémica grave que es una amenaza constante para la vida
IMC Indice de masa corporal kg/m2
Mallampati Escala para predecir la dificultad de intubación traqueal
Grupo A que grupo pertenece el paciente I = Las amígdalas, la úvula y el paladar blando del paciente son completamente visibles, II = El paladar duro y blando, las amígdalas superiores y la úvula son visibles, III = El paladar duro y blando son visibles, la úvula está algo oscurecida, IV = Solo el paladar duro es visible
Tiempo_1_intento Tiempo de intubación en el primer intento Segundos Pentax AWS. Macintosh hoja #4
Exito_1_intento Intubación exitosa en el primer intento
Tiempo_2_intento Tiempo de intubación en el segundo intento Segundos Si, No
Metodo_2_intento Segundo intento realizado con el laringoscopio asignado
Exito_2_intento Éxito en el segundo intento Si, No
Tiempo_3_intento Tiempo de intubación en el tercer intento Segundos Si, No
Metodo_3_intento Tercer intento realizado con el laringoscopio asignado
Exito_3_intento Éxito en el tercer intento Si, No
Num_intentos Número de intentos realizados Número de intentos al operar Si, No
Fracasos Número de fracasos Número de intentos al operar
Tiempo_total_intubacion Tiempo total de intubación
Exito_intubacion Intubación exitosa
Sangrado Presencia de sangrado Si, No
Nivel_dificultad Dificultad en la intubación traqueal Si, No
Dolor_garganta Severidad en el dolor de garganta 0 = extremadamente facil, 100 = extremadamente dificil
Vista_glotis Visibilidad de la glotis en escala Cormack-lehane
Edad Edad Años Bueno, Malo

10.2 Configuraciónes de equipo y R

xfun::session_info()
#> R version 4.4.1 (2024-06-14)
#> Platform: aarch64-apple-darwin20
#> Running under: macOS Sonoma 14.6
#> 
#> Locale: en_US.UTF-8 / en_US.UTF-8 / en_US.UTF-8 / C / en_US.UTF-8 / en_US.UTF-8
#> 
#> Package version:
#>   abind_1.4-8           askpass_1.2.1         assertthat_0.2.1     
#>   backports_1.5.0       base_4.4.1            base64enc_0.1-3      
#>   bigD_0.2.0            bit_4.5.0             bit64_4.5.2          
#>   bitops_1.0.9          blob_1.2.4            bookdown_0.40        
#>   boot_1.3-30           broom_1.0.7           broom.helpers_1.17.0 
#>   bslib_0.8.0           cachem_1.1.0          callr_3.7.6          
#>   car_3.1-3             carData_3.0-5         cards_0.3.0          
#>   cardx_0.2.1           cellranger_1.1.0      checkmate_2.3.2      
#>   class_7.3-22          cli_3.6.3             clipr_0.8.0          
#>   cluster_2.1.6         colorspace_2.1-1      commonmark_1.9.2     
#>   compiler_4.4.1        conflicted_1.2.0      corrplot_0.94        
#>   cowplot_1.1.3         cpp11_0.5.0           crayon_1.5.3         
#>   curl_5.2.3            data.table_1.16.0     DBI_1.2.3            
#>   dbplyr_2.5.0          Deriv_4.1.6           DescTools_0.99.57    
#>   digest_0.6.37         doBy_4.6.22           dplyr_1.1.4          
#>   dtplyr_1.3.1          e1071_1.7-16          energy_1.7-12        
#>   evaluate_1.0.0        Exact_3.3             exactRankTests_0.8.35
#>   expm_1.0-0            fansi_1.0.6           farver_2.1.2         
#>   fastmap_1.2.0         fontawesome_0.5.2     forcats_1.0.0        
#>   foreign_0.8-86        Formula_1.2-5         fs_1.6.4             
#>   gargle_1.5.2          gdata_3.0.0           generics_0.1.3       
#>   ggplot2_3.5.1         ggpubr_0.6.0          ggrepel_0.9.6        
#>   ggsci_3.2.0           ggsignif_0.6.4        ggtext_0.1.2         
#>   gld_2.6.6             glue_1.8.0            gmodels_2.19.1       
#>   googledrive_2.1.1     googlesheets4_1.1.1   GPArotation_2024.3.1 
#>   graphics_4.4.1        grDevices_4.4.1       grid_4.4.1           
#>   gridExtra_2.3         gridtext_0.1.5        gsl_2.1-8            
#>   gt_0.11.1             gtable_0.3.5          gtools_3.9.5         
#>   gtsummary_2.0.3       haven_2.5.4           highr_0.11           
#>   Hmisc_5.1-3           hms_1.1.3             htmlTable_2.4.3      
#>   htmltools_0.5.8.1     htmlwidgets_1.6.4     httr_1.4.7           
#>   ids_1.0.1             isoband_0.2.7         janitor_2.2.0        
#>   jpeg_0.1.10           jquerylib_0.1.4       jsonlite_1.8.9       
#>   juicyjuice_0.1.0      kableExtra_1.4.0      km.ci_0.5-6          
#>   KMsurv_0.1-5          knitr_1.48            labeling_0.4.3       
#>   labelled_2.13.0       lattice_0.22-6        lifecycle_1.0.4      
#>   lme4_1.1.35.5         lmom_3.2              lubridate_1.9.3      
#>   magrittr_2.0.3        markdown_1.13         MASS_7.3-60.2        
#>   Matrix_1.7-0          MatrixModels_0.5.3    maxstat_0.7.25       
#>   medicaldata_0.2.0     memoise_2.0.1         methods_4.4.1        
#>   mgcv_1.9.1            microbenchmark_1.5.0  mime_0.12            
#>   minqa_1.2.8           mnormt_2.1.1          modelr_0.1.11        
#>   moments_0.14.1        munsell_0.5.1         MVN_5.9              
#>   mvtnorm_1.3-1         nlme_3.1-164          nloptr_2.1.1         
#>   nnet_7.3-19           nortest_1.0-4         numDeriv_2016.8.1.1  
#>   openssl_2.2.2         parallel_4.4.1        pbkrtest_0.5.3       
#>   pillar_1.9.0          pkgconfig_2.0.3       plyr_1.8.9           
#>   png_0.1.8             polynom_1.4.1         prettyunits_1.2.0    
#>   processx_3.8.4        progress_1.2.3        proxy_0.4-27         
#>   ps_1.8.0              psych_2.4.6.26        purrr_1.0.2          
#>   quantreg_5.98         R6_2.5.1              ragg_1.3.3           
#>   rappdirs_0.3.3        RColorBrewer_1.1-3    Rcpp_1.0.13          
#>   RcppEigen_0.3.4.0.2   reactable_0.4.4       reactR_0.6.1         
#>   readr_2.1.5           readxl_1.4.3          rematch_2.0.0        
#>   rematch2_2.1.2        reprex_2.1.1          rlang_1.1.4          
#>   rmarkdown_2.28        rootSolve_1.8.2.4     rpart_4.1.23         
#>   rstatix_0.7.2         rstudioapi_0.16.0     rvest_1.0.4          
#>   sass_0.4.9            scales_1.3.0          selectr_0.4.2        
#>   smd_0.7.0             snakecase_0.11.1      SparseM_1.84.2       
#>   splines_4.4.1         stats_4.4.1           stringi_1.8.4        
#>   stringr_1.5.1         survival_3.6-4        survminer_0.4.9      
#>   survMisc_0.5.6        svglite_2.1.3         sys_3.4.3            
#>   systemfonts_1.1.0     textshaping_0.4.0     tibble_3.2.1         
#>   tidyr_1.3.1           tidyselect_1.2.1      tidyverse_2.0.0      
#>   timechange_0.3.0      tinytex_0.53          tools_4.4.1          
#>   tzdb_0.4.0            utf8_1.2.4            utils_4.4.1          
#>   uuid_1.2.1            V8_5.0.1              vctrs_0.6.5          
#>   vembedr_0.1.5         viridis_0.6.5         viridisLite_0.4.2    
#>   vroom_1.6.5           withr_3.0.1           xfun_0.48            
#>   xml2_1.3.6            xtable_1.8-4          yaml_2.3.10          
#>   zoo_1.8-12

Referencias

1.
Higgins P. Medicaldata: Data package for medical datasets [Internet]. 2023. Available from: https://higgi13425.github.io/medicaldata/
2.
Tinker JH, Tse JC, Rimm EB, Hussain A, En@ F. ANESTHETIC ACTIONS AND OUTCOMES SECTION EDITOR predicting difficult endotracheal intubation in surgical patients scheduled for general anesthesia: A prospective blind study.
3.
Abdallah R, Galway U, You J, Kurz A, Sessler DI, Doyle DJ. A randomized comparison between the pentax aws video laryngoscope and the macintosh laryngoscope in morbidly obese patients. Anesthesia and Analgesia. 2011;113:1082–7.
4.
Carvalho CC de, Silva DM da, VM L, Santos TGB dos, IC A, GM P. Videolaryngoscopy vs. Direct macintosh laryngoscopy in tracheal intubation in adults: A ranking systematic review and network meta-analysis. Anaesthesia [Internet]. 2022;77:326–38. Available from: https://associationofanaesthetists-publications.onlinelibrary.wiley.com/doi/abs/10.1111/anae.15626
5.
Sjoberg DD, Whiting K, Curry M, Lavery JA, Larmarange J. Reproducible summary tables with the gtsummary package. The R Journal [Internet]. 2021;13:570–80. Available from: https://doi.org/10.32614/RJ-2021-053
6.
Gentleman R, Hornik K, Parmigiani G. Series editors. Available from: http://www.springer.com/series/6991
7.
Bernard R. Fundamentals of biostatistics. Seventh Edition. 2010;
8.
Daniel CLCWW. Biostatistics a foundation for analysis inthe health sciences. Wiley. 2013;Tenth edition.
9.
Melis GG, Cadarso-Suárez C. El modelo de riesgos proporcionales de cox y sus extensiones. Impacto en estadística y biomedicina. La Gaceta de la RSME [Internet]. 2017;20:513–38. Available from: https://grbio.upc.edu/en/shared/gacrsme203cox.pdf