R para Ciencia de Datos de Salud

Author

Ewen Harrison y Riinu Pius / traducido por A.Carolina Ledezma-Carrizalez

Capítulo 8 Trabajar con variables de resultado categóricos

De repente, Christopher Robin comenzó a contarle a Pooh sobre algunas de las cosas: la gente se llamaba Reyes y Reinas y algo llamado Factores… y Pooh dijo “¡Oh!” y pensé en lo maravilloso que sería tener un cerebro real que pudiera decirte cosas. AA Milne, La casa de Pooh Corner (1928)

8.1 Factores

Dijimos anteriormente que los datos continuos se pueden medir y los datos categóricos se pueden contar, lo cual es útil recordar. Los datos categóricos pueden ser:

  • Factor
    • un conjunto fijo de nombres/cadenas o números
    • estos pueden tener un orden inherente (1º, 2º 3º) - factor ordinal
    • o no puede (femenino, masculino)
  • Personaje
    • secuencias de letras, números o símbolos
  • Lógico
    • que contiene solo VERDADERO o FALSO

Los datos de salud están repletos de factores. Ya sean resultados como muerte, recurrencia o readmisión. O predictores como las etapas del cáncer, el quintil de privación o el tabaquismo. Por lo tanto, es esencial sentirse cómodo manipulando factores y tratando con resultados que son categóricos.

8.2 La pregunta

Usaremos el conjunto de datos clásico “Supervivencia del melanoma maligno” que se incluye en el paquete de inicio . Los datos consisten en mediciones realizadas en pacientes con melanoma maligno, un tipo de cáncer de piel. A cada paciente se le extirpó el tumor mediante cirugía en el Departamento de Cirugía Plástica del Hospital Universitario de Odense, Dinamarca, entre 1962 y 1977.

A los efectos de esta discusión, estamos interesados ​​en la asociación entre la ulceración del tumor y la muerte por melanoma.

8.3 Obtener los datos

La página de Ayuda (F1 en boot::melanoma) nos brinda su diccionario de datos incluyendo la definición de cada variable y la codificación utilizada.

meldata <- boot::melanoma

8.4 Comprobar los datos

Como siempre, revise cuidadosamente cualquier nuevo conjunto de datos antes de comenzar el análisis.

library(tidyverse)
library(ggplot2)
library(finalfit)
library(forcats)
library(dbplyr)
library(lattice)
library(survival)
library(Formula)
library(Hmisc)
theme_set(theme_bw())
meldata %>% glimpse()
Rows: 205
Columns: 7
$ time      <dbl> 10, 30, 35, 99, 185, 204, 210, 232, 232, 279, 295, 355, 386,…
$ status    <dbl> 3, 3, 2, 3, 1, 1, 1, 3, 1, 1, 1, 3, 1, 1, 1, 3, 1, 1, 1, 1, …
$ sex       <dbl> 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, …
$ age       <dbl> 76, 56, 41, 71, 52, 28, 77, 60, 49, 68, 53, 64, 68, 63, 14, …
$ year      <dbl> 1972, 1968, 1977, 1968, 1965, 1971, 1972, 1974, 1968, 1971, …
$ thickness <dbl> 6.76, 0.65, 1.34, 2.90, 12.08, 4.84, 5.16, 3.22, 12.88, 7.41…
$ ulcer     <dbl> 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
meldata %>% ff_glimpse()
$Continuous
              label var_type   n missing_n missing_percent   mean     sd    min
time           time    <dbl> 205         0             0.0 2152.8 1122.1   10.0
status       status    <dbl> 205         0             0.0    1.8    0.6    1.0
sex             sex    <dbl> 205         0             0.0    0.4    0.5    0.0
age             age    <dbl> 205         0             0.0   52.5   16.7    4.0
year           year    <dbl> 205         0             0.0 1969.9    2.6 1962.0
thickness thickness    <dbl> 205         0             0.0    2.9    3.0    0.1
ulcer         ulcer    <dbl> 205         0             0.0    0.4    0.5    0.0
          quartile_25 median quartile_75    max
time           1525.0 2005.0      3042.0 5565.0
status            1.0    2.0         2.0    3.0
sex               0.0    0.0         1.0    1.0
age              42.0   54.0        65.0   95.0
year           1968.0 1970.0      1972.0 1977.0
thickness         1.0    1.9         3.6   17.4
ulcer             0.0    0.0         1.0    1.0

$Categorical
data frame with 0 columns and 205 rows

Como puede verse, todas las variables están actualmente codificadas como continuas/numéricas. El <dbl>significa ‘doble’, que significa numérico que proviene de ‘coma flotante de doble precisión’, un término informático incómodo.

8.5 Recodificar los datos

Es muy importante que las variables estén codificadas correctamente para todas las funciones de trazado y análisis. Usando el diccionario de datos, convertiremos las variables categóricas en factores.

En la siguiente sección, convertimos las variables continuas a factors(por ejemplo, sex %>% factor() %>%), luego usamos el paquete forcats para recodificar los niveles de los factores. Las bases de datos modernas (como REDCap) pueden brindarle un script R para recodificar su conjunto de datos específico. Esto significa que no siempre tiene que volver a codificar sus factores de números a nombres manualmente. Pero siempre estará registrando variables durante las etapas de exploración y análisis, por lo que es importante seguir lo que sucede aquí.

meldata <- meldata %>% 
  mutate(sex.factor =             # Hacer una nueva variable 
           sex %>%                # de la variable existente
           factor() %>%           # convertir en factor
           fct_recode(            # una de las funciones de forcats 
             "Female" = "0",      # la una a la izquierda,y la vieja a la derecha
             "Male"   = "1") %>% 
           ff_label("Sex"),       # Etiqueta opcional de Finalfit 
         
         # Lo mismo pero más código condensado:
         ulcer.factor = factor(ulcer) %>% 
           fct_recode("Present" = "1",
                      "Absent"  = "0") %>% 
           ff_label("Ulcerated tumour"),
         
         status.factor = factor(status) %>% 
           fct_recode("Died melanoma"       = "1",
                      "Alive"               = "2",
                      "Died - other causes" = "3") %>% 
           ff_label("Status"))

Hemos formateado la recodificación de las sexvariables para que estén en varias líneas, para que le resulte más fácil ver los pasos exactos incluidos. Hemos condensado las otras recodificaciones (p. ej., ulcer.factor = factor(ulcer) %>%), pero hace exactamente lo mismo que la primera.

8.6 ¿Debo convertir una variable continua en una variable categórica?

Esta es una pregunta común y algo que se hace con frecuencia. Tomemos por ejemplo la variable edad. ¿Es mejor dejarlo como una variable continua o dividirlo en categorías, por ejemplo, 30 a 39, etc.?

La clara desventaja de hacer esto es que la información se desecha. Lo cual se siente como algo malo que hacer. Esto es particularmente importante si las categorías que se crean son grandes.

Por ejemplo, si la edad se dividió en “joven” y “viejo” a los 42 años (la edad media actual en Europa), es probable que se haya descartado información relevante para una serie de análisis.

En segundo lugar, es una práctica imperdonable intentar repetidamente diferentes cortes de una variable continua para obtener un resultado estadísticamente significativo. Esto se hace más comúnmente en las pruebas de precisión diagnóstica, donde se elige un umbral para considerar positivo un resultado continuo de la prueba post hoc para maximizar la sensibilidad/especificidad, pero luego no se valida en una cohorte independiente.

Pero también hay ventajas en convertir una variable continua en categórica. Digamos que la relación entre la edad y un resultado no es lineal, sino que tiene forma de u, entonces ajustar una línea de regresión es más difícil. Si la edad se divide en bandas de 10 años y se ingresa en una regresión como factor, entonces esta no linealidad ya se tiene en cuenta.

En segundo lugar, cuando se comunican los resultados de un análisis a un público lego, puede ser más fácil utilizar una representación categórica. Por ejemplo, una probabilidad de muerte 1,8 veces mayor en personas de 70 años en comparación con personas de 40 años puede ser más fácil de entender que un aumento de 1,02 veces por año.

Entonces, ¿cuál es la respuesta? No lo hagas a menos que tengas que hacerlo. Grafique y comprenda primero la variable continua. Si lo hace, trate de no tirar demasiada información. Repita sus análisis tanto con los datos continuos como con los datos categóricos para asegurarse de que no haya diferencias en la conclusión (a menudo llamado análisis de sensibilidad).

# Resumen de Edades

meldata$age %>% 
  summary()
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   4.00   42.00   54.00   52.46   65.00   95.00 
meldata %>% 
  ggplot(aes(x = age)) + 
  geom_histogram()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Hay diferentes formas de convertir una variable continua en un factor. Es posible que desee crear una serie de intervalos de igual longitud. La cut()función se puede utilizar para esto.

La Figura 8.1 ilustra diferentes opciones para esto. Sugerimos no usar la labelopción de la cut() función para evitar errores, si los datos subyacentes cambian o cuando el código se copia y se reutiliza. Una mejor práctica es recodificar los niveles usando fct_recode como se indicó anteriormente.

Los intervalos en la salida son notación matemática estándar. Un corchete indica que el valor está incluido en el intervalo y un corchete indica que el valor está excluido.

Tenga en cuenta el requisito para include.lowest = TRUEcuando usted mismo especifica las pausas y el punto de corte más bajo es también el valor de datos más bajo. Esto debería quedar claro en la Figura 8.1 .

FIGURA 8.1: Cutuna variable continua en una variable categórica

8.6.1 Igualdad de intervalos vs cuantiles

Tenga claro si desea cortar los datos para que los intervalos tengan la misma longitud. O si desea cortar los datos para que haya proporciones iguales de casos (pacientes) en cada nivel.

Intervalos iguales:

meldata <- meldata %>% 
  mutate(
    age.factor = 
      age %>%
      cut(4)
  )
meldata$age.factor %>%
  summary()
(3.91,26.8] (26.8,49.5] (49.5,72.2] (72.2,95.1] 
         16          68         102          19 

Cuantiles:

meldata <- meldata %>% 
  mutate(
    age.factor = 
      age %>%
      Hmisc::cut2(g=4) #Nota, CUT2 proviene del paquete HMISC
   )

meldata$age.factor %>% 
  summary()
[ 4,43) [43,55) [55,66) [66,95] 
     55      49      53      48 

Usando la función de corte (cut), una variable continua se puede convertir en una categórica:

meldata <- meldata %>% 
  mutate(
    age.factor = 
      age %>%
      cut(breaks = c(4,20,40,60,95), include.lowest = TRUE) %>% 
      fct_recode(
        "≤20"      =  "[4,20]",
        "21 to 40" = "(20,40]",
        "41 to 60" = "(40,60]",
        ">60"      = "(60,95]"
      ) %>% 
      ff_label("Age (years)")
  )
head(meldata$age.factor)
[1] >60      41 to 60 41 to 60 >60      41 to 60 21 to 40
Levels: ≤20 21 to 40 41 to 60 >60

8.7 El Plot de los datos

Estamos interesados en la asociación entre la ulceración tumoral y la muerte por melanoma. Entonces, para empezar, simplemente contamos el número de pacientes con tumores ulcerados que fallecieron. Es útil graficar esto como conteos pero también como proporciones. Lo que estás comparando son proporciones, pero también quieres saber los números absolutos.

p1 <- meldata %>% 
  ggplot(aes(x = ulcer.factor, fill = status.factor)) + 
  geom_bar() + 
  theme(legend.position = "none")

p2 <- meldata %>% 
  ggplot(aes(x = ulcer.factor, fill = status.factor)) + 
  geom_bar(position = "fill") + 
  ylab("proportion")

library(patchwork)

p1 + p2

Debería ser obvio que más muertes por melanoma en el grupo de tumor ulcerado en comparación con el grupo de tumor no ulcerado. El apilamiento es órdenes de arriba a abajo por defecto. Esto se puede ajustar fácilmente cambiando el orden de los niveles dentro del factor (consulte la renivelación a continuación). Este orden predeterminado funciona bien para las variables binarias: el “sí” o el “1” es el más bajo y se puede comparar fácilmente. Este orden de esta variable en particular es inusual; sería más común tener, por ejemplo alive = 0, died = 1. Una opción rápida es simplemente invertir el orden de los niveles en la trama.

p1 <- meldata %>% 
  ggplot(aes(x = ulcer.factor, fill = status.factor)) + 
  geom_bar(position = position_stack(reverse = TRUE)) + 
  theme(legend.position = "none")

p2 <- meldata %>% 
  ggplot(aes(x = ulcer.factor, fill = status.factor)) + 
  geom_bar(position = position_fill(reverse = TRUE)) + 
  ylab("proportion")

library(patchwork)
p1 + p2

Gráfico de barras: resultado después de la cirugía para pacientes con melanoma ulcerado, niveles invertidos.

FIGURA 8.3: Gráfico de barras: resultado después de la cirugía para pacientes con melanoma ulcerado, niveles invertidos.

Solo a partir de la gráfica, la muerte por melanoma en el grupo de tumores ulcerados es de alrededor del 40% y en el grupo no ulcerado de alrededor del 13%. El número de pacientes incluidos en el estudio no es enorme, sin embargo, esto todavía parece una diferencia real dado el tamaño del efecto.

También podemos estar interesados en explorar la modificación del efecto potencial, las interacciones y los factores de confusión. Una vez más, le instamos a que primero los visualice, en lugar de ir directamente a un modelo.

p1 <- meldata %>% 
  ggplot(aes(x = ulcer.factor, fill=status.factor)) + 
  geom_bar(position = position_stack(reverse = TRUE)) +
  facet_grid(sex.factor ~ age.factor) + 
  theme(legend.position = "none")
p2 <- meldata %>% 
  ggplot(aes(x = ulcer.factor, fill=status.factor)) + 
  geom_bar(position = position_fill(reverse = TRUE)) +
  facet_grid(sex.factor ~ age.factor)+ 
  theme(legend.position = "bottom")
p1 / p2

Facetted bar plot Resultado después de la cirugía para pacientes con melanoma ulcerado agregado por sexo y edad.

8.8 Niveles de factor de grupo juntos -fct_collapse()

Nuestra pregunta se relaciona con la asociación entre la ulceración del tumor y la muerte por melanoma. La medida de resultado tiene tres niveles, como puede verse. Para nuestros propósitos aquí, generaremos una variable de mortalidad específica de la enfermedad ( status_dss), combinando “Murió - otras causas” y “Vivo”.

meldata <- meldata %>%
  mutate(
    status_dss = fct_collapse(
      status.factor,
      "Alive" = c("Alive", "Died - other causes"))
  )

8.9 Cambiar el orden de los valores dentro de un factor -fct_relevel()

# dss -supervivencia específica de la enfermedad
meldata$status_dss %>% levels()
[1] "Died melanoma" "Alive"        

La razón por la que “Vivo” (en ingles Alive) está en segundo lugar, en lugar de alfabético, es que se recodificó desde “2” y se retuvo ese orden. Sin embargo, si queremos hacer comparaciones relativas a “Alive”, necesitamos moverlo al frente usando fct_relevel().

meldata <- meldata %>% 
  mutate(status_dss = status_dss %>%
           fct_relevel("Alive")
         )

Se puede especificar cualquier número de niveles de factor en fct_relevel()

8.10 Resumir factores con finalfit

Nuestro propio paquete finalfit proporciona funciones convenientes para resumir y comparar factores, produciendo tablas finales para su publicación

Tabla dos-por-dos con finalfit: Muertos con melanoma por estado de ulceración tumoral.
label levels Alive Died melanoma
Ulcerated tumour Absent 99 (66.9) 16 (28.1)
Present 49 (33.1) 41 (71.9)

finalfites útil para resumir múltiples variables. A menudo queremos resumir más de un factor o variable continua contra nuestra dependentvariable de interés. Piense en la Tabla 1 en un artículo de revista.

Se puede agregar cualquier número de variables explicativas continuas o categóricas.

library(finalfit)
meldata %>% 
  summary_factorlist(dependent = "status_dss", 
                     explanatory = 
                       c("ulcer.factor", "age.factor", 
                         "sex.factor", "thickness"))
Múltiples variables por resultado: Resultado después de la cirugía para el melanoma por paciente y factores de la enfermedad.
label levels Alive Died melanoma
Ulcerated tumour Absent 99 (66.9) 16 (28.1)
Present 49 (33.1) 41 (71.9)
Age (years) ≤20 6 (4.1) 3 (5.3)
21 to 40 30 (20.3) 7 (12.3)
41 to 60 66 (44.6) 26 (45.6)
>60 46 (31.1) 21 (36.8)
Sex Female 98 (66.2) 28 (49.1)
Male 50 (33.8) 29 (50.9)
thickness Mean (SD) 2.4 (2.5) 4.3 (3.6)

8.11 Chi-cuadrado de Pearson y pruebas exactas de Fisher

La prueba de independencia de chi-cuadrado de Pearson ( ) se utiliza para determinar si dos variables categóricas son independientes en una población determinada. La independencia aquí significa que las frecuencias relativas de una variable son las mismas en todos los niveles de otra variable.x2χ2

Un escenario común para esto es la clásica mesa de 2x2. Esto se refiere a dos variables categóricas con exactamente dos niveles cada una, como se muestra en la Tabla 8.1 anterior. La hipótesis nula de independencia para esta pregunta en particular es que no hay diferencia en la proporción de pacientes con tumores ulcerados que mueren (45,6 %) en comparación con los tumores no ulcerados (13,9 %). A partir de las frecuencias sin procesar, parece haber una gran diferencia, como notamos en el gráfico que hicimos arriba.

8.11.1 Base R

Base R tiene funciones confiables para todas las pruebas estadísticas comunes, pero a veces es un poco inconveniente extraer resultados.

Se puede construir una tabla de conteos, ya sea usando $para identificar columnas, o usando la with()función.

table(meldata$ulcer.factor, meldata$status_dss) # Ambos dan el mismo resultado
with(meldata, table(ulcer.factor, status_dss))
         
          Alive Died melanoma
  Absent     99            16
  Present    49            41

Cuando se trabaja con funciones de R más antiguas, un atajo útil es el exposition pipe-operator( %$%) del paquete magrittr , hogar del operador de tubería directa estándar ( %>%). El operador de tubería de exposición expone columnas de marco de datos/tibble a la izquierda a la función que sigue a la derecha. Es más fácil verlo en acción haciendo una tabla de conteo.

library(magrittr)
meldata %$%        # note este signo $ aqui
  table(ulcer.factor, status_dss)
            status_dss
ulcer.factor Alive Died melanoma
     Absent     99            16
     Present    49            41

La tabla de conteos se puede pasar a prop.table()para proporciones.

meldata %$%
  table(ulcer.factor, status_dss) %>% 
  prop.table(margin = 1)     # 1: fila, 2: columna etc.
            status_dss
ulcer.factor     Alive Died melanoma
     Absent  0.8608696     0.1391304
     Present 0.5444444     0.4555556

De manera similar, se puede pasar la tabla de conteos chisq.test()para realizar la prueba de chi-cuadrado

meldata %$%        # note este signo $ aqui
  table(ulcer.factor, status_dss) %>% 
  chisq.test()

    Pearson's Chi-squared test with Yates' continuity correction

data:  .
X-squared = 23.631, df = 1, p-value = 1.167e-06

El resultado se puede extraer en un tibble usando la tidy()función del paquete broom .

library(broom)
meldata %$%        # note este signo $ aqui
  table(ulcer.factor, status_dss) %>% 
  chisq.test() %>% 
  tidy()
# A tibble: 1 × 4
  statistic    p.value parameter method                                         
      <dbl>      <dbl>     <int> <chr>                                          
1      23.6 0.00000117         1 Pearson's Chi-squared test with Yates' continu…

La función chisq.test()aplica la corrección de continuidad de Yates por defecto. La interpretación estándar supone que la probabilidad discreta de los recuentos observados en la tabla se puede aproximar mediante la distribución continua de chi-cuadrado. Esto introduce algún error. La corrección implica restar 0,5 de la diferencia absoluta entre cada valor observado y esperado. Esto es particularmente útil cuando los recuentos son bajos, pero puede eliminarse si lo desea chisq.test(..., correct = FALSE).

8.12 Prueba exacta de Fisher

Una suposición comúnmente declarada de la prueba de chi-cuadrado es el requisito de tener un recuento esperado de al menos 5 en cada celda de la tabla 2x2. Para tablas más grandes, todos los recuentos esperados deben ser y no más del 20 % de todas las celdas deben tener recuentos esperados . Si no se cumple este supuesto, una prueba alternativa es la prueba exacta de Fisher. Por ejemplo, si estamos probando en una tabla de 2x4 creada a partir de nuestra variable y , entonces recibimos una advertencia.

1>1<5 age.factor status_dss

meldata %$%         # note este signo $ aqui
  table(age.factor, status_dss) %>% 
  chisq.test()
Warning in chisq.test(.): Chi-squared approximation may be incorrect

    Pearson's Chi-squared test

data:  .
X-squared = 2.0198, df = 3, p-value = 0.5683

Cambiar a la prueba exacta de Fisher

meldata %$%        # note este signo $ aqui
  table(age.factor, status_dss) %>% 
  fisher.test()

    Fisher's Exact Test for Count Data

data:  .
p-value = 0.5437
alternative hypothesis: two.sided

8.13 Chi-cuadrado / Prueba exacta de Fisher usando finalfit

Es más fácil usar la summary_factorlist()función del paquete finalfit . Incluir p = TRUEen summary_factorlist()agrega una prueba de hipótesis a cada comparación incluida. Por defecto, las pruebas de chi-cuadrado con una corrección de continuidad para las variables categóricas.

library(finalfit)
meldata %>% 
  summary_factorlist(dependent   = "status_dss", 
                     explanatory = "ulcer.factor",
                     p = TRUE)

Tabla de dos por dos con prueba de chi cuadrado usando el ajuste final: resultado después de la cirugía por melanoma por estado de ulceración tumoral.
label levels Alive Died melanoma p
Ulcerated tumour Absent 99 (66.9) 16 (28.1) <0.001
Present 49 (33.1) 41 (71.9)

Adición de más variables:

meldata %>% 
  summary_factorlist(dependent = "status_dss", 
                     explanatory = 
                       c("ulcer.factor", "age.factor", 
                         "sex.factor", "thickness"),
                     p = TRUE)
Warning in chisq.test(age.factor, status_dss): Chi-squared approximation may be
incorrect
Variables múltiples por resultado con pruebas de hipótesis: resultado después de la cirugía por melanoma por factores de paciente y enfermedad (prueba de chi cuadrado).
label levels Alive Died melanoma p
Ulcerated tumour Absent 99 (66.9) 16 (28.1) <0.001
Present 49 (33.1) 41 (71.9)
Age (years) ≤20 6 (4.1) 3 (5.3) 0.568
21 to 40 30 (20.3) 7 (12.3)
41 to 60 66 (44.6) 26 (45.6)
>60 46 (31.1) 21 (36.8)
Sex Female 98 (66.2) 28 (49.1) 0.036
Male 50 (33.8) 29 (50.9)
thickness Mean (SD) 2.4 (2.5) 4.3 (3.6) <0.001

Tenga en cuenta que para las variables expansivas continuas, se realiza una prueba F (ANOVA) de forma predeterminada. Si las variables se consideran no paramétricas ( cont = "mean"), entonces se utiliza una prueba de Kruskal-Wallis.

Cambie a la prueba exacta de Fisher:

meldata %>% 
  summary_factorlist(dependent = "status_dss", 
                     explanatory = 
                       c("ulcer.factor", "age.factor", 
                         "sex.factor", "thickness"),
                     p = TRUE,
                     p_cat = "fisher" )
Variables múltiples por resultado con pruebas de hipótesis: resultado después de la cirugía por melanoma por factores de paciente y enfermedad (prueba exacta de Fisher).
label levels Alive Died melanoma p
Ulcerated tumour Absent 99 (66.9) 16 (28.1) <0.001
Present 49 (33.1) 41 (71.9)
Age (years) ≤20 6 (4.1) 3 (5.3) 0.544
21 to 40 30 (20.3) 7 (12.3)
41 to 60 66 (44.6) 26 (45.6)
>60 46 (31.1) 21 (36.8)
Sex Female 98 (66.2) 28 (49.1) 0.026
Male 50 (33.8) 29 (50.9)
thickness Mean (SD) 2.4 (2.5) 4.3 (3.6) <0.001

Se pueden incluir más opciones:

meldata %>% 
  summary_factorlist(dependent = "status_dss", 
                     explanatory = 
                       c("ulcer.factor", "age.factor", 
                         "sex.factor", "thickness"),
                     p = TRUE,
                     p_cat = "fisher",
                     digits = 
                       c(1, 1, 4, 2,1), #1: mean/median, 2: SD/IQR 
                                      # 3: p-value, 4: count percentage
                     na_include = TRUE, # include missing in results/test
                     add_dependent_label = TRUE
  )
Variables múltiples por resultado con pruebas de hipótesis: opciones que incluyen datos faltantes, redondeos y etiquetas.
Dependent: Status Alive Died melanoma p
Ulcerated tumour Absent 99.0 (66.89) 16.0 (28.07) <0.0001
Present 49.0 (33.11) 41.0 (71.93)
Age (years) ≤20 6.0 (4.05) 3.0 (5.26) 0.5437
21 to 40 30.0 (20.27) 7.0 (12.28)
41 to 60 66.0 (44.59) 26.0 (45.61)
>60 46.0 (31.08) 21.0 (36.84)
Sex Female 98.0 (66.22) 28.0 (49.12) 0.0263
Male 50.0 (33.78) 29.0 (50.88)
thickness Mean (SD) 2.4 (2.5) 4.3 (3.6) <0.0001

8.14 Ejercicios

8.14.1 Ejercicio

Con finalfit, cree una tabla de resumen con “status.factor” como variable dependiente y las siguientes como variables explicativas: sex.factor, ulcer.factor, age.factor, thickness.

Cambie el estadístico de resumen de la variable continua a mediany interquartile rangeen lugar de meany sd.

8.14.2 Ejercicio

Al cambiar una y solo una línea en el siguiente bloque, cree en primer lugar una nueva tabla que muestre el desglose status.factorpor edad y, en segundo lugar, el desglose status.factorpor sexo:

meldata %>%
  count(ulcer.factor, status.factor) %>%
  group_by(status.factor) %>%
  mutate(total = sum(n)) %>%
  mutate(percentage = round(100*n/total, 1)) %>% 
  mutate(count_perc = paste0(n, " (", percentage, ")")) %>% 
  select(-total, -n, -percentage) %>% 
  spread(status.factor, count_perc)

8.14.3 Ejercicio

Ahora produzca estas tablas usando la summary_factorlist()función del paquete finalfit .