meldata <- boot::melanomaR para Ciencia de Datos de Salud
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.
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 + p2Deberí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 + p2FIGURA 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 / p28.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
| 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"))| 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)| 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
| 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" )| 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
)| 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 .