Módulo 4: Introducción a la Estadística en R

Mauricio Moreno, PhD

Antes de comenzar

Generalidades

  • Uno de los objetivos de este curso es el evitar en la medida de lo posible el adentrarnos en teoría estadística. Entre los temas que dejaremos de lado están:

    • Teoría de la probabilidad básica

    • Ley de los números grandes

    • Distribución muestral (o de muestreo)

    • Teorema del límite central

    • Descripción a detalle de la distribución normal

    • Descripción a detalle de otras distribuciones

    • Análisis de poder

    • Pruebas para valores discretos univariados

      • Prueba de bondad de ajuste de \(\chi^2\)
    • Pruebas para valores discretos bivariados

      • Prueba de independencia de \(\chi^2\)

      • Prueba exacta de Fisher

  • Sin embargo, es preciso el comenzar por algunas definiciones que inevitablemente serán necesarias para entender de mejor manera el resto del mismo.

  • Para esta sesión vamos a instalar nuevos paquetes: "UsingR", "datarium", "rstatix", "car", "ggeffects", "emmeans", "multcomp", "multcompView", "olsrr", "ggpubr"

  • Para quién esté interesado en un recurso para ver estos temas a profundidad, recomiendo el libro de Danielle Navarro: Learning Statistics with R

Definiciones básicas

Pasos en una investigación

  1. ¿Cuál es la pregunta qué deseo contestar? ¿cuál es mi objetivo?

    • Superioridad de mi tratamiento vs. un control

    • No existe diferencia de mi tratamiento vs. un control

    • Equivalencia de mi tratamiento vs. una referencia

    • Asociación/dependencia/correlación entre una o más variables

  2. ¿Qué tipo de estudio voy a llevar a cabo?

    • Experimental

    • Observacional (*)

  3. ¿Qué tipo de variables voy a medir?

    • Es mi respuesta continua o discreta
  4. ¿Cuál es el dominio de esas variables?

    • Mi respuesta puede tomar cualquier valor real (positivo la mayor parte del tiempo)

Pasos en una investigación

  1. ¿Cuál es el dominio de esas variables? (continuación)

    • Mi respuesta es un porcentaje (entre 0 y 100)

    • Mi respuesta es dicotómica (si/no)

    • Mi respuesta es un conteo (puede ser descrita con números enteros únicamente)

    • Mi respuesta es una proporción (valores entre 0 y 1)

    • Mi respuesta es categórica y representa un orden

    • Mi respuesta es categórica pero no representa un orden

  2. Si mi estudio es experimental, ¿qué diseño experimental voy a utilizar para levantar mis datos?

    • Diseño completamente al azar (DCA)

    • Diseño de bloques completamente al azar (DBCA)

    • Diseño factorial completo (DFC)

    • Diseño cuadrado latino (DCL)

Pasos en una investigación

  1. Si mi estudio es observacional, ¿qué tipo de muestreo voy a llevar a cabo?

    • Simple

    • Estratificado

  2. ¿Cuál debería ser el tamaño de mi muestra?

  3. ¿Qué método(s) estadístico(s) voy a utilizar para analizar mis datos?

¿Qué No debería hacer antes de realizar una investigación?

  • Empezarla sin haber pensado en todas las preguntas anteriores y esperar tener resultados estadísticamente válidos.
  • Un principio básico del método científico es el analizar los datos en base a un protocolo pre-establecido, y NO a decidir qué análisis llevar a cabo una vez que se ven los datos.

Pilares de la inferencia estadística (Diseño de experimentos)

  1. Repetición/Replicación: es la aplicación de los tratamientos a un determinado número de unidades experimentales (al menos 3). Puede ser igual al tamaño de muestra en ciertos casos.

  2. Aleatoriedad/Randomización: la asignación de unidades experimentales a un tratamiento debe realizarse al azar. Esto evita sesgos en las inferencias estadísticas al precautelar la independencia de los datos recolectados.

  3. Balance: se refiere al intentar el siempre tener un número igual de unidades experimentales en los tratamientos de interés. Datos no balanceados requieren de métodos estadísticos corregidos.

Sobre las repeticiones

A veces los recursos para llevar a cabo un estudio son limitados y recurrimos a una de estas prácticas para contar con 3 repeticiones por tratamiento:

Escenario 1: Tengo las cepas A, B, C y D de bacterias degradadoras de nitrógeno y quiero saber cual de ellas tiene la mejor eficiencia a tres concentraciones de nitrógeno. Cada botella con caldo de cultivo es voluminosa y no tengo el espacio necesario para llevar a cabo tres repeticiones por tratamiento. Solución: preparo una botella de caldo por cepa y concentración (12 en total) y tomo 3 medidas (repeticiones) de cada una.

Escenario 2: Tengo dos semillas experimentales de maíz y quiero saber si existe alguna diferencia en la velocidad de crecimiento de estas con respecto a un control. Sin embargo, no cuento con el suficiente número de macetas (9) para plantar las distintas variedades con sus respectivas repeticiones. Solución: En su lugar, cuento con tres macetas y decido plantar tres semillas de cada variedad en cada maceta.

¿Cuál es el problema?, pues que esta prácticas no responderán satisfactoriamente los objetivos de cada investigación

Sobre las repeticiones

  • Existen tres tipos de repeticiones:

    • Repeticiones biológicas: Cuando tomamos una y solo una medida de una unidad experimental (en el primer escenario anterior necesitaríamos 36 botellas, 3 por cada combinación cepa \(\times\) concentración de N)

    • Repeticiones técnicas: Cuando tomamos más de una medida de una unidad experimental (lo que vimos en el primer escenario anterior, 12 botellas, una por cada combinación cepa \(\times\) concentración de N)

    • Pseudo repeticiones: Cuando en el mismo espacio físico (sin barreras claramente establecidas) coloco dos o más unidades experimentales correspondientes al mismo tratamiento (este es el caso del segundo escenario anterior).

Sobre las repeticiones

  • Todas las prácticas son por supuesto adecuadas, siempre y cuando sepamos que se usan para objetivos de investigación distintos, y los métodos de análisis también son distintos:

    • Repeticiones biológicas: Las usamos cuando deseamos hacer inferencias acerca de una población en general. El principio de independencia se mantiene y por tanto requieren metodología estándar (modelos lineales y modelos lineales generalizados).

    • Repeticiones técnicas: Las usamos cuando el enfoque es hacer inferencias sobre un inviduo o probando un método, esto por cuanto es natural que las medidas al venir de una misma unidad experimental estén correlacionadas. En este caso, métodos más complejos son necesarios (modelos lineales mixtos y modelos lineales generalizados mixtos).

    • Pseudo repeticiones: En la medida de lo posible debemos evitarlas. Sin embargo, es común el no tener otro remedio que utilizarlas cuando las condiciones del experimento así lo demandan. Esto es común en campos como la ecología o la piscicultura. De manera similar las repeticiones técnicas, las pseudo repeticiones afectan el principio de independencia y por tanto también se analizan con métodos como modelos lineales mixtos y modelos lineales generalizados mixtos.

Sobre las repeticiones

¿Son 3 repeticiones sufientes por tratamiento?, y ¿por qué 3?

  • Tres repeticiones son una convención que no ha sido demostrada satisfactoriamente, pero es ampliamente adoptada.

  • Una manera de determinar de manera fundamentada el número apropiado de repeticiones es llevar a cabo análisis de poder.

    • Los análisis de poder requieren de información previa acerca de la variación esperada y el tamaño del efecto (diferencia entre tratamientos) a detectar.

    • Esto requiere de investigación bibliográfica, o conducción de ensayos piloto.

Sobre las repeticiones

¿Cuándo el número de repeticiones es igual al tamaño de la muestra?

  • Es común el confundir estos dos términos, más que nada por el contexto:

  • Cuando hablamos de un experimento con un solo factor (por ejemplo si tenemos una pregunta puntual cómo si la media aritmética de una muestra difiere de un valor establecido), el número de repeticiones coincide con el tamaño de la muestra.

  • Cuando hablamos de un experimento con dos o más tratamientos (un grupo control y otro experimental por ejemplo), el tamaño de la muestra refiere al total de unidades experimentales en todo el experimento, y el número de repeticiones se refiere al número de unidades experimentales por tratamiento.

Sobre el tamaño de la muestra

Ya que hemos hablado de las repeticiones, ¿has escuchado del número 30?

  • 30 es el número mágico considerado como el mínimo de observaciones requeridas para llevar a cabo un experimento.

  • Como otros números en estadística, proviene de convenciones adoptadas a lo largo del tiempo más que de teoremas completamente indiscutidos.

  • El número 30 ha sido demostrado como una falacia en diversas ocasiones

  • Sin embargo, 30 es un buen punto de inicio si conocimiento bibliográfico o pre-experimentos no están disponibles para llevar a cabo análisis de poder.

Muestras, poblaciones y muestreos

  • Muestra: Es un conjunto de observaciones que provienen de una población de interés. Idealmente, esta debería ser lo suficientemente grande para hacer inferencias de esa población.

  • Población: Es el conjunto de todas las posibles observaciones de las que tengamos interés en realizar inferencias. Es vital el definir adecuadamente sus características.

  • Muestreo: Es el proceso por el cual obtendremos nuestra muestra para un estudio. En estudios experimentales, el muestreo se entiende también como el proceso de aleatorización/randomización de unidades experimentales.

Muestreo simple sin reemplazo

Tomado de Learning Statistics with R

Muestreo simple con reemplazo

Tomado de Learning Statistics with R

Otros tipos de muestreo

  • Muestreo sistemático: consiste en tomar un determinado elemento de la población siguiendo un patrón. Por ejemplo, escoger los múltiplos de cuatro enumerados en una lista de posibles individuos de estudio (solía ser una práctica común en ensayos clínicos).

  • Muestreo a conveniencia: consiste en incluir en el estudio a todos los elementos disponibles de la población de interés. Esto sucede sobre todo con poblaciones escasas o de dificil acceso (ejemplo, realizar estudios en comunidades LGBTIQ+).

  • Muestreo estratificado: es una combinación del muestreo simple con los sujetos agrupados por alguna característica en común, por ejemplo sexo, edad, hábitat (suele ser usado en exit polls y conteos rápidos).

Parámetros poblacionales y estadísticos muestrales

  • Los parámetros poblacionales son características de toda una población (ejemplo, supongamos que el IQ de toda una población puede estar caracterizado por una media aritmética, \(\mu\), igual a 100, con una desviación estándar, \(\sigma\), igual a 15).

  • Si tomo una muestra de 100 individuos de dicha población, podría tener una media aritmética de esta muestra, \(\overline{X}\), igual a 101.4 y una desviación estándar de la muestra, \(s\), igual a 13.7.

  • En otras palabras, la \(\overline{X}\) y \(s\) son aproximaciones a los valores verdareros de \(\mu\) y \(\sigma\) de esa población.

Estimación de parámetros de población

Media aritmética

Símbolo ¿Qué es? ¿Sabemos qué es?
\(\overline{X}\) Media aritmética de la muestra Calculada de los datos
\(\mu\) Verdadera media aritmética de la población Casi nunca es conocida
\(\hat{\mu}\) Estimado de la media aritmética de la población Sí, identica a \(\overline{X}\)

\[ \overline{X} = \frac{1}{n}\sum^{n}_{i=1}\left(X_i\right) \]

Estimación de parámetros de población

Desviación estándar

Símbolo ¿Qué es? ¿Sabemos qué es?
\(s\) Desviación estándar de la muestra Calculada de los datos
\(\sigma\) Verdadera desviación estándar de la población Casi nunca es conocida
\(\hat{\sigma}\) Estimado de la deviación estándar de la población Sí, pero no es igual a \(s\)

\[ s = \sqrt{\frac{1}{n} \sum_{i=1}^n (X_i - \overline{X})^2} \]

\[ \sigma = \sqrt{\frac{1}{n-1} \sum_{i=1}^n (X_i - \overline{X})^2} \]

Estimación de parámetros de población

Varianza

Símbolo ¿Qué es? ¿Sabemos qué es?
\(s^2\) Varianza de la muestra Calculada de los datos
\(\sigma^2\) Verdadera varianza de la población Casi nunca es conocida
\(\hat{\sigma}^2\) Estimado de la varianza de la población Sí, pero no es igual a \(s^2\)

\[ s^2 = \frac{1}{n} \sum_{i=1}^n (X_i - \overline{X})^2 \]

\[ \sigma^2 = \frac{1}{n-1} \sum_{i=1}^n (X_i - \overline{X})^2 \]

Intervalos de confianza

  • Cómo hemos visto, los estimados de las verdaderas \(\mu\) y \(\sigma\) (\(\hat{\mu}\) y \(\hat{\sigma}\)) provienen de distribuciones de muestreo, y como tales, inherentemente poseen cierto grado de incertidumbre.

  • Los intervalos de confianza son medidas que nos permiten tener una idea de esa incertidumbre.

  • En el estudio de la distribución normal estándar tenemos el conocimiento que existe un 95% de chances que una cantidad normalmente distribuida colectada al azar, estará distante de la media aritmética entre \(\pm\) 1.96 desviaciones estándar.

\[ \overline{X} - \left(1.96\times\frac{\sigma}{\sqrt{n}}\right) \leq \mu \leq \overline{X} + \left(1.96\times\frac{\sigma}{\sqrt{n}}\right) \]

  • Y se interpreta como: con un 95% de confianza, podemos esperar que la media aritmética verdadera de la población de interés se encuentra contenida entre…

\[ \text{IC}_{95}=\overline{X} \pm \left(1.96\times\frac{\sigma}{\sqrt{n}}\right) \]

Intervalos de confianza

  • Sin embargo, como mencionamos \(\sigma\) es casi nunca conocido, y es necesario hacer una corrección a la fórmula anterior. La distribución normal trabaja bien baja la presunción de un numero grande de observaciones.

  • En su lugar, en 1908 el estadístico Gosset parametrizó una distribución para muestras pequeñas que asemeja a la normal. Con el tiempo, esta distribución adoptó el nombre de Student.

  • Y es precisamente que la fórmula anterior es corregida con la distribución de Student y así poder calcular intervalos de confianza para muestras pequeñas usando \(s\) en lugar de \(\sigma\):

\[ \text{IC}_{95}=\overline{X} \pm \left(t_{n-1,\alpha/2}\times\frac{s}{\sqrt{n}}\right) \]

  • Donde el valor \(t_{n-1,\alpha/2}\) refiere a:

    • \(n-1\): los grados de libertad, igual al número de observaciones \(n\) de la muestra, menos 1

    • \(\alpha\): es el nivel de significancia (probabilidad de obtener un resultado erróneo por azar).

    • Estos valores en el pasado se encontraban tabulados en libros de texto, hoy contamos con R!

Intervalos de confianza

  • Regresando al ejemplo del IQ, supongamos que medimos al azar el IQ de 5 personas y deseamos calcular el \(\text{IC}_{95}\)
IQ_muestra <- c(101, 98, 116, 96, 129)   # muestra
n <- 5                                   # número de observaciones
t95 <- qt(p = 0.975, df = n -1)          # valor de Student para 4 grados de libertad al 5%
x <- mean(IQ_muestra)                    # media aritmética de la muestra
s <- sd(IQ_muestra)                      # desviación estándar de la muestra
ls <- x + (t95*s/(n-1))                  # límite superior del IC95
li <- x - (t95*s/(n-1))                  # límite inferior del IC95

Intervalos de confianza

  • Regresando al ejemplo del IQ, supongamos que medimos al azar el IQ de 5 personas y deseamos calcular el \(\text{IC}_{95}\)
IQ_muestra <- c(101, 98, 116, 96, 129)   # muestra
n <- 5                                   # número de observaciones
t95 <- qt(p = 0.975, df = n -1)          # valor de Student para 4 grados de libertad al 5%
x <- mean(IQ_muestra)                    # media aritmética de la muestra
s <- sd(IQ_muestra)                      # desviación estándar de la muestra
ls <- x + (t95*s/(n-1))                  # límite superior del IC95
li <- x - (t95*s/(n-1))                  # límite inferior del IC95
print(paste0("Con un 95% de confianza podemos esperar que la verdadera media aritmética de IQ de esta población se encuentre entre [",round(li,0),", ",round(ls,0),"]"))
[1] "Con un 95% de confianza podemos esperar que la verdadera media aritmética de IQ de esta población se encuentre entre [98, 118]"

Autoevaluación # 9

La concentración media de glucosa en ratones sanos se ha estimado en un rango entre 80 y 100 mg/dL. En un experimento, se han medido las siguientes concentraciones de glucosa en 10 ratones de una línea genética se presume tendría potencial de ser modelo de hiperglucemia después de unas cuantas más generaciones de cruce selectivo:

glc_rat <- c(108.7, 93.7, 52.7, 79.0, 74.7, 131.9, 99.5, 63.3, 98.6, 92.7)
  1. La media aritmética \(\overline{X}\) de la muestra es:
  1. 89.5
  2. 85.5
  3. 91.8
  4. 100.1
  1. La desviación de estándar \(s\) de la muestra es
  1. 30.6
  2. 18.0
  3. 15.6
  4. 22.7
  1. El intervalo de confianza (bajo la distribución de Student) es
  1. [81.4, 95.3]
  2. [80.4, 97.3]
  3. [83.7, 95.3]
  4. [83.7, 100.3]

Pruebas de hipótesis

Hipótesis de investigación vs. hipótesis estadísticas

  • Una hipótesis de investigación gira alrededor del desarrollar una conclusión científica acerca de un tema de interés del investigador. Ejemplos: el fumar causa cáncer, las vacunas causan/previenen enfermedades.

    • Es decir, pueden tener una naturaleza subjetiva, que expresan la pregunta del investigador de una manera general sin mayor descripción del ¿cómo? voy a probar o descartarla, ni ¿en qué extensión?.
  • Hipótesis estadísticas, por el contrario, deben ser matemáticamente precisas y basadas en las características de los datos que recolectemos con el fin de probar o descartar la hipótesis de investigación.

    • Cómo es de esperar, el probar o descartar una hipótesis estadística será únicamente válida para la población sobre la cual una muestra fue tomada.

    • Es ahí donde radica la importancia en definir la población sujeto de estudio de manera planificada con el objetivo de que cumpla tantos detalles sean necesarios de la hipótesis de investigación. Ejemplo, el modelo animal más usado es el ratón. Si bien es cierto constituye uno de los primeros pasos en el desarrollo de muchas investigaciones, los hallazgos en ratones NO pueden ser inmediatamente atribuibles a suceder en seres humanos.

Hipótesis nula y alternativa

  • La formulación de hipótesis estadísticas puede reducirse a establer preguntas de investigación en forma de las hipótesis nula y alternativa.

  • La más sencilla manera de formular esta dupla, es la siguiente. Supongamos que tenemos dos grupos experimentales para probar la eficiencia de un nuevo procedimiento quirúrgico. Un grupo de pacientes será sometido a la intervención tradicional (control), y el otro grupo al nuevo procedimiento (experimental).

    • La hipótesis nula (\(H_0\)) establece que: no existe diferencia entre el grupo control y el grupo experimental,

    • Mientras que la hipótesis alternativa (\(H_a\)) establece que: sí existe differencia entre ambos.

\[\begin{align} H_0& : \mu_c = \mu_e& H_0& : \mu_c- \mu_e =0 \\ H_a& : \mu_c \neq \mu_e& H_a& : \mu_c- \mu_e \neq 0 \end{align}\]

Tipos de errores

  • Al llevar a cabo pruebas de hipótesis pueden ocurrir errores
\[\begin{array}{|c||c||c|} \hline & \text{Acepta }H_{0} & \text{Rechaza }H_{0} \\ \hline H_{0}\text{ es verdadera} & \text{Desición correcta} & \text{Error tipo I} \\ H_{0}\text{ es falsa} & \text{Error tipo II} & \text{Desición correcta} \\ \hline \end{array}\]
  • ¿De qué depende que aceptemos correctamente o no la hipótesis nula?

Las pruebas estadísticas dependen de la cantidad de variación y la diferencia entre tratamientos a detectar (tamaño del efecto). La solución: aumentar el número de observaciones

Poder de una prueba estadística

  • El poder de una prueba estadística es la probabilidad de rechazar la hipótesis nula cuando esta es de hecho falsa.

  • Se puede derivar de la tabla anterior

\[\begin{array}{|c||c||c|} \hline & \text{Acepta }H_{0} & \text{Rechaza }H_{0} \\ \hline H_{0}\text{ es verdadera} & 1-\alpha\text{ (Prob. decisión correcta)} & \alpha\text{ (Taza Error tipo I)} \\ H_{0}\text{ es falsa} & \beta\text{ (Taza Error tipo II)} & 1-\beta\text{ (Poder)} \\ \hline \end{array}\]
  • En la práctica, existen fórmulas cerradas para la determinación del número mínimo de observaciones para alcanzar un poder adecuado (\(\ge\) 80%).

  • A este procedimiento se le conoce como análisis de poder. Este se lo puede realizar en R, por supuesto, pero no es parte de nuestro curso.

Tamaño del efecto

  • El tamaño del efecto (\(\theta\)) es un valor que por lo general es determinado por el investigador y que puede ser la diferencia de interés a detectar en una prueba estadística.

  • Por simplicidad, vamos a enfocarnos en el ejercicio de los ratones. Supongamos que el investigador está interesado en saber cual sería el número de ratones que necesitaría para con un 80% de poder, encontrar una diferencia entre la media aritmética de su muestra y un valor que considera razonable chequear igual a 100 mg/dL. Este último valor viene a ser el \(\theta\).

  • Las hipótesis de esta prueba se verían así

\[\begin{align} H_0& : \mu_c- \mu_r = \theta \\ H_a& : \mu_c- \mu_r \neq \theta \end{align}\]
  • Sin embargo, la pregunta del investigador aún está incompleta. A tu criterio, ¿qué falta?

  • Al formular hipótesis, hemos considerado el caso más simple hasta el momento. Pero recordando la idea inicial del experimento de los ratones, la opción lógica sería preguntarnos ¿cuántos ratones necesitamos para estar seguros que la población sea hiperglucémica? (cuyo valor de glucosa en sangre esté por encima del de un ratón sano)

Pruebas de dos colas

\[\begin{align} H_0& : \mu_c- \mu_r = \theta \\ H_a& : \mu_c- \mu_r \neq \theta \end{align}\]

Imagen tomada de UCLA: Advanced Research Computing

Pruebas de una cola

\[\begin{align} H_0& : \mu_c- \mu_r \ge \theta \\ H_a& : \mu_c- \mu_r < \theta \end{align}\]

Imagen tomada de UCLA: Advanced Research Computing

Pruebas de una cola

\[\begin{align} H_0& : \mu_c- \mu_r \le \theta \\ H_a& : \mu_c- \mu_r > \theta \end{align}\]

Imagen tomada de UCLA: Advanced Research Computing

Valores críticos y el valor p

  • Pero ¿cómo sabemos si una hipótesis es aceptada o rechazada?

  • Regresando al concepto de los intervalos de confianza, los cuartiles de la distribución de Student calculados a un nivel de significancia \(\alpha\) son valores críticos sobre los cuales se determina el rechazo o aceptación de la hipótesis nula.

  • El valor p, describe que tan probable sería observar resultados de la prueba asumiendo que la hipótesis nula no hubiese sido rechazada. Por ello, a menores valores p, mayor la diferencia estadística con respecto a la hipótesis alternativa.

Antes de continuar

Antes de continuar

  • El umbral de 0.05 es una convención arbitraria creada por Fischer en los inicios de la estadística moderna.

  • Lastimosamente, se ha generalizado la idea de que por más mínima sea la diferencia con respecto a 0.05, esta representa la diferencia entre publicar o no (en el campo académico), entre lanzar o no un nuevo fármaco/producto al mercado (en la industria).

  • En 2014, debido a un fallo de la corte suprema de justicia de los Estados Unidos que le dio la potestad a los inversionistas de farmaceúticas a demandarlas por fallar en reportar efectos secundarios de sus productos a pesar de haber sido hallados estadísticamente no significativos, la Asociación Americana de Estadística (ASA) se vio en la necesidad de definir más exhaustivamente el concepto del valor p.

  • Entre las recomendaciones de la ASA, se enfatizó el dar mayor prioridad a la estimación de otros estadísticos complementarios al valor p, tales como intervalos de confianza u otros provenientes de la estadística Bayesiana (intervalos de credibilidad, factores de Bayes).

  • Esta última (estadística Bayesiana), ofrece una interpretación más natural de la estadística al poder interpretar todos sus resultados en términos de probabilidades y no en números arbirtrarios como el valor p.

  • En resumen, una investigación no es inútil si el valor p sobrepasa o está por debajo de 0.05 por cantidades pequeñas.

Antes de continuar

  • En su lugar, en escenarios en que el valor p está alejado por una décima o varias centésimas de 0.05, los resultados deberían interpretarse como indeterminados para generalizar sobre la población objeto de estudio y específicos a las condiciones experimentales (análisis estadísticos, instrumentos de medición, etc) bajo las cuales fueron tomadas y modeladas las mediciones.

  • En el contexto de los modelos estadísticos que veremos más adelante, esto ha derivado en un “temor” del investigador cuando los resultados no pasan los chequeos de los supuestos sobre los que estos modelos se cimentan. Sobre todo cuando el valor p dista de 0.05 por ínfimas cantidades.

  • Esto puede llevar a malas prácticas científicas tales como: no reportar el resultado de los chequeos, blindar los datos, escoger “outliers” y removerlos y en el peor de los casos, manipular los datos para tratar de acomodar nuestros datos a estos chequeos.

  • Todo lo que he mencionado, no solamente constituyen casos de mala conducta científica, sino lo que hoy en día se le conoce como p hacking (que se puede resumir a torturar los datos hasta que nos confiesen una verdad agradable a nuestros propósitos).

Pruebas estadísticas paramétricas

Datos para esta sección

  • Para esta sección del curso usaremos algunas de las tablas de datos del libro Using R for Introductory Statistics, como también del paquete datarium.

  • Para ello, instalaremos los paquetes de R: UsingR y datarium.

library(UsingR)
library(datarium)

Pruebas t

  • Las pruebas t son usadas para encontrar la diferencia entre dos medias aritméticas.

  • La \(H_0\) en estas pruebas es que las medias aritméticas son las mismas.

  • Se rechaza la \(H_0\) cuando el valor p resultante es \(<\) 0.05

  • Existen tres tipos de pruebas t

    • Pruebas t de una muestra

    • Pruebas t de muestras independientes

    • Pruebas t de muestras emparejadas

  • Estas pruebas fueron desarrolladas bajo la suposición de la normalidad y de homogeneidad de las varianzas.

  • De acuerdo al teorema del límite central, muestras grandes casi aseguran la normalidad.

  • Cuando el número de observaciones en una muestra es pequeño, es recomendable llevar a cabo un test de normalidad para decidir si es posible una prueba t o una de sus alternativas.

Normalidad de una muestra

  • Antes de llevar a cabo las pruebas t, hemos mencionado sus supuestos. Por ello, es aconsejable el siempre realizar estas pruebas antes de usarlas.

  • Existen dos tipos de pruebas para establecer si una muestra es normalmente distribuida o no

    • Indirectamente: gráfico Q-Q

    • Prueba formal de normalidad (ejemplo: Shapiro-Wilk)

  • En el caso del ANOVA, es importante enfatizar que estas pruebas no necesariamente tienen que hacerse antes de la prueba, como ya veremos más adelante.

Gráfico Q-Q

  • El gráfico Q-Q es una prueba visual indirecta de la normalidad.

  • Consiste en crear un gráfico de dispersión entre los valores observados de una muestra vs. los valores que deberían estos tener si siguieran una distribución normal.

  • Mientras en el gráfico de dispersión los puntos más se distribuyan a lo largo de una diagonal, más cercanos están los datos de la muestra a seguir un distribución normal.

  • Su desventaja es que es muy subjetivo, y a menudo requiere una prueba formal para poder confirmarlo.

Gráfico Q-Q

set.seed(123)
y <- rnorm(n = 30, mean = 0, sd = 1)  # simulamos 30 observaciones de una normal estandar
qqnorm(y)                             # producimos el gráfico Q-Q

Gráfico Q-Q

set.seed(123)
y <- rnorm(n = 30, mean = 0, sd = 1)  # simulamos 30 observaciones de una normal estandar
qqnorm(y)                             # producimos el gráfico Q-Q

Prueba de normalidad Shapiro-Wilk

  • La \(H_0\) de esta prueba (y del resto de pruebas formales de normalidad) es que un set de \(n\) observaciones es normalmente distribuido.

  • Otro conocido método es Kolmogorov-Smirnov. Sin embargo, Shapiro-Wilk es más apropiado para cuando el número de muestras es menor a 50.

  • Para ilustrar su uso, chequeemos la normalidad de los datos que simulamos anteriormente

shapiro.test(y)

    Shapiro-Wilk normality test

data:  y
W = 0.97894, p-value = 0.7966

Prueba de homogeneidad de las varianzas

  • En el caso de comparaciones entre las medias de dos grupos, la homogeneidad de varianzas puede chequearse usando la prueba F.

  • La prueba t de una muestra no requiere chequear este supuesto.

  • Para ilustrar su uso, creemos otro vector con datos simulados. En este caso, un igual número de observaciones con la misma desviación estándar pero diferente media:

set.seed(123)
x <- rnorm(n = 30, mean = 4, sd = 1)
var.test(x, y)

    F test to compare two variances

data:  x and y
F = 1, num df = 29, denom df = 29, p-value = 1
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.4759648 2.1009958
sample estimates:
ratio of variances 
                 1 

Supuestos en la práctica

  • Usemos las pruebas con datos reales, esta vez con la tabla de datos crime del paquete Using R.

  • Esta tabla de datos contiene registros de las tasas de crimen (# de reportes/100000 habitantes) en 50 estados en los Estados Unidos correspondiente a los años 1983 y 1993.

  • Sin enfocarnos por el momento en que prueba t específica usaremos, limitémonos a chequear la normalidad y la homogeneidad de varianzas entre las tasas de crimen registradas en 1983 y 1993.

data(crime)

Normalidad 1983

shapiro.test(crime$y1983)     

    Shapiro-Wilk normality test

data:  crime$y1983
W = 0.77333, p-value = 1.827e-07

Normalidad 1993

shapiro.test(crime$y1993)     

    Shapiro-Wilk normality test

data:  crime$y1993
W = 0.77348, p-value = 1.841e-07

Homogeneidad de las varianzas

var.test(crime$y1983, crime$y1993)

    F test to compare two variances

data:  crime$y1983 and crime$y1993
F = 0.49163, num df = 50, denom df = 50, p-value = 0.01342
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.2806163 0.8613069
sample estimates:
ratio of variances 
         0.4916266 

Transformación de variables

  • A menudo nos encontraremos con conjuntos de observaciones que no cumplen uno o ninguno de los supuestos.

  • Antes de considerar pruebas no paramétricas, podemos intentar transformaciones de variables para regresar al mundo de las pruebas paramétricas. Las transformaciones más usadas son:

    • La raíz cuadrada (si los datos no contienen números negativos)

    • Elevar al cuadrado

    • Logaritmo (si los datos solo incluyen números reales positivos, cero excluido)

Transformación de variables

  • Existe un método más sofisticado para “normalizar” una muestra. La transformación de Box-Cox.

  • Cuando se trabaja con muestras transformadas, el objetivo es poder revertir la transformación a las unidades reales para así poder hacer conclusiones sobre las inferencias estadísticas.

  • En otras palabras, una misma transformación debe aplicarse a todos los grupos a ser comparados. NO tiene ningún sentido tratar de realizar inferencias entre grupos donde se hayan usado distintas transformaciones para normalizarlos.

  • Si el número de observaciones es muy reducido, usualmente no hay transformación que funcione y se recomienda usar directamente pruebas no paramétricas.

Transformación de variables

Raíz cuadrada

shapiro.test(sqrt(crime$y1983))     

    Shapiro-Wilk normality test

data:  sqrt(crime$y1983)
W = 0.9411, p-value = 0.01359

Elevar al cuadrado

shapiro.test(crime$y1983^2)     

    Shapiro-Wilk normality test

data:  crime$y1983^2
W = 0.38921, p-value = 2.954e-13

Logaritmo

shapiro.test(log(crime$y1983))     

    Shapiro-Wilk normality test

data:  log(crime$y1983)
W = 0.98076, p-value = 0.5713

Chequeemos con el otro grupo

shapiro.test(log(crime$y1993))     

    Shapiro-Wilk normality test

data:  log(crime$y1993)
W = 0.96191, p-value = 0.1006

Homogeneidad de las varianzas con transformación logarítmica

var.test(log(crime$y1983), log(crime$y1993))

    F test to compare two variances

data:  log(crime$y1983) and log(crime$y1993)
F = 0.84048, num df = 50, denom df = 50, p-value = 0.5412
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.4797393 1.4724831
sample estimates:
ratio of variances 
         0.8404808 

Prueba t de una muestra

  • Es usada para comparar la media aritmética de una muestra con un valor conocido (un estándar por ejemplo).

  • Por lo general el valor al que se va a comparar proviene de referencias bibliográficas, pre-experimentos o supociones fundamentadas.

  • En este caso, el supuesto que debe cumplirse es el de la normalidad de los datos

  • Regresando a nuestro ejemplo de los ratones, determinemos si la media de la muestra es mayor al límite superior de glucosa de ratones saludables.

Prueba t de una muestra

glc_rat <- c(108.7, 93.7, 52.7, 79.0, 74.7, 131.9, 99.5, 63.3, 98.6, 92.7)
t.test(glc_rat,
       mu = 100,
       alternative = "greater")

Prueba t de una muestra

glc_rat <- c(108.7, 93.7, 52.7, 79.0, 74.7, 131.9, 99.5, 63.3, 98.6, 92.7)
t.test(glc_rat,
       mu = 100,
       alternative = "greater")

    One Sample t-test

data:  glc_rat
t = -1.4485, df = 9, p-value = 0.9093
alternative hypothesis: true mean is greater than 100
95 percent confidence interval:
 76.16687      Inf
sample estimates:
mean of x 
    89.48 

Prueba t de muestras independientes

  • Es usado para comparar las medias aritméticas de dos grupos independientes.

  • Por ejemplo, si deseas comparar las medias aritméticas de individuos agrupados por sexo.

  • Para ilustrar esta prueba, vamos a hacer uso de la tabla de datos de genderweight del paquete datarium.

    • Veamos si existe una diferencia significativa en la media del peso entre hombres y mujeres
data(genderweight)

Prueba t de muestras independientes

Chequeamos normalidad: Group M

shapiro.test(subset(genderweight, group == "M")$weight)     

    Shapiro-Wilk normality test

data:  subset(genderweight, group == "M")$weight
W = 0.98634, p-value = 0.9886

Chequeamos normalidad: Group F

shapiro.test(subset(genderweight, group == "F")$weight)     

    Shapiro-Wilk normality test

data:  subset(genderweight, group == "F")$weight
W = 0.93847, p-value = 0.2243

Chequeamos la homogeneidad de las varianzas

var.test(genderweight$weight ~ genderweight$group)

    F test to compare two variances

data:  genderweight$weight by genderweight$group
F = 0.21692, num df = 19, denom df = 19, p-value = 0.001648
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.08585766 0.54802553
sample estimates:
ratio of variances 
         0.2169152 
  • ¡La homogeneidad de las varianzas no se cumple! 😱

  • ¿Debemos transformar? No necesariamente

  • El no cumplir con el supuesto de la homogeneidad de varianzas no es un gran problema gracias a varias correcciones.

  • La función base de R t.test cuenta con el argumento var.equal = F como default.

  • Bajo este argumento, no se asumen varianzas iguales entre los grupos y en su lugar R lleva a cabo la aproximación de Welch para lidiar con este problema.

Prueba t de muestras independientes

t.test(genderweight$weight ~ genderweight$group)

    Welch Two Sample t-test

data:  genderweight$weight by genderweight$group
t = -20.791, df = 26.872, p-value < 2.2e-16
alternative hypothesis: true difference in means between group F and group M is not equal to 0
95 percent confidence interval:
 -24.53135 -20.12353
sample estimates:
mean in group F mean in group M 
       63.49867        85.82612 

Prueba t para muestras emparejadas

  • Es usado para comparar las medias de dos grupos que guardan una relación.

  • Esto solo ocurre cuando las medidas se han realizado a partir de los mismos grupos. Por ejemplo, al inicio y al final de un experimento.

  • Para esta prueba, vamos a usar la tabla de datos crime del paquete UsingR

    • Veamos si existe una diferencia en las tasas de crimen (# de reportes/100000 habitantes) en 50 estados de los Estados unidos entre 1983 y 1993
data(crime)

Prueba t para muestras emparejadas

t.test(x = log(crime$y1983), y = log(crime$y1993), paired = TRUE)
exp(mean(log(crime$y1983)))
exp(mean(log(crime$y1993)))

Prueba t para muestras emparejadas

t.test(x = log(crime$y1983), y = log(crime$y1993), paired = TRUE)

    Paired t-test

data:  log(crime$y1983) and log(crime$y1993)
t = -10.027, df = 50, p-value = 1.469e-13
alternative hypothesis: true mean difference is not equal to 0
95 percent confidence interval:
 -0.3628437 -0.2417349
sample estimates:
mean difference 
     -0.3022893 
exp(mean(log(crime$y1983)))
[1] 362.8298
exp(mean(log(crime$y1993)))
[1] 490.8915

Autoevaluación # 10

En esta autoevaluación, usaremos tablas de datos del paquete UsingR y datarium:

  1. La tabla de datos blood (paquete UsingR) tiene las medidas de presión sistólica de sangre correspondientes a 15 pacientes (columna “machine”). De acuerdo al Centro de Prevención y Control de Enfermedades de los Estados Unidos (CDC), una presión sistólica saludable está por debajo de 120 mm Hg. Determina si la media de la muestra contenida en esta tabla de datos está por debajo de este valor sugerido por el CDC.
data(blood)
blood
  1. La tabla de datos normtemp (paquete UsingR) tiene las medidas en grados Fahrenheit de temperatura corporal (columna “temperature” ) correspodientes a 65 mujeres y 65 hombres (columna “gender”). Determina si existe una diferencia entre las temperaturas corporales de hombres y mujeres.
data(normtemp)
normtemp
  1. La tabla de datos mice2 (paquete datarium) tiene las medidas del peso de 10 ratones antes y después de haber sido sometidos a una determinada dieta. Encuentra si existe una diferencia significativa en el peso de estos ratones antes y después del régimen de dieta al que fueron expuestos. ¿Ganaron o perdieron peso?
data(mice2)
mice2
  1. En el paquete UsingR tenemos disponible una lista con 5 objetos bajo el nombre cancer. Esta contiene el tiempo de sobreviviencia en días de pacientes con distintos tipos de cáncer desde el momento de su diagnóstico hasta su deceso. Chequea si los datos correspondientes a cáncer de colon son normalmente distribuidos. Si no lo son, prueba si puedes normalizarlos usando alguna de las tres transformaciones que vimos. En el caso que más de una transformación funcione, ¿cuál escogerías para continuar con alguna prueba estadística, y por qué?

Tip: usa el siguiente código para extraer en un vector los datos de pacientes con cáncer de colon:

data(cancer)
colon <- cancer$colon

Pruebas estadísticas no paramétricas

Pruebas de Wilcoxon para datos no normales

  • Las pruebas de Wilcoxon usan la mediana como criterio para evaluar la \(H_0\).

  • Lastimosamente, estas pruebas son usualmente menos poderosas (mayor tasa de errores tipo II).

  • Tiene dos formas:

    • Pruebas para una muestra (análoga a la prueba t para una muestra)

    • Pruebas para dos muestras (análoga a las pruebas t para dos muestras independientes y emparejadas)

Prueba de Wilcoxon para una muestra

  • Prof. Danielle Navarro midió el nivel de felicidad de sus estudiantes antes y después de su clase de Estadística. Ella estaba interesada en saber si el tomar una clase de Estadística tiene algún efecto en la felicidad de sus estudiantes. Los datos que obtuvo no están normalmente distribuidos. Por ello, se vio en la necesidad de llevar a cabo una prueba de Wilcoxon.

  • En este caso, la \(H_0\), es que la diferencia de la mediana de la felicidad de sus estudiantes antes y después de la clase debería ser igual a cero para clamar que no existe tal efecto.

Prueba de Wilcoxon para una muestra

# Primero recreo la tabla de Prof. Navarro
felicidad <- data.frame(before = c(30,43,21,24,23,40,29,56,38,16),
                        after = c(6,29,11,31,17,2,31,21,8,21))
felicidad$change <- felicidad$after - felicidad$before

wilcox.test(felicidad$change, mu = 0)

    Wilcoxon signed rank exact test

data:  felicidad$change
V = 7, p-value = 0.03711
alternative hypothesis: true location is not equal to 0

Prueba de Wilcoxon para dos muestras

  • Regresando al ejemplo de la tabla de datos genderweight, supongamos que estos no están normalmente distribuidos.

  • Usaremos la prueba de Wilcoxon para muestras independientes para ver si existe diferencia entre los pesos de hombres y mujeres.

wilcox.test(genderweight$weight ~ genderweight$group, paired = F)

    Wilcoxon rank sum exact test

data:  genderweight$weight by genderweight$group
W = 0, p-value = 1.451e-11
alternative hypothesis: true location shift is not equal to 0

Autoevaluación # 11

  1. Con el vector de nombre colon que creaste en la anterior autoevaluación, aplica una prueba de Wilcoxon para una muestra bajo la hipótesis de que la mediana de los días de superviviencia de un paciente con cáncer de colon es de 370 días.

  2. A partir de la tabla de datos de felicidad de la Prof. Navarro, lleva a cabo una prueba de Wilcoxon para dos muestras emparejadas de la felicidad de los estudiantes antes y después de recibir una clase de Estadística. Compara el resultado con la prueba de una muestra que usé de ejemplo. ¿Por qué no hay diferencia?.

Análisis de Varianza (ANOVA)

Introducción

  • Hasta el momento nos hemos enfocado a los casos donde comparamos las medias entre dos grupos.

  • Pero es más común el evaluar distintos tratamientos al mismo tiempo.

  • Para ello, contamos con el ANOVA, desarrollado por el estadístico Ronald Fisher a inicios del siglo 20, y que sin duda es el método estadístico más usado hoy en día.

  • Su nombre puede ser confuso. El objetivo de un ANOVA es el de determinar la existencia de diferencias entre las medias aritméticas de las muestras representativas de \(n\) poblaciones (o en términos más precisos, tratamientos).

Supuestos del ANOVA

  1. Independencia de los datos: conseguida mediante una correcta randomización y definición del experimento.

  2. Homogeneidad de las varianzas: la varianza entre los tratamientos es la misma.

  3. Normalidad: pero, ¿de qué exactamente?

  • Siempre ha existido una confusión de este supuesto. Cómo vimos antes, la normalidad es un requisito para conducir pruebas t, y lo es también para el ANOVA.

  • Muchos libros de texto y otros recursos, mencionan que los datos de cada tratamiento deben ser normalmente distribuidos para llevar a cabo un ANOVA. Esto es cierto e impráctico a la vez.

  • Mencionamos que como mínimo deberíamos contar con 3 repeticiones por tratamiento. Pero, ¿son 3 repeticiones suficientes para alcanzar la normalidad?

  • Es común el sugerir el llevar a cabo una prueba de normalidad antes de un ANOVA, pero esto tiene varios problemas que supongo no te han dicho antes:

    • Cada tratamiento tiene su propia media, en caso de medias muy distantes entre sí, la prueba puede fallar.

    • En su lugar, podrías correr una prueba por cada tratamiento. Esto solo funciona con un considerable número de observaciones/tratamiento (3 no son suficientes).

Supuestos del ANOVA

  • Esta confusión nos puede llevar a soluciones erróneas como transformar datos, borrar outliers o utilizar pruebas no paramétricas innecesariamente.

  • Entonces, ¿normalidad de qué?

  • De los residuos estandarizados!… ¿Qué es un residual?

    • Un residual es la diferencia entre una observación y su predicción

    • Un residual estandarizado resulta de la división del residual para la raíz cuadrada de la predicción

    • La distribución muestral de los residuos estandarizados tiene media 0 y desviación estándar 1

  • Y es sobre esta distribución que los valores críticos del ANOVA (valores F) son calculados. Es decir, estos no dependen enteramente de los datos originales, por lo tanto los datos originales no tienen que ser necesariamente normalmente distribuidos.

  • Pero, ¿por qué la confusión? Solo cuando el número de observaciones es lo suficientemente grande (y ya sabemos que distribución tiene la media muestral cuando el número incrementa), se tiene la certeza que los residuos serán normalmente distribuidos.

  • En resumen, es mejor chequear la normalidad después que realizamos el ANOVA.

El dataset de recursos por depredación

El dataset de recursos por depredación

  • Los datos que usaremos en esta y otras secciones corresponden a un experimento del Prof. Justin C. Touchon acerca de la interacción entre predadores y recursos.

  • El experimento consistió de múltiples tanques (mesocosmos) dispuestos al aire libre en Gamboa, Panamá. Los investigadores tenían por objetivo el saber como la variación en la incubación de huevos de la rana arbórea de ojos rojos podría afectar su desarrollo hasta la metamorfosis bajo varias combinaciones de recursos y predadores.

  • Los tratamientos fueron los siguientes:

    • Edad de incubación: Temprana (E: 4 días después de la oviposición) o tardía (L: 6 días después de la oviposición).

    • Predadores: control (C), no letal (NL: larvas de libélula enjauladas) y letal (L: larvas de libélula libres)

    • Recursos: bajo (Lo: 0.75 g) o alto (Hi: 1.5 g) de comida suministrados cada 5 días.

  • Los mesocosmos fueron colocados en 8 bloques de 12 tanques cada uno.

  • El experimento inició con 50 renacuajos por tanque y terminó cuando todos los renacuajos alcanzaron la metamorfosis, o murieron.

El dataset de recursos por depredación

  • Variables de respuesta:

    • Edad de metaformosis contada desde el día de oviposición (Age.DPO).

    • Edad de salida del agua (Age.FromEmergence)

    • Longitud nariz-cloaca al emerger (SVL.initial)

    • Longitud de la cola al emerger (Tail.initial)

    • Longitud nariz-cloaca al término de la reabsorción de la cola (SVL.final)

    • Peso al término de la reabsorción de la cola (Mass.final)

    • Número de días requeridos por cada metamorfo para reabsorber completamente la cola (Resorb.days)

  • 18 tanques conteniendo predadores no letales fueron descartados debido al brote de una enfermedad

  • NOTA: el dataset original de Touchon contiene alrededor de 2500 observaciones. Sin embargo, para poder usar los datos bajo los supuestos del ANOVA es necesario reducirlos a las medias aritméticas de cada tratamiento por cuanto se tratan de pseudo repeticiones. Esta reducción ya está hecha en el archivo “touchon.csv” disponible con el resto de materiales extras del curso.

Explorando este dataset

  • Haremos una exploración básica del dataset anteriormente descrito: gráficos de caja y bigote, de barras, de densidad y matrices de dispersión.

  • Como estos datos han sido pre-procesados, omitiremos el mapa de observaciones perdidas.

  • Para esto, aprovecho la oportunidad para introducir otro par de paquetes útiles

  • Como vimos anteriormente, ggplot2 es una poderosa librería de visualización de datos cuyo uso es relativamente sencillo. Sin embargo, su dominio requiere un poco de tiempo y paciencia. Para quienes quizá deseen una manera más rápida de realizar sus gráficos y solamente tomarse el tiempo en añadir detalles finales, usaremos ggpubr.

Medias aritméticas observadas

# usaremos nuevamente el paquete `tidycomm` para los estadísticos descriptivos
ranas <- read.csv("touchon.csv")
describe(ranas)
ranas 

 12  Variables      78  Observations
--------------------------------------------------------------------------------
Block 
       n  missing distinct     Info     Mean      Gmd 
      78        0        8    0.983    4.128    2.645 
                                                          
Value          1     2     3     4     5     6     7     8
Frequency     12    12    12     8    10     8     8     8
Proportion 0.154 0.154 0.154 0.103 0.128 0.103 0.103 0.103

For the frequency table, variable is rounded to the nearest 0
--------------------------------------------------------------------------------
Tank.Unique 
       n  missing distinct     Info     Mean      Gmd      .05      .10 
      78        0       78        1    44.24    32.46     4.85     8.70 
     .25      .50      .75      .90      .95 
   20.25    40.50    67.50    84.60    90.15 

lowest :  1  2  3  4  5, highest: 90 91 92 94 96
--------------------------------------------------------------------------------
Pred 
       n  missing distinct 
      78        0        3 
                            
Value          C     L    NL
Frequency     32    32    14
Proportion 0.410 0.410 0.179
--------------------------------------------------------------------------------
Hatch 
       n  missing distinct 
      78        0        2 
                  
Value        E   L
Frequency   39  39
Proportion 0.5 0.5
--------------------------------------------------------------------------------
Res 
       n  missing distinct 
      78        0        2 
                  
Value       Hi  Lo
Frequency   39  39
Proportion 0.5 0.5
--------------------------------------------------------------------------------
Age.DPO 
       n  missing distinct     Info     Mean      Gmd      .05      .10 
      78        0       77        1    64.69    24.47    43.24    45.12 
     .25      .50      .75      .90      .95 
   47.74    57.44    71.68   101.03   114.37 

lowest : 38.1111 40.6341 41.8333 42.65   43.3478
highest: 114.114 115.81  128.225 135.121 140.902
--------------------------------------------------------------------------------
Age.FromEmergence 
       n  missing distinct     Info     Mean      Gmd      .05      .10 
      78        0       77        1    30.69    24.47    9.243   11.125 
     .25      .50      .75      .90      .95 
  13.738   23.439   37.682   67.031   80.368 

lowest : 4.11111 6.63415 7.83333 8.65    9.34783
highest: 80.1136 81.8095 94.225  101.121 106.902
--------------------------------------------------------------------------------
SVL.initial 
       n  missing distinct     Info     Mean      Gmd      .05      .10 
      78        0       78        1       19    1.484    17.37    17.68 
     .25      .50      .75      .90      .95 
   18.03    18.94    19.68    21.34    21.73 

lowest : 16.3205 16.6179 16.8889 17.315  17.3838
highest: 21.725  21.76   21.9167 22.125  22.3   
--------------------------------------------------------------------------------
Tail.initial 
       n  missing distinct     Info     Mean      Gmd      .05      .10 
      78        0       78        1    5.867   0.9237    4.777    4.901 
     .25      .50      .75      .90      .95 
   5.330    5.680    6.163    7.004    7.502 

lowest : 4.41111 4.55854 4.58    4.63462 4.80222
highest: 7.45833 7.75    7.8     7.8375  8.6    
--------------------------------------------------------------------------------
SVL.final 
       n  missing distinct     Info     Mean      Gmd      .05      .10 
      78        0       78        1    19.38    1.576    17.71    17.90 
     .25      .50      .75      .90      .95 
   18.29    19.23    20.02    21.74    22.14 

lowest : 16.6818 17.0222 17.0769 17.5425 17.7432
highest: 22.1    22.4    22.6    23.2    23.3   
--------------------------------------------------------------------------------
Mass.final 
       n  missing distinct     Info     Mean      Gmd      .05      .10 
      78        0       78        1   0.4301   0.1124   0.3239   0.3323 
     .25      .50      .75      .90      .95 
  0.3592   0.4043   0.4618   0.6235   0.6994 

lowest : 0.269318 0.281026 0.293333 0.315135 0.325455
highest: 0.6975   0.71     0.712    0.7375   0.75    
--------------------------------------------------------------------------------
Resorb.days 
       n  missing distinct     Info     Mean      Gmd      .05      .10 
      78        0       73        1      4.4    0.659    3.632    3.764 
     .25      .50      .75      .90      .95 
   4.024    4.255    4.789    5.116    5.546 

lowest : 3.375   3.44444 3.48936 3.51111 3.65385
highest: 5.30303 5.53659 5.6     5.75    6.5    
--------------------------------------------------------------------------------

Gráficos de barras

library(ggpubr)
ggbarplot(data = ranas,
          x = "Pred",
          y = "Age.FromEmergence",
          add = "mean_se",
          fill = "Pred")

ggbarplot(data = ranas,
          x = "Res",
          y = "Age.FromEmergence",
          add = "mean_se",
          fill = "Pred")

Gráficos de barras

p1 <- ggbarplot(data = ranas,
                x = "Pred",
                y = "Age.FromEmergence",
                add = "mean_se",
                fill = "Pred")

p1 + labs(title = "Gráfico de barras de edad desde oviposición",
       subtitle = "Datos del estudio de Prof. Touchon",
       caption = "Gráfica propia",
       x = "Predadores",
       y = "Edad desde oviposición",
       color = "Predador")

Gráficos de caja y bigote

ggboxplot(data = ranas,
          x = "Pred",
          y = "Age.FromEmergence",
          fill = "Pred")

ggboxplot(data = ranas,
          x = "Res",
          y = "Age.FromEmergence",
          fill = "Res")

Gráficos de densidad

ggdensity(data = ranas,
          x = "Age.FromEmergence", 
          add = "mean", 
          rug = "true", 
          color = "Pred", 
          fill = "Pred")

ggdensity(data = ranas,
          x = "Age.FromEmergence", 
          add = "mean", 
          rug = "true", 
          color = "Res", 
          fill = "Res")

Matriz de dispersión

library(GGally)
ranas_matriz <- ranas[,c(6:12)]
ggpairs(ranas_matriz)

ANOVA de una vía

  • ANOVA de una vía se refiere cuando tenemos más de dos tratamientos que están definidos por un solo factor a la vez.

  • Usando los datos del Prof. Touchon, vamos a ilustrar el caso del ANOVA de una vía. Para ello, vamos a considerar lo siguiente

    • Supongamos que estamos interesados en saber si existe alguna diferencia entre la edad de salida del agua Age.FromEmergence determinada por los predadores:

    • Los niveles del factor predadores son:

      • Predadores no letales NL

      • Predadores letales L

      • Control (sin predadores) C

  • La \(H_0\) en todo ANOVA es simplemente que no existe diferencia entre \(n\) tratamientos, y la \(H_a\) es que al menos uno de los tratamientos tiene una media distinta.

ANOVA en R

  • Existen dos formas de llevar a cabo ANOVA en R:

    1. Crear un modelo lineal con la función lm y luego el ANOVA con la función anova sobre el objeto producto de lm.

    2. Aplicar directamente la función aov sobre nuestros datos.

  • Ambas funciones (lm y aov) tienen la misma sintaxis. Personalmente prefiero la primera opción.

  • Adicionalmente, el paquete car ofrece la función Anova. El resultado de ambas es prácticamente el mismo para la mayoría de modelos. Sin embargo, personalmente prefiero Anova ya que permite realizar correcciones cuando tenemos datos no balanceados.

ANOVA de una vía en R

Opción 1

library(car)
lm1 <- lm(Age.FromEmergence ~ Pred, data = ranas)
Anova(lm1)

Opción 2

anova1 <- aov(Age.FromEmergence ~ Pred, data = ranas)
summary(anova1)
Anova Table (Type II tests)

Response: Age.FromEmergence
          Sum Sq Df F value    Pr(>F)    
Pred        9467  2  10.442 9.986e-05 ***
Residuals  33999 75                      
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
            Df Sum Sq Mean Sq F value   Pr(>F)    
Pred         2   9467    4733   10.44 9.99e-05 ***
Residuals   75  33999     453                     
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Diagnósticos del ANOVA

  • Antes de conducir pruebas formales para los supuestos del ANOVA, es preciso darle un vistazo a diagnósticos visuales que podemos obtener del mismo.

  • El ANOVA es un caso de regresión lineal (con predictores categóricos), por lo que en esta sección nos centraremos en la interpretación de estos diagnósticos desde la perspectiva del ANOVA.

  • En el apartado de regresión lineal volveremos a profundizar en las interpretaciones de los mismos para ese caso determinado.

  • Para acceder a estos diagnósticos, basta usar la función plot sobre el objeto donde guardamos los resultados del modelo lm1.

Diagnósticos del ANOVA

lm1 <- lm(Age.FromEmergence ~ Pred, data = ranas)
par(mfrow = c(2, 2))
plot(lm1)
par(mfrow = c(1, 1))

Diagnósticos del ANOVA

Diagnósticos del ANOVA

Residuos vs. Valores ajustados

En este plot podemos evidenciar departuras del supuesto de la homocedasticidad. Idealmente, la línea roja que se muestra debería ir a lo largo de la horizontal en la coordenada cero del eje y (sobre la línea entrecortada).

Diagnósticos del ANOVA

Gráfico Q-Q

A diferencia del gráfico Q-Q que vimos para las pruebas t, en el eje y de este mismo gráfico para el ANOVA (y regresión lineal) se representan los residuos estandarizados. La interpretación es la misma: idealmente los puntos deberían ir a lo largo de la diagonal. Cuando no es así, evidencia una violación del supuesto de la normalidad.

Diagnósticos del ANOVA

Raíz cuadrada de los residuos estandarizados vs. Valores ajustados

Similar al primer diagnóstico, en el caso del ANOVA, nos da una idea de posibles departuras de la homogeneidad de las varianzas. La línea roja idealmente debería ser completamente recta.

Diagnósticos del ANOVA

Residuos vs. Apalancamiento

Aquellos puntos que estén etiquetados con números son mostrados como posibles outliers bajo dos criterios:

  • Están por fuera de los límites de la regla del rango intercuartílico (IQR), y

  • Marcados como outliers con influencia de apalancamiento mediante la prueba de Cook (distancia de Cook).

El segundo criterio es un argumento sólido para remover outliers.

Transformaciones

lm2 <- lm(log(Age.FromEmergence) ~ Pred, data = ranas)
par(mfrow = c(2, 2))
plot(lm2)
par(mfrow = c(1, 1))

Transformaciones

Prueba formal de normalidad

  • Como vimos, después de aplicar la transformación logarítmica el gráfico Q-Q mejoró considerablemente.

  • Para estar seguros, podemos correr un test formal sobre los residuos del modelo con la ayuda del paquete olsrr mediante su función ols_test_normality.

library(olsrr)
ols_test_normality(lm2)
-----------------------------------------------
       Test             Statistic       pvalue  
-----------------------------------------------
Shapiro-Wilk              0.9802         0.2645 
Kolmogorov-Smirnov        0.0893         0.5625 
Cramer-von Mises          8.6738         0.0000 
Anderson-Darling          0.5447         0.1566 
-----------------------------------------------

Prueba formal de normalidad

  • O también podemos calcular la prueba de Shapiro-Wilk con funciones base de R
residuos <- resid(lm2)
shapiro.test(residuos)

    Shapiro-Wilk normality test

data:  residuos
W = 0.98017, p-value = 0.2645

Homogeneidad de las varianzas en ANOVA

  • La prueba más usada para chequear la homogeneidad de varianzas de un ANOVA es la de Levene.

  • Para ello utilizaremos la función leveneTest del paquete car. Podemos usar esta función directamente sobre los datos con la misma sintaxis de lm, o sobre el objeto lm2 en el que anteriormente almacenamos el resultado del modelo lineal con la transformación.

leveneTest(lm2, center = "mean")
Levene's Test for Homogeneity of Variance (center = "mean")
      Df F value  Pr(>F)  
group  2  3.0464 0.05345 .
      75                  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

ANOVA de una vía en R (continuación)

  • Así, una vez que hemos transformado para obtener normalidad en los residuos y chequeado la homogeneidad de varianzas, es tiempo de hecharle un vistazo al resultado del ANOVA:
Anova(lm2)
Anova Table (Type II tests)

Response: log(Age.FromEmergence)
          Sum Sq Df F value    Pr(>F)    
Pred       9.710  2  12.389 2.244e-05 ***
Residuals 29.392 75                      
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  • Por tanto, podemos concluir que al menos uno de los tratamientos es distinto (aceptamos la \(H_a\) y rechazamos la \(H_0\))

¿Qué tan distintos?

  • Preguntas naturales seguidas de estos resultados son: ¿qué tan distintos son los tratamientos entre sí?, ¿puedo acaso ordernarlos de mayor a menor?, ¿existen pares de tratamientos que son iguales?

  • Podemos comenzar con una ayuda visual (ligeramente distinto a nuestro AED, usando la transformación logarítmica)

# usamos ggpubr nuevamente
ranas$log.Age.FromEmergence <- log(ranas$Age.FromEmergence)
ggboxplot(ranas,
          x = "Pred",
          y = "log.Age.FromEmergence",
          add = "jitter",
          color = "Pred")

Comparaciones múltiples

  • Los métodos de comparaciones múltiples y gráficos de interacción nos ayudan a responder estas preguntas.

  • En el caso de los gráficos de interacción para ANOVA de una vía, no tiene mucho sentido llevarlos a cabo ya que son más útiles para ANOVA de múltiples vías, así que los dejaremos para después.

  • Las comparaciones múltiples más usadas son:

    • HSD Tukey (Honestly significant difference): lleva a cabo todos los pares de comparaciones posibles entre los niveles de un factor.

    • Prueba de Dunnett: Compara los niveles únicamente con respecto al nivel control dentro del factor.

  • Son conocidas también como pruebas post-hoc.

  • En R, una manera de realizar comparaciones múltiples es mediante los paquetes emmeans y multcomp (este último depende de multcompView, así que no olvides instalarla también).

HSD Tukey

Calculamos las medias marginales a partir del modelo

library(emmeans)
ph1 <- emmeans(lm2, specs = "Pred", type = "response")
summary(ph1)

HSD Tukey

Calculamos las medias marginales a partir del modelo

library(emmeans)
ph1 <- emmeans(lm2, specs = "Pred", type = "response")
summary(ph1)
 Pred response   SE df lower.CL upper.CL
 C        34.2 3.79 75     27.4     42.6
 L        15.8 1.75 75     12.7     19.7
 NL       26.2 4.38 75     18.8     36.5

Confidence level used: 0.95 
Intervals are back-transformed from the log scale 
  • Ahora podemos calcular las comparaciones por pares de HSD Tukey
tukey_comp <- contrast(ph1, specs = "Pred", method = "tukey")
tukey_comp
 contrast ratio    SE df null t.ratio p.value
 C / L    2.165 0.339 75    1   4.936  <.0001
 C / NL   1.307 0.262 75    1   1.335  0.3806
 L / NL   0.604 0.121 75    1  -2.516  0.0368

P value adjustment: tukey method for comparing a family of 3 estimates 
Tests are performed on the log scale 

Prueba de Dunnett

  • Para Dunnett, es importante el establecer el grupo control
dunnett_comp <- contrast(ph1, specs = "Pred", method = "dunnett", ref = "C")
dunnett_comp
 contrast ratio     SE df null t.ratio p.value
 L / C    0.462 0.0723 75    1  -4.936  <.0001
 NL / C   0.765 0.1535 75    1  -1.335  0.3177

P value adjustment: dunnettx method for 2 tests 
Tests are performed on the log scale 
  • Finalmente, otra tabla de resumen de las comparaciones múltiples es la de agrupar las medias aritméticas marginales con números (o letras) de acuerdo a si estas son estadísticamente distintas o no entre si. Para ello podemos usar el paquete multcomp:
# multcomp necesita un paquete extra llamada multcompView
# No olvides instalar multcompView antes de correr este código
library(multcomp)
medias_marginales <- cld(ph1)
medias_marginales
 Pred response   SE df lower.CL upper.CL .group
 L        15.8 1.75 75     12.7     19.7  1    
 NL       26.2 4.38 75     18.8     36.5   2   
 C        34.2 3.79 75     27.4     42.6   2   

Confidence level used: 0.95 
Intervals are back-transformed from the log scale 
P value adjustment: tukey method for comparing a family of 3 estimates 
Tests are performed on the log scale 
significance level used: alpha = 0.05 
NOTE: If two or more means share the same grouping symbol,
      then we cannot show them to be different.
      But we also did not show them to be the same. 

Antes de continuar

  • En este punto, antes de continuar hagamos uso nuevamente del paquete flextable para exportar nuestras tablas a Word.
library(flextable)
tabla_tukey <- colformat_double(flextable(as.data.frame(tukey_comp)), digits = 3, j = c(2, 3, 6, 7))
tabla_dunnett <- colformat_double(flextable(as.data.frame(dunnett_comp)), digits = 3, j = c(2, 3, 6, 7))
tabla_marginal <- colformat_double(flextable(medias_marginales), digits = 3, j = c(2, 3, 5, 6))

contrast

ratio

SE

df

null

t.ratio

p.value

C / L

2.165

0.339

75

1

4.936

0.000

C / NL

1.307

0.262

75

1

1.335

0.381

L / NL

0.604

0.121

75

1

-2.516

0.037

contrast

ratio

SE

df

null

t.ratio

p.value

L / C

0.462

0.072

75

1

-4.936

0.000

NL / C

0.765

0.153

75

1

-1.335

0.318

Pred

response

SE

df

lower.CL

upper.CL

.group

L

15.799

1.748

75

12.673

19.695

1

NL

26.172

4.379

75

18.754

36.525

2

C

34.208

3.786

75

27.440

42.645

2

Antes de continuar

  • La tabla del ANOVA requiere un poquito más de preparación y para ello nos ayudaremos del paquete rstatix para agregar los asteriscos de significancia.
library(rstatix)
tabla_anova <- as.data.frame(Anova(lm2))
tabla_anova <- cbind(parametro = row.names(tabla_anova), tabla_anova)
tabla_anova <- add_significance(tabla_anova, 
                 p.col = "Pr(>F)", 
                 output.col = " ",
                 cutpoints = c(0, 0.001, 0.01, 0.05, 0.1, 1),
                 symbols = c("***", "**", "*", ".", "ns"))
tabla_anova <- colformat_double(flextable(tabla_anova), digits = 3, j = c(2, 4, 5))
tabla_anova <- add_footer_lines(tabla_anova, "Códigos Signif. 0 '***', 0.001 '**', 0.1 '*', 0.05 '.', 0.1 'ns'")

Antes de continuar

  • La tabla del ANOVA requiere un poquito más de preparación y para ello nos ayudaremos del paquete rstatix para agregar los códigos de significancia.
library(rstatix)
tabla_anova <- as.data.frame(Anova(lm2))
tabla_anova <- cbind(parametro = row.names(tabla_anova), tabla_anova)
tabla_anova <- add_significance(tabla_anova, 
                 p.col = "Pr(>F)", 
                 output.col = " ",
                 cutpoints = c(0, 0.001, 0.01, 0.05, 0.1, 1),
                 symbols = c("***", "**", "*", ".", "ns"))
tabla_anova <- colformat_double(flextable(tabla_anova), digits = 3, j = c(2, 4, 5))
tabla_anova <- add_footer_lines(tabla_anova, "Códigos Signif. 0 '***', 0.001 '**', 0.1 '*', 0.05 '.', 0.1 'ns'")
tabla_anova

parametro

Sum Sq

Df

F value

Pr(>F)

Pred

9.710

2

12.389

0.000

***

Residuals

29.392

75

Códigos Signif. 0 '***', 0.001 '**', 0.1 '*', 0.05 '.', 0.1 'ns'

Antes de continuar

save_as_docx("Tabla Anova" = tabla_anova, "Tabla Tukey" = tabla_tukey, "Tabla Dunnett" = tabla_dunnett,
             "Tabla Medias Marginales Esperadas" = tabla_marginal,
             path = "C:/Users/mmore/Documents/cursos_uce_2023/modulos/uce2023-modulo4/anova.docx")

Gráficos de comparaciones múltiples

  • Hay personas que prefieren tener representaciones visuales de las comparaciones múltiples.

  • Realizar este tipo de gráficos sin embargo solía demandar buena experiencia ya sea en gráficos base o ggplot2.

  • Afortunadamente, rstatix nos brinda la posibilidad de llevarlos a cabo de una manera relativamente sencilla.

  • La idea es generar un gráfico con las medias marginales observadas de la variable de interés y posicionar sobre este los resultados de las comparaciones múltiples con sus códigos de significancia (o valores p).

  • Las desventajas de esta visualización son:

    • Tienen mayor sentido realizarlas con HSD Tukey

    • Cuando el número de pares de comparaciones es muy grande, el gráfico se vuelve más difícil de interpretar que las tablas.

    • rstatix no tiene manera de directamente volver a retransformar variables a sus unidades originales.

  • Otro gráfico de cierta popularidad es el de los grupos de Tukey de las medias marginales (gráficos de barras con los números/letras sobre cada categoría). Para esto utilizaremos además el paquete stringr

Gráficos de comparaciones múltiples

ranas$Pred <- factor(ranas$Pred, levels = c("C", "NL", "L"))
bxplot <- ggboxplot(ranas, x = "Pred", 
                    y = "Age.FromEmergence", 
                    color = "Pred")
hsdvals <- emmeans_test(log.Age.FromEmergence ~ Pred, 
                        data = ranas, 
                        p.adjust.method = "mvt")
hsdvals <- add_significance(hsdvals, 
                            p.col = "p.adj", 
                            output.col = "p.adj.signif",
                            cutpoints = c(0, 0.001, 0.01, 0.05, 0.1, 1),
                            symbols = c("***", "**", "*", ".", "ns"))
hsdvals <- hsdvals %>% add_xy_position(x = "Pred")
bxplot + stat_pvalue_manual(hsdvals, y.position = c(120, 130, 140))

Gráficos de comparaciones múltiples

library(stringr)
gruposvals <- as.data.frame(cld(ph1))
gruposvals$Pred <- factor(gruposvals$Pred, levels = c("C", "NL", "L"))
ggplot(gruposvals,
       aes(x = Pred, 
           y = response, 
           fill = Pred)) +
  geom_bar(stat = "identity", 
           show.legend = F, 
           color = "black")+
  geom_errorbar(aes(ymin = response - SE, 
                    ymax = response + SE), 
                width=0.2)+
  geom_text(aes(label=str_trim(.group), 
                y = response+SE, vjust=-0.5))

ANOVA de un diseño desbalanceado

  • Recordemos que 18 tanques con predadores no letales fueron descartados debido al brote de una enfermedad.

  • El diseño original de Touchon era balanceado. Al perderse unidades experimentales, el diseño se le puede denominar como desbalanceado. En otras palabras, el desbalance es la pérdida de observaciones.

  • La mayoría de métodos estadísticos requieren ser corregidos ante observaciones perdidas para poder tener la certeza de que los estimados que obtenemos no sean sesgados.

  • Sin adentrarnos en mayor detalle, uno de los componentes de la tabla de ANOVA es la suma de cuadrados. Existen tres tipos de suma de cuadrados: I, II y III.

  • En breve, las sumas II y III se aconseja sean usadas cuando existen interacciones en el ANOVA.

  • En R, la función aov calcula la suma de cuadrados tipo I. Este tipo de suma no es conveniente ante la presencia de desbalance de los datos.

  • En cambio, la función Anova del paquete car, usa por default el tipo II que es precisamente el recomendado usar ante la presencia de desbalance.

  • En resumen, sí. Hemos utilizado hasta el momento la corrección adecuada para estos datos.

Prueba de Kruskal-Wallis

  • La prueba de Kruskal-Wallis es la alternativa no paramétrica al ANOVA de una vía.

  • Puede extenderse al ANOVA de múltiples vías reorganizando el diseño experimental.

  • Similar a las pruebas de Wilcoxon, se basa en encontrar diferencias de las medianas en lugar de las medias y su poder es menor.

  • Para ilustrar este ejemplo, tomemos la variable Age.DPO del estudio de Touchon y veamos si existen diferencias con respecto al tratamiento de predador Pred. Age.DPO (sin transformaciones no cumple con los supuestos del ANOVA).

kruskal.test(Age.DPO ~ Pred, data = ranas)

    Kruskal-Wallis rank sum test

data:  Age.DPO by Pred
Kruskal-Wallis chi-squared = 22.255, df = 2, p-value = 1.47e-05

Comparaciones múltiples con Kruskal-Wallis

  • Con KW también podemos hacer comparaciones múltiples.

  • En R base contamos con la función pairwise.wilcox.test que lleva a cabo comparaciones por pares mediante el método de Wilcoxon.

pairwise.wilcox.test(ranas$Age.DPO, ranas$Pred, p.adjust.method = "BH")

    Pairwise comparisons using Wilcoxon rank sum exact test 

data:  ranas$Age.DPO and ranas$Pred 

   C       NL   
NL 0.303   -    
L  9.8e-06 0.019

P value adjustment method: BH 

Autoevaluación # 12

  • Encuentra si existen diferencias en la longitud nariz-cloaca al emerger (SVL.initial) con respecto a los predadores Pred en los datos de Touchon. ¿Qué método es factible usar?, ¿ANOVA de una vía o Kruskal-Wallis?

ANOVA de múltiples vías

  • El ANOVA puede extenderse para analizar dos o más factores a la vez. Su nombre entonces varía dependiendo de cuántos factores analicemos, así: ANOVA de dos vías (2 factores), ANOVA de tres vías (3 factores) …

  • En la práctica es recomendable diseñar experimentos hasta máximo 3 factores:

    • A más factores, más costosa la investigación

    • A más factores, sus interacciones son más difíciles de interpretar

    • Es posible inclusive que tengamos resultados sin sentido (interacciones innecesarias)

  • ¿Qué son las interacciones?

    • Una interacción se refiere cuando los niveles de un factor podrían depender de los niveles de otro.

    • Por ejemplo, con los datos de las ranas, podríamos imaginar que en la ausencia de predadores, tener recursos altos o bajos podría influenciar el tiempo que tomaron los renacuajos en culminar la metamorfosis. Es decir, si hay predadores presentes, podría darse el caso de que las presas se escondan y coman menos influenciando así ese tiempo.

    • Así, podríamos saber si el effecto de los recursos son influenciados ante la presencia de predadores

ANOVA de múltiples vías en R

  • Vamos a usar nuevamente los datos de Touchon, la variable de respuesta es la edad de metamorfosis Age.DPO y los factores la presencia de predadores Pred y los recursos Res.

  • Para un ANOVA de múltiples vías en R podemos usar la siguiente sintaxis: Factor1*Factor2

  • Para ahorrarnos tiempo, supóngamos que ya corrimos un primer ANOVA, y encontramos que usando el logaritmo de Age.DPO podemos normalizar los residuos. Pero nos encontramos con esto:

lm4 <- lm(log(Age.DPO) ~ Pred*Res, data = ranas)
leveneTest(lm4, center = "mean")
Levene's Test for Homogeneity of Variance (center = "mean")
      Df F value    Pr(>F)    
group  5  6.0253 0.0001033 ***
      72                      
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  • ¡La homogeneidad de las varianzas no se cumple! 😱

  • ¡Ninguna otra transformación funciona!

ANOVA de múltiples vías en R

ANOVA de múltiples vías en R

  • A parte de reir, en este tipo de situaciones (que son bastante comunes), tenemos dos alternativas:

    1. Realizar pruebas no paramétricas, o

    2. Calcular ANOVAs con correcciones para heterocedasticidad.

  • Pero como acuñó el Ec. y estadístico Milton Friedman: “No existe tal cosa como un almuerzo gratis”, usar la segunda opción no es tan fácil como hemos venido viendo.

  • En R, tenemos estos caminos (de peor a mejor opción):

    1. Realizar el ANOVA usando la corrección de White-Huber disponible en la librería car, pero al costo de conducir comparaciones múltiples posiblemente sesgadas (siguiendo la lógica de realizarlas con emmeans).

    2. Utilizar rstatix para un ANOVA con la corrección de Welch, seguido de comparaciones múltiples con la corrección de Games-Howell y poder todavía realizar sus gráficos al costo de romper la secuencia de aprendizaje que hemos venido llevando para el ANOVA.

    3. Utilizar las librerías nlme para reparametrizar el modelo en forma de un modelo lineal generalizado, y posteriormente usar car y emmeans para el ANOVA y las comparaciones múltiples, respectivamente. Pero al costo de no poder graficarlas con rstatix sino desde 0.

  • A continuación entonces iremos en este orden de las opciones: 2, 3 y 1 (la última para ejemplificar cuál sería el camino suponiendo que la homocedasticidad se hubiese cumplido).

ANOVA de múltiples vías en R. Opc. 2

  • El inconveniente de usar la corrección de Welch es que esta se puede aplicar solo a ANOVAs de una vía.

  • Entonces, de manera similar a lo hicimos para poder analizar por Kruskall-Wallis un diseño factorial, tenemos que crear una variable dummy combinando los dos factores para correr un ANOVA de una vía.

  • Debemos tener en cuenta que al realizar esto, reducimos poder de la prueba estadística.

ranas$log.Age.DPO <- log(ranas$Age.DPO)
ranas$tratamiento <- paste(ranas$Pred, ranas$Res, sep = "-")
anova_op2 <- ranas %>%
  welch_anova_test(log.Age.DPO ~ tratamiento)

ANOVA de múltiples vías en R. Opc. 2

  • El inconveniente de usar la corrección de Welch es que esta se puede aplicar solo a ANOVAs de una vía.

  • Entonces, de manera similar a lo hicimos para poder analizar por Kruskall-Wallis un diseño factorial, tenemos que crear una variable dummy combinando los dos factores para correr un ANOVA de una vía.

  • Debemos tener en cuenta que al realizar esto, reducimos poder de la prueba estadística.

ranas$log.Age.DPO <- log(ranas$Age.DPO)
ranas$tratamiento <- paste(ranas$Pred, ranas$Res, sep = "-")
ranas$tratamiento <- factor(ranas$tratamiento, levels = c("C-Lo", "NL-Lo", "C-Hi", "L-Lo", "NL-Hi", "L-Hi"))
anova_op2 <- ranas %>%
  welch_anova_test(log.Age.DPO ~ tratamiento)
anova_op2
# A tibble: 1 × 7
  .y.             n statistic   DFn   DFd           p method     
* <chr>       <int>     <dbl> <dbl> <dbl>       <dbl> <chr>      
1 log.Age.DPO    78      17.2     5  24.0 0.000000305 Welch ANOVA
  • Ahora podemos realizar las comparaciones de HSD Tukey (con corrección de Games-Howell)
games_comp <- ranas %>% games_howell_test(log.Age.DPO ~ tratamiento)
games_comp <- add_significance(games_comp, 
                                p.col = "p.adj", 
                                output.col = "p.adj.signif",
                                cutpoints = c(0, 0.001, 0.01, 0.05, 0.1, 1),
                                symbols = c("***", "**", "*", ".", "ns"))
games_comp
# A tibble: 15 × 8
   .y.         group1 group2 estimate conf.low conf.high      p.adj p.adj.signif
   <chr>       <chr>  <chr>     <dbl>    <dbl>     <dbl>      <dbl> <chr>       
 1 log.Age.DPO C-Lo   NL-Lo  -0.155     -0.772    0.462  0.936      ns          
 2 log.Age.DPO C-Lo   C-Hi   -0.440     -0.700   -0.180  0.000261   ***         
 3 log.Age.DPO C-Lo   L-Lo   -0.485     -0.754   -0.217  0.0000932  ***         
 4 log.Age.DPO C-Lo   NL-Hi  -0.493     -0.821   -0.166  0.002      **          
 5 log.Age.DPO C-Lo   L-Hi   -0.643     -0.877   -0.408  0.00000114 ***         
 6 log.Age.DPO NL-Lo  C-Hi   -0.285     -0.902    0.331  0.545      ns          
 7 log.Age.DPO NL-Lo  L-Lo   -0.331     -0.947    0.286  0.419      ns          
 8 log.Age.DPO NL-Lo  NL-Hi  -0.339     -0.961    0.284  0.433      ns          
 9 log.Age.DPO NL-Lo  L-Hi   -0.488     -1.11     0.133  0.129      ns          
10 log.Age.DPO C-Hi   L-Lo   -0.0452    -0.258    0.168  0.986      ns          
11 log.Age.DPO C-Hi   NL-Hi  -0.0531    -0.351    0.244  0.988      ns          
12 log.Age.DPO C-Hi   L-Hi   -0.202     -0.362   -0.0425 0.008      **          
13 log.Age.DPO L-Lo   NL-Hi  -0.00797   -0.310    0.294  1          ns          
14 log.Age.DPO L-Lo   L-Hi   -0.157     -0.334    0.0196 0.099      .           
15 log.Age.DPO NL-Hi  L-Hi   -0.149     -0.440    0.142  0.448      ns          
  • Finalizamos con el gráfico de estas
games_comp <- games_comp %>% 
  add_xy_position(x = "tratamiento", step.increase = 1)
ggboxplot(ranas,
          x = "tratamiento",
          y = "log.Age.DPO") + 
  stat_pvalue_manual(games_comp, 
                     hide.ns = T,
                     y.position = c(5.1,5.5,5.9,6.3,6.7,7.1))

ANOVA de múltiples vías en R. Opc. 3

  • La tercera opción involucra el reparametrizar el modelo para poder analizarlo como un modelo lineal generalizado.

  • En breve, una de las ventajas de los modelos lineales generalizados es que pueden asumir varianzas distintas a través de modelar directamente la heterocedasticidad.

  • Para su implementación usaremos la librería nlme

library(nlme)
anova_op3 <- gls(log(Age.DPO) ~ Pred*Res,
                 data = ranas,
                 weights = varIdent(form = ~1|Pred*Res)) 
  • Mediante la librería car podemos obtener la tabla del ANOVA (o especificamente llamada Analisis de Desviación)
Anova(anova_op3)
Analysis of Deviance Table (Type II tests)

Response: log(Age.DPO)
         Df   Chisq Pr(>Chisq)    
Pred      2 41.5704  9.400e-10 ***
Res       1 30.6580  3.078e-08 ***
Pred:Res  2  8.0607    0.01777 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  • Ahora, usando emmeans podemos calcular el HSD de Tukey directamente sin necesidad de correcciones. Una consideración importante es que, cuando tenemos dos factores debemos hacer las comparaciones de cada factor a la vez a lo largo de los niveles del otro.
tukey_comp_pred <- emmeans(anova_op3, specs = "Pred", by = "Res", method = "tukey") # medias marginales esperadas
contrast(tukey_comp_pred, specs = "Pred", by = "Res", method = "tukey")
Res = Hi:
 contrast estimate     SE    df t.ratio p.value
 C - NL     0.0531 0.0873 10.98   0.608  0.8186
 C - L      0.2022 0.0509 20.62   3.971  0.0020
 NL - L     0.1491 0.0765  6.94   1.949  0.1959

Res = Lo:
 contrast estimate     SE    df t.ratio p.value
 C - NL     0.1548 0.1717  8.55   0.901  0.6536
 C - L      0.4854 0.0879 27.51   5.526  <.0001
 NL - L     0.3306 0.1650  7.37   2.004  0.1783

Degrees-of-freedom method: satterthwaite 
Results are given on the log (not the response) scale. 
P value adjustment: tukey method for comparing a family of 3 estimates 
tukey_comp_res <- emmeans(anova_op3, specs = "Res", by = "Pred", method = "tukey") # medias marginales esperadas
contrast(tukey_comp_res, specs = "Res", by = "Pred", method = "tukey")
Pred = C:
 contrast estimate     SE    df t.ratio p.value
 Hi - Lo    -0.440 0.0847 26.09  -5.199  <.0001

Pred = NL:
 contrast estimate     SE    df t.ratio p.value
 Hi - Lo    -0.339 0.1730  8.52  -1.957  0.0839

Pred = L:
 contrast estimate     SE    df t.ratio p.value
 Hi - Lo    -0.157 0.0560 18.93  -2.803  0.0114

Degrees-of-freedom method: satterthwaite 
Results are given on the log (not the response) scale. 
  • Para graficar estas comparaciones mediante esta opción es necesario el empezar de cero con ggplot2. La razón es que rstatix no tiene las capacidades de lidiar con interacciones provenientes de emmeans (no es compatible con la sintaxis de los comandos contrast de arriba) por lo que dejaremos esta opción hasta aquí.

ANOVA de múltiples vías en R. Opc. 1

  • Finalmente, asumamos que no tuvimos el problema de heterocedasticidad y pudimos haber seguido el curso normal para realizar las comparaciones múltiples usando solamente car, emmeans y multcomp.

  • Este es el transcurso normal de tópicos en el aprendizaje del ANOVA de múltiples vías:

  • Tabla del ANOVA con car (mencionamos que car es capaz de llevar a cabo una corrección de heterocedasticidad, esta se consigue agregando el argumento white.adjust = T dentro de la función Anova)
Anova(lm4)
Anova Table (Type II tests)

Response: log(Age.DPO)
          Sum Sq Df F value    Pr(>F)    
Pred      1.9446  2 18.7561 2.775e-07 ***
Res       1.8241  1 35.1871 9.576e-08 ***
Pred:Res  0.3254  2  3.1384   0.04934 *  
Residuals 3.7324 72                      
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  • Al igual que en la opción 3, calculamos las comparaciones múltiples viendo a cada factor a la vez a lo largo de los niveles del otro.
tukey_comp_pred1 <- emmeans(lm4, specs = "Pred", by = "Res", type = "response")
contrast(tukey_comp_pred1, specs = "Pred", method = "tukey")
Res = Hi:
 contrast ratio     SE df null t.ratio p.value
 C / NL    1.05 0.1088 72    1   0.515  0.8644
 C / L     1.22 0.0985 72    1   2.512  0.0374
 NL / L    1.16 0.1198 72    1   1.445  0.3234

Res = Lo:
 contrast ratio     SE df null t.ratio p.value
 C / NL    1.17 0.1205 72    1   1.500  0.2968
 C / L     1.62 0.1308 72    1   6.030  <.0001
 NL / L    1.39 0.1436 72    1   3.204  0.0057

P value adjustment: tukey method for comparing a family of 3 estimates 
Tests are performed on the log scale 
tukey_comp_res1 <- emmeans(lm4, specs = "Res", by = "Pred", type = "response")
contrast(tukey_comp_res1, specs = "Pred", method = "tukey", adjust = "holm")
Pred = C:
 contrast ratio     SE df null t.ratio p.value
 Hi / Lo  0.644 0.0518 72    1  -5.470  <.0001

Pred = NL:
 contrast ratio     SE df null t.ratio p.value
 Hi / Lo  0.713 0.0867 72    1  -2.782  0.0069

Pred = L:
 contrast ratio     SE df null t.ratio p.value
 Hi / Lo  0.855 0.0688 72    1  -1.951  0.0549

Tests are performed on the log scale 

Antes de continuar

  • Muchas personas gustan de las tablas de grupos de Tukey para las medias marginales esperadas en diseños experimentales factoriales al estilo que usamos para poder conducir la opción 2 anteriormente descrita.

  • Esta práctica es innecesaria si el investigador es capaz de hacer buenas inferencias basándose en las comparaciones por factor a lo largo de los niveles del otro.

  • No tienen ningún problema operacional ya que a la final es una reparametrización válida del modelo.

  • Sin embargo, cuando el modelo sobre el cual son aplicadas es incorrecto, son más susceptibles de reflejar valores p que concluyen con inferencias falaces.

  • En el largo ejemplo de las opciones a mano para lidiar con heterocedasticidad, podemos con seguridad afirmar que del peor al mejor modelo su orden sería: Opción 1 < Opción 2 < Opción 3.

  • Para ilustrar esto, con la variable dummy que creamos en la opción 2, calculemos los grupos Tukey de las medias marginales esperadas en las opciones 1 y 3 para su comparación.

Antes de continuar

  • Grupos Tukey de las medias marginales esperadas en la opción 1
lm_op1 <- lm(log(Age.DPO) ~ tratamiento, data = ranas)
emm_op1 <- emmeans(lm_op1, specs = "tratamiento", type = "response")
t_grupos_op1 <- contrast(emm_op1, specs = "tratamiento", method = "tukey")
t_grupos_op1 <- add_significance(as.data.frame(t_grupos_op1), 
                                p.col = "p.value", 
                                output.col = "p.adj.signif.op1",
                                cutpoints = c(0, 0.001, 0.01, 0.05, 0.1, 1),
                                symbols = c("***", "**", "*", ".", "ns"))
  • Grupos Tukey de las medias marginales esperadas en la opción 3
lm_op3 <- gls(log(Age.DPO) ~ tratamiento,
                 data = ranas,
                 weights = varIdent(form = ~1|tratamiento)) 
emm_op3 <- emmeans(lm_op3, specs = "tratamiento", type = "response")
t_grupos_op3 <- contrast(emm_op3, specs = "tratamiento", method = "tukey")
t_grupos_op3 <- add_significance(as.data.frame(t_grupos_op3), 
                                p.col = "p.value", 
                                output.col = "p.adj.signif.op3",
                                cutpoints = c(0, 0.001, 0.01, 0.05, 0.1, 1),
                                symbols = c("***", "**", "*", ".", "ns"))
  • Un poco de carpintería
colnames(games_comp)[c(7,8)] <- c("p.value.op2", "p.adj.signif.op2")
colnames(t_grupos_op3)[7] <- "p.value.op3"
colnames(t_grupos_op1)[7] <- "p.value.op1"

comp_table <- cbind(t_grupos_op3[,1],
                    t_grupos_op1[,c(7, 8)],
                    games_comp[,c(7, 8)],
                    t_grupos_op3[,c(7, 8)])

comp_table <- flextable(comp_table)
final_comp_table <- colformat_double(comp_table, j = c(2, 4, 6), digits = 3)
final_comp_table

t_grupos_op3[, 1]

p.value.op1

p.adj.signif.op1

p.value.op2

p.adj.signif.op2

p.value.op3

p.adj.signif.op3

(C-Lo) / (NL-Lo)

0.665

ns

0.936

ns

0.936

ns

(C-Lo) / (C-Hi)

0.000

***

0.000

***

0.000

***

(C-Lo) / (L-Lo)

0.000

***

0.000

***

0.000

***

(C-Lo) / (NL-Hi)

0.000

***

0.002

**

0.002

**

(C-Lo) / (L-Hi)

0.000

***

0.000

***

0.000

***

(NL-Lo) / (C-Hi)

0.075

.

0.545

ns

0.545

ns

(NL-Lo) / (L-Lo)

0.024

*

0.419

ns

0.419

ns

(NL-Lo) / (NL-Hi)

0.072

.

0.433

ns

0.433

ns

(NL-Lo) / (L-Hi)

0.000

***

0.129

ns

0.129

ns

(C-Hi) / (L-Lo)

0.993

ns

0.986

ns

0.987

ns

(C-Hi) / (NL-Hi)

0.995

ns

0.988

ns

0.988

ns

(C-Hi) / (L-Hi)

0.134

ns

0.008

**

0.009

**

(L-Lo) / (NL-Hi)

1.000

ns

1.000

ns

1.000

ns

(L-Lo) / (L-Hi)

0.380

ns

0.099

.

0.097

.

(NL-Hi) / (L-Hi)

0.699

ns

0.448

ns

0.447

ns

Gráficos de interacción

  • Es una forma de representar las predicciones lineales de un modelo con respecto a los niveles de sus factores.

  • Es recomendable usarlos con factores de hasta 3 niveles y en ANOVAS de dos factores así como también con las medias marginales esperadas.

  • Existen diversas formas de realizarlos en R:

    • Librería base de R (solo puede hacerlo con medias marginales observadas… al menos hasta donde tengo conocimiento)

    • Construirlos desde cero con ggplot2 (para las opciones 2 y 3).

    • Usar librerías accesorias de ggplot2 como interactions. (Esta alternativa solo es válida para la primera opción que presentamos)

Gráficos de interacción en R

library(interactions)
graf_inter1 <- cat_plot(
  lm4,
  pred = Pred,
  modx = Res,
  geom = "line",
  data = ranas
)
graf_inter1

library(interactions)
graf_inter2 <- cat_plot(
  lm4,
  pred = Res,
  modx = Pred,
  geom = "line",
  data = ranas
)
graf_inter2

Autoevaluación # 13

  • Lleva a cabo un ANOVA de dos vías para las variables Resorb.days y los factores Pred y Res. La pregunta a investigar es saber si existe una interacción entre la presencia de predadores a distintos niveles de recursos que afecte el tiempo de reabsorción de la cola en los renacuajos de ranas arbóreas de ojos rojos.

  • A pesar de que el modelo para Resorb.day que acabas de hacer cumple con los supuestos del ANOVA, solo por aprendizaje, conduce una prueba de Kruskal-Wallis usando los mismos factores.

Regresión lineal

Introducción

  • Otro modelo estadístico ampliamente usado es la regresión lineal.

  • Se diferencia del ANOVA al considerar un predictor continuo (no un factor categórico).

  • Los supuestos de la regresión lineal son:

    • Existencia de una relación lineal entre las variables continuas objeto de la regresión

    • Normalidad de los residuos

    • Que no exista multicolinearidad (en el caso de regresión múltiple)

    • Que no exista auto correlación (que las observaciones no dependan una de otra dentro de una misma variable)

    • Homogeneidad de la varianza de los residuos

  • Contrario al ANOVA, no existen correcciones o métodos alternativos cuando las transformaciones fallan.

  • Por esto, lo que se recomienda hacer es mencionar todos los detalles de la conducción del modelo. Cosa que rara vez pasa.

  • En regresión lineal es quizá en el método que más se abusa del remover outliers.

Regresión lineal en R

  • Usando los datos de Touchon, podríamos preguntarnos si el tamaño de las ranas al final de la metamorfosis SVL.final está influenciado por la edad en finalizar la metamorfosis Age.DPO.

  • Esta regresión lineal sería de la siguiente forma:

lm6 <- lm(SVL.final ~ Age.DPO, data = ranas)
summary(lm6)

Call:
lm(formula = SVL.final ~ Age.DPO, data = ranas)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.1414 -0.9521 -0.1297  0.6842  3.4349 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 21.285436   0.416763  51.073  < 2e-16 ***
Age.DPO     -0.029437   0.006052  -4.864 6.08e-06 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.262 on 76 degrees of freedom
Multiple R-squared:  0.2374,    Adjusted R-squared:  0.2273 
F-statistic: 23.65 on 1 and 76 DF,  p-value: 6.081e-06
  • Pero antes de cualquier inferencia, vamos a darle un vistazo a los diagnósticos de la regresión lineal

Diagnósticos de la regresión lineal

par(mfrow = c(2, 2))
plot(lm6)
par(mfrow = c(1, 1))

Diagnósticos de la regresión lineal

Diagnósticos de la regresión lineal

Residuos vs. Valores ajustados

En el ANOVA vimos como este plot sugería departuras de la homocedasticidad. En el caso de la regresión lineal, los residuos al no estar agrupados en categorías presentan mayor información sobre este supuesto. Adicionalmente, curvaturas en la línea roja evidencian también departuras de la linearidad. Esto quiere decir que la relación entre las variables no es completamente lineal. A veces esto puede corregirse con transformaciones.

Diagnósticos de la regresión lineal

  1. Es ideal. (b) Es indicativo de no linearidad. (c) Evidencia de heterocedasticidad. (d) Evidencia de una tendencia temporal

Diagnósticos de la regresión lineal

Gráfico Q-Q

Misma explicación que antes

Diagnósticos de la regresión lineal

Raíz cuadrada de los residuos estandarizados vs. Valores ajustados

Misma explicación que antes

Diagnósticos de la regresión lineal

Residuos vs. Apalancamiento

Aquellos puntos que estén etiquetados con números son mostrados como posibles outliers bajo dos criterios:

  • Están por fuera de los límites de la regla del rango intercuartílico (IQR), y

  • Marcados como outliers con influencia de apalancamiento mediante la prueba de Cook (distancia de Cook).

El segundo criterio es un argumento sólido para remover outliers.

Pruebas formales de los supuestos

  • Como vimos, los supuestos de la regresión lineal son más que para el ANOVA.

  • Existen varias pruebas formales para chequear cada uno de sus supuestos, sin embargo rara vez son empleadas.

  • La razón yace en que si los aplicáramos todo el tiempo, no haríamos regresiones lineales ni el 10% de las veces.

  • Si tienes curiosidad en estas pruebas puedes visitar este enlace.

  • De alguna manera podemos decir que de hecho, los estadísticos somos más laxos con la regresión lineal, sin embargo esto es bajo el supuesto no estadístico de que estas departuras de los supuestos fueran debidamente documentadas y plasmadas en los trabajos científicos, lo cual lamentablemente no pasa muy a menudo.

  • Existen por supuesto métodos que no dependen de todos estos supuestos (por ejemplo: regresiones lineales Bayesianas, modelos lineales generalizados correctamente parametrizados) pero no son parte de este curso.

Transformación de datos

  • Al igual que en el ANOVA, podemos recurrir a transformaciones de datos que nos permitan aliviar varios de los supuestos no cumplidos de la regresión lineal.

  • En el presente caso, esto lo logramos al utilizar el logaritmo natural de las dos variables del modelo

lm6 <- lm(log(SVL.final) ~ log(Age.DPO), data = ranas)
par(mfrow = c(2, 2))
plot(lm6)

par(mfrow = c(1, 1))
summary(lm6)

Call:
lm(formula = log(SVL.final) ~ log(Age.DPO), data = ranas)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.182298 -0.049070  0.000516  0.038342  0.159057 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)   3.44001    0.09211  37.345  < 2e-16 ***
log(Age.DPO) -0.11624    0.02232  -5.208 1.58e-06 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.06244 on 76 degrees of freedom
Multiple R-squared:  0.263, Adjusted R-squared:  0.2533 
F-statistic: 27.12 on 1 and 76 DF,  p-value: 1.581e-06

Interpretación de la regresión lineal

\[ y = mx + b \]


Call:
lm(formula = log(SVL.final) ~ log(Age.DPO), data = ranas)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.182298 -0.049070  0.000516  0.038342  0.159057 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)   3.44001    0.09211  37.345  < 2e-16 ***
log(Age.DPO) -0.11624    0.02232  -5.208 1.58e-06 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.06244 on 76 degrees of freedom
Multiple R-squared:  0.263, Adjusted R-squared:  0.2533 
F-statistic: 27.12 on 1 and 76 DF,  p-value: 1.581e-06
  • Por cada incremento en una unidad del logaritmo de Age.DPO, tenemos una unidad en descenso del logaritmo de SVL.final
ggplot(ranas, aes(x = log(Age.DPO), y = log(SVL.final))) +
  geom_point()+
  geom_smooth(method = "lm")

Interpretación de la regresión lineal

  • Sin embargo una interpretación en la escala logarítmica no es completamente entendible, al menos para alguien ajeno al análisis que realizamos.

  • Podríamos hacer la retransformación de las variables a sus unidades originales y generar un gráfico de las predicciones. A la final se reduce a matemática básica.

  • Afortunadamente la librería ggeffects nos salva de ese dilema!

library(ggeffects)
predicciones <- ggpredict(lm6)
predicciones
$Age.DPO
# Predicted values of SVL.final

Age.DPO | Predicted |         95% CI
------------------------------------
     35 |     20.63 | [20.05, 21.23]
     50 |     19.79 | [19.46, 20.13]
     60 |     19.38 | [19.11, 19.65]
     75 |     18.88 | [18.57, 19.20]
     90 |     18.48 | [18.08, 18.90]
    105 |     18.16 | [17.66, 18.67]
    120 |     17.88 | [17.30, 18.48]
    145 |     17.49 | [16.79, 18.22]

attr(,"class")
[1] "ggalleffects" "list"        
attr(,"model.name")
[1] "lm6"
  • Y finalmente el gráfico de predicciones
plot(predicciones$Age.DPO)

¡Antes de terminar!

El mágico \(R^2\)

El mágico \(R^2\)

  • Quizá muchos hayan escuchado que un \(R^2\) cercano a 1 es “ideal” cuando realizamos una regresión lineal.

  • Recuerdo incluso haber sido indoctrinado acerca de márgenes para un buen \(R^2\) (algo así como que por encima del 80% es “bueno”, mayor al 90% es excelente y 100% es el Nirvana).

  • En breve, \(R^2\) NO ES NINGUNA DE LAS SIGUIENTES COSAS:

    • Una métrica de bondad de ajuste: no nos dice si el modelo se ajusta bien a los datos.

    • Una métrica del error de predicción: no mide para nada que tan bueno es el modelo para predecir futuras observaciones.

    • Una métrica que permita comparar modelos usando variables transformadas: es común jugar a transformar los datos para ver de que manera se puede inflarlo hacia el santo grial.

    • Una métrica que permita que tan bien una variable explica otra: en el ejemplo que vimos, y en toda regresión lineal, si cambiamos el predictor por respuesta y viceversa, tendremos exactamente el mismo \(R^2\)

  • \(R^2\) es simplemente una medida de la cantidad de variación que un modelo específico explica. ¿Tiene alguna utilidad práctica? no lo sé, en 10 años como estadístico no lo he usado nunca, al menos no, voluntariamente…

El mágico \(R^2\)

Funciones y librerías en esta sesión

Librerías

  • UsingR y datarium contienen recursos de aprendizaje, tablas de datos básicamente.

  • rstatix es una librería para llevar a cabo tests y pruebas estadísticas básicas basada en el funcionamiento del operador de cascada de dplyr

  • car contiene diversas funciones para llevar a cabo análisis estadísticos. Está desarrollado como material adicional de un libro.

  • ggeffects ofrece funcionalidades de computación y visualización de medias marginales de una amplia diversidad de tipos de modelos.

  • emmeans se especializa en proveer funciones para el cómputo y análisis relacionados de medias marginales de diversos modelos estadísticos. multcomp y multcompView ofrecen funciones para dar formato a resultados producidos por emmeans.

  • olsrr ofrece varias pruebas estadísticas para modelos. En este módulo lo hemos usado únicamente para cómputo de pruebas de homocedasticidad de residuos.

  • ggpubr es una librería que ofrece una sintaxis reducida para producir figuras de una manera más sencilla que el uso total de ggplot2.