Instalación de ggplot2
install.packages("ggplot2")Al finalizar esta sesión, el alumnado será capaz de:
Preparación de la sesión.
Instalación de los paquetes necesarios
Si has tenido problemas, avisa al profesor o profesora responsable.
Otras opciones de instalación: web de BioestadisticaR2
Como en prácticas anteriores, algunas de las cuestiones de esta práctica requieren hacer cálculos, pero otras son puramente conceptuales. Recuerda que lo importante es que entiendas lo que se pregunta y sepas razonar la respuesta. Como siempre, toma nota de todo aquello que consideres relevante.
Los siguientes recursos se abren en una nueva pestaña del navegador:
A continuación se presentan los valores correspondientes a un biomarcador relacionado con la función renal en dos grupos de 25 pacientes. El primer grupo no está sometido a tratamiento (se le administra un placebo) y actúa como grupo control. El segundo grupo está sometido a un tratamiento cuyo objetivo es regular los niveles del biomarcador.
shapiro.test()) y explica la conclusión.testnormal() del paquete BioestadisticaR2 para estudiar si la distribución del biomarcador puede considerarse normal en cada uno de los grupos (en esta función, utiliza el argumento qq=TRUE para que muestre el diagrama Q-Q).## Introducimos los datos ----
ctrl <- c(
13.7,
17.0,
36.8,
19.2,
12.8,
43.0,
11.1,
6.5,
8.3,
12.1,
21.4,
6.1,
15.2,
11.5,
14.5,
13.0,
10.3,
9.4,
27.7,
32.4,
34.1,
12.7,
7.9,
22.1,
13.6
)
tto <- c(
13.5,
11.6,
13.0,
16.1,
15.1,
12.6,
12.9,
14.0,
15.0,
13.6,
14.4,
13.9,
12.7,
14.0,
16.2,
12.6,
15.2,
15.3,
16.9,
14.1,
13.3,
13.7,
12.5,
14.9,
14.2
)
## Distribución ----
### Grupo control ----
hist(ctrl, freq = FALSE) # histograma
lines(density(ctrl)) # curva KDE
shapiro.test(ctrl)
### Grupo tratamiento ----
hist(tto, freq = FALSE) # histograma
lines(density(tto)) # curva KDE
shapiro.test(tto)
# Realizamos el análisis con la función de BioestadisticaR2
library(BioestadisticaR2)
testnormal(ctrl, qq = TRUE)
testnormal(tto, qq = TRUE)En una consulta de Enfermería de Atención Primaria se ha implementado un nuevo protocolo de suplementación oral con hierro en pacientes diagnosticados de anemia ferropénica. El objetivo del protocolo es mejorar el control clínico de los pacientes y alcanzar niveles adecuados de hemoglobina.
Tras 8 semanas de tratamiento, la enfermera quiere evaluar si el protocolo está siendo eficaz. Para ello selecciona una muestra de 21 pacientes con anemia ferropénica en seguimiento y mide la hemoglobina (g/dL) tras el tratamiento. El criterio clínico de referencia establece que un valor medio de ≥ 10 g/dL en mujeres indica un buen control. Los datos observados son:
Utilizando la función testt()del paquete BioestadisticaR2
testt() ¿crees que es oportuno utilizar un test para la media basado en la normalidad?t.test()). Compara los resultados con la salida anterior.# Introducimos los datos
hb <- c(
11.8,
12.4,
12.1,
11.5,
12.9,
13.2,
11.9,
12.6,
12.3,
11.7,
12.8,
13.0,
11.6,
12.2,
12.7,
13.1,
11.4,
12.5,
12.0,
12.9,
13.3,
11.8,
12.6,
12.4,
12.7
)
mean(hb)
sd(hb)
# Realizamos el test con el código base de R
t.test(x = hb, mu = 10, alternative = "greater")
# Realizamos el test con la función de BioestadisticaR2
testt(m = hb, m0 = 10)En una consulta de Enfermería de Atención Primaria se desea evaluar la calidad del control de la hipertensión arterial en los pacientes diagnosticados y en seguimiento. De acuerdo con los estándares asistenciales, se considera aceptable que como máximo el 30% de los pacientes presenten cifras de presión arterial no controladas.
No obstante, existe la sospecha de que en esta consulta la situación podría ser menos favorable. Con el fin de comprobarlo, se lleva a cabo una auditoría clínica en la que se selecciona una muestra aleatoria de 150 pacientes hipertensos. De ellos, 54 presentan HTA no controlada.
prop.test()testp() del paquete BioestadisticaR2Muchas funciones estadísticas de R utilizan una sintaxis basada en fórmulas, del tipo:
Para poder trabajar con esta sintaxis, es imprescindible que los datos estén organizados en un data frame y que exista una variable de agrupación que indique a qué grupo pertenece cada observación o cada paciente.
En la práctica, esto significa que:
Vamos a ver cómo automatizar la creación de este tipo de data frame cuando partimos de dos vectores numéricos independientes: uno correspondiente a un grupo A y otro a un grupo B.
La función rep() como herramienta clave
La automatización se basa en la función rep(), que permite repetir valores de forma controlada.
En su forma más sencilla, rep() replica el valor indicado en el argumento x tantas veces como especifique el argumento times. Por ejemplo:
Si ambos argumentos (x y times) son vectores, rep() actúa posición a posición: cada elemento de x se repite tantas veces como indique el elemento correspondiente de times. Podemos comprobarlo con el siguiente ejemplo:
El resultado es un vector con cinco “A” seguidos de tres “B”.
Además, recuerda que en R no es necesario indicar el nombre de los argumentos si se indican en el mismo orden en que están definidos en la función. Por tanto, el código anterior es equivalente a:
length()Otro ingrediente fundamental es la función length(x), que devuelve el número de elementos de un vector x. Esto nos permite escribir código general y reutilizable, sin necesidad de contar manualmente cuántas observaciones hay en cada grupo.
Ya estamos en condiciones de crear un data frame adecuado para trabajar con fórmulas del tipo
Consideremos los siguientes vectores de datos que constituirán la variable respuesta:
A partir de ellos, construimos el data frame de la siguiente forma:
Esta estructura de datos es fundamental para realizar análisis comparativos con muestras independientes. La idea clave es no manejar la información en vectores separados, sino en un data frame que contenga:
Utilizando los datos de la Sección 1.1.1, construye un data frame llamado datosbiocon las variables biomarcador y grupo (esta última con valores control y tratamiento). Una vez elaborado, visualiza el data frame obtenido.
Diagramas comparativos que usan fórmulas. Utiliza el data frame obtenido para representar los diagramas comparativos que se proponen a continuación. Los argumentos deben ser: la fórmula biomarcador ~ grupo y el nombre del data.frame data=datosbio
boxplot())stripchart(). Para generarlo, se emplean los mismos argumentos utilizados en la figura anterior; merece la pena, además, experimentar con el argumento method = "jitter", que introduce un pequeño desplazamiento aleatorio en los puntos y facilita la visualización cuando existen solapamientos.________
La sintaxis que debes utilizar es función(biomarcador~grupo, data=datosbio). A stripchart() puedes añadirle al final method=jitter para comprobar su efecto. También puedes probar a cambiar el color, por ejemplo añade el argumento col="steelblue" o cualquier otro nombre de color (los nombres de color los puedes consultar con la función colors(), sin argumentos).
El lenguaje base de R implementa tres métodos para contrastar la homogeneidad de varianzas entre muestras independientes
var.test()bartlett.test()fligner.test()añadiendo, a continuación, el argumento data=nombre del data.frame.
Utilizando el data frame datosbio que hemos elaborado en el apartado anterior
# este es el código completo para generar el dataframe datosbio
ctrl <- c(
13.7,
17.0,
36.8,
19.2,
12.8,
43.0,
11.1,
6.5,
8.3,
12.1,
21.4,
6.1,
15.2,
11.5,
14.5,
13.0,
10.3,
9.4,
27.7,
32.4,
34.1,
12.7,
7.9,
22.1,
13.6
)
tto <- c(
13.5,
11.6,
13.0,
16.1,
15.1,
12.6,
12.9,
14.0,
15.0,
13.6,
14.4,
13.9,
12.7,
14.0,
16.2,
12.6,
15.2,
15.3,
16.9,
14.1,
13.3,
13.7,
12.5,
14.9,
14.2
)
datosbio <- data.frame(
biomarcador = c(ctrl, tto),
grupo = factor(c(
rep("control", length(ctrl)),
rep("tratamiento", length(ctrl))
))
)Discute cuál, o cuáles, de las siguientes afirmaciones son correctas desde el punto de vista inferencial:
Al final aparecen unas soluciones muy resumidas, recuerda que debes intentar resolver los ejercicios por tu cuenta
Vamos a analizar algunas variables de la base de datos colesterol01.rds que ya hemos manejado en la práctica 2. Aquí tienes el código para leerla:
Como debemos hacer siempre, comprueba que se han leído bien los datos (por ejemplo con el comando head())
A modo de recordatorio, vamos a familiarizarnos brevemente con el perfil de los sujetos de esta base de datos:
BioestadisticaR2 y prueba esta función grps(datos$colesterol, f=datos$sexo)Vamos a hacer algunas inferencias sobre los niveles de colesterol y lipoproteinas de alta y baja densidad (HDL y LDL, respectivamente).
testnormal() del paquete BioestadisticaR2 estudia la normalidad de las variables colesterol, HDL y LDL. Indica el resultado tal y como lo pondrías en el informe de un TFG o de un artículo (Nota: añade el argumento qq=TRUE a la función testnormal() para que proporcione el diagrama Q-Q).t.test() del código base de R y testt() de BioestadisticaR2, compara los resultados de ambas funciones. Observa que testt() da el contraste bilateral y solo uno de los dos contrastes unilaterales posibles. Justifica por qué crees que da solo uno y cuál es la desigualdad que contrasta.Seguimos trabajando con los datos del archivo colesterol_01.rds.
Se trata de investigar las diferencias en la distribución del nivel de colesterol en hombres y mujeres.
var.test()) y critica si lo crees apropiado dado el resultado del test de normalidad. Realiza también el test no paramétrico de Fligner–Killeen (fligner.test()). Compara los resultados y da una conclusión final.plot(density(datos$colesterol))| grupo | n | media | dt |
|---|---|---|---|
| mujer | 60 | 158.3 | 28.50 |
| hombre | 90 | 152.2 | 25.89 |
| Total | 150 | 154.6 | 27.04 |
La distribución del nivel de colesterol presenta asimetría positiva (cola larga a la derecha) de forma significativa. Así lo ponen de manifesto los diagramas KDE y Q-Q (en este último, la distribución de los valores observados tiene la forma de U característica de este tipo de patrón asimétrico). El test de normalidad de Shapiro-Wilk también resulta significativo (W=0.959, p < 0.001), de manera que se puede rechazar que esta variable tenga distribución normal. No obstante, la asimetría es moderada y el tamaño de muestra es suficientemente grande (n=150 > 60) como para poder aplicar métodos inferenciales de tipo paramétrico.
El resultado para las variables HDL y LDL es similar.
\[ \begin{cases} \text{H}_0: & \mu \le 200 \\ \text{H}_1: & \mu > 200 \end{cases} \]
Anteriormente, hemos obtenido que la media del nivel de colesterol es 154.6 mg/dL. Esto implica que la información muestral es incompatible con la hipótesis alternativa, ya que 154 < 200 mg/dL. Por tanto, no hace falta realizar el test. Directamente se declara no significativo.
La función testt() de BioestadisticaR2 hace, automáticamente, los contrastes bilateral y el unilateral que sea compatible con la información muestral. En este caso, como la media del nivel de colesterol en hombres es 152.2 > 150 mg/dL, hace el contraste para \(\small \text{H}_1: \mu>150\), ya que la información muestral es compatible con esta hipótesis. El contraste \(\small \text{H}_1: \mu<150\) se omite por incompatibilidad.
No pueden considerarse normales.
El test de Fisher no es significativo (p=0.4089). Aunque este test es muy sensible a la falta de normalidad, el test no paramétrico de Fligner-Killen da un resultado similar (p=0.3997), con lo cual no se puede rechazar la hipótesis de homogeneidad de varianzas (parece que el test de Fisher está funcionando bien, las muestras son grandes).