1 Introducción

R es un lenguaje de programación interpretado, lo que quiere decir que hay un programa que interpreta el código que escribimos y nos da una respuesta en la consola donde se está ejecutando. El uso más común de R es la estadística pues la manera de escribir el código se presta muy bien para esta aplicación. Aquí comenzaremos a aprender R básico para el diseño experimental y análisis de datos. R es sumamente potente, con lo que basta decir que este curso de 8 semanas es absolutamente insuficiente para aprenderlo.

Esta sesión práctica constará de tres partes:

  1. R básico
  2. ANOVA de una vía con efectos fijos
  3. Interpretación de los resultados

2 R básico

Para hacer un ANOVA en R hay una serie de pasos que seguir. El primero es preparar el entorno de cómputo que consta de instalar R y un entorno de desarrollo como R studio. Ambos paquetes son multiplataforma (Windows, Mac o Linux). Alternativamente, pueden dirigirse a R studio cloud y acceder a la versión en línea con su cuenta institucional. Si no tienen acceso a computadora e internet en casa recomiendo la segunda opción, pues ahí pueden almacenar sus proyectos y tareas para acceder desde cualquier lugar.

Una vez que tienen R y R studio instalados, o están en R studio cloud, podemos proceder a crear un script nuevo, dando click en la hoja con un signo +, bajo el menú de Archivo o File, y seleccionamos la primera opción. En este archivo podemos ir escribiendo el código y guardar el archivo de texto. Cada línea que escribimos aquí debe ser mandada a la consola, que es donde R va a evaluar el código que esbribimos. Para correr el código escrito debemos colocar el cursor y presionar el botón Run arriba a la derecha del panel de edición de texto, o presionar las teclas Ctrl + Intro.

Existen varios tipos de objetos por default que R puede manejar, y que almacenan distintos tipos de datos. Por ejemplo con la función c creamos cadenas de números que guardamos en x usando el operador <-:

x <- c(1, 2, 3, 4, 5)

Y después podemos ver que x contiene esos valores:

x
## [1] 1 2 3 4 5

También podemos crear objetos que almacenan cadenas de texto:

a <- c("a", "b", "c", "d", "e")
a
## [1] "a" "b" "c" "d" "e"

Las cadenas de texto siempre deben in dentro de "", de otro modo R tratará de leer los objetos con nombre x ó a. Una vez que aprendimos a crear objetos de esta naturaleza podemos arreglarlos en una tabla, utilizando una función llamada data.frame:

tabla <- data.frame(a = a, x = x)
tabla
##   a x
## 1 a 1
## 2 b 2
## 3 c 3
## 4 d 4
## 5 e 5

Podemos ver que tabla contiene dos columnas, una llamada a que contiene las letras y otra llamada x que contiene los números. Para acceder a las diferentes columnas de tabla utilizamos el operador $ así:

tabla$x
## [1] 1 2 3 4 5
tabla$a
## [1] a b c d e
## Levels: a b c d e

Los objetos creados con la función data.frame son el formato más común para manejar datos dentro de R para hacer análisis estadísticos, y es lo único que necesitamos hasta ahora para hacer un ANOVA.

3 ANOVA de una vía con efectos fijos en R

Hay dos funciones de R que pueden hacer un ANOVA de una vía con efectos fijos que se llaman lm (por Linear Model en inglés) y aov (por Analysis Of Variance). Ambas funciones dan exactamente el mismo resultado para el análisis que haremos aquí, sin embargo aov es más flexible, por lo que es la que utilizaremos. Existe una función llamada anova pero esta la veremos en la sección de Interpretación de los resultados.

3.1 Creando y preparando la base de datos

Para hacer un ANOVA comenzaremos por crear una base de datos, para un experimento similar al visto en la clase pasada. Para crear la base de datos (por motivos ilustrativos únicamente), utilizaremos la función rnorm para generar números aleatorios con una distribución normal. Los argumentos que se ponen dentro de los paréntesis son: rnorm(Tamaño de muestra, Promedio, Desviación estándar). Crearemos tres objetos con 15 valores, con distintas medias y desviación estándar:

y1 <- rnorm(15, mean = 10, sd = 2)
y2 <- rnorm(15, mean = 7, sd = 3)
y3 <- rnorm(15, mean = 15, sd = 4)

El formato que necesitamos para usar la base de datos con la función aov es el largo, entonces vamos a almacenar y1, y2 y y3 en otro objeto:

y <- c(y1, y2, y3)

Y necesitamos otro objeto con los nombres de los tratamientos a los que pertenece cada valor de y. Para hacer esto vamos a usar la función rep:

tratamientos <- rep(c("A", "B", "C"), each = 15)

Y ahora ya podemos crear la tabla usando data.frame:

base.datos <- data.frame(Tratamiento = tratamientos,
                         Valores = y)
head(base.datos)
##   Tratamiento   Valores
## 1           A  8.879049
## 2           A  9.539645
## 3           A 13.117417
## 4           A 10.141017
## 5           A 10.258575
## 6           A 13.430130
tail(base.datos)
##    Tratamiento   Valores
## 40           C 13.478116
## 41           C 12.221172
## 42           C 14.168331
## 43           C  9.938415
## 44           C 23.675824
## 45           C 19.831848

Las funciones heady tail imprimen las primeras y últimas seis filas de la tabla base.datos.

3.2 El análisis

las funciones lmy aov requieren de dos argumentos deltro del paréntesis, la fórmula del modelo y la base de datos donde está contenida la información a ser analizada. La fórmula se da de la siguiente manera: y ~ x. Esta fórmula se lee “\(y\) es una función de \(x\)”, tal como se lee en la notación tradicional de funciones matemáticas. Si analizáramos los datos simulados en la sección anterior la fórmula sería Valores ~ Tratamiento. Ahora, correremos el análisis, donde primero almacenaremos los resultados arrojados por la función aov en un objeto llamado modelo.1 y revisamos el contenido de modelo.1 en la consola:

modelo.1 <- aov(formula = Valores ~ Tratamiento, data = base.datos)
modelo.1
## Call:
##    aov(formula = Valores ~ Tratamiento, data = base.datos)
## 
## Terms:
##                 Tratamiento Residuals
## Sum of Squares     746.5761  358.7810
## Deg. of Freedom           2        42
## 
## Residual standard error: 2.922739
## Estimated effects may be unbalanced

Aquí podemos ver la suma de cuadrados de los tratamientos (\(SST\)) y la suma de cuadrados del error (\(SSE\)) en la primera fila, y en la segunda los grados de libertad de los tratamientos (\(k-1\)) y de todo el experimento (\(N-k\)).

Para ver la significancia estadística de los tratamientos tenemos dos opciones, calcular \(F\) del experimento y compararlo con el valor crítico para los grados de libertad, o usar la función de R. Recordemos primero cómo se calcula \(F\):

\[MST = \frac{SST}{k-1} \]

\[MSE = \frac{SSE}{N-k} \]

\[ F = \frac{MST}{MSE} \]

De acuerdo con los resultados de aov, \(SST = 746.5761\), \(SSE = 358.7810\), \(k - 1 = 14\) y \(N - k = 30\), por lo tanto:

\[ F = \frac{746.5761/2}{358.7810/42}=43.698\]

En R podemos encontrar el valor crítico \(F*\) de \(F\) utilizando la función qf, proporcionando el nivel de significancia \(\alpha\), \(k-1\) y \(N-k\):

qf(0.05, 14, 30)
## [1] 0.4332367

debido a que \(F > F^*\), rechazamos la hipótesis nula (\(H_0\)) de no diferencias entre tratamientos. Ahora podemos verificar si el procedimiento de R sugiere lo mismo, utilizando la función summary:

summary(modelo.1)
##             Df Sum Sq Mean Sq F value   Pr(>F)    
## Tratamiento  2  746.6   373.3    43.7 5.47e-11 ***
## Residuals   42  358.8     8.5                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Como podemos ver, la probabilidad de que los tratamientos sean iguales (columna Pr(>F)) es \(P \ll 0.05\), por lo que coincide con la conclusión de los cálculos de \(F^*\).

3.3 Otras funciones importantes de R

En la mayoría de las ocasiones tenemos las bases de datos guardadas en algún directorio dentro de la computadora. El formato de estos archivos, recomendado para R es .csv, donde las columnas están separadas por comas y las filas por saltos de renglón (Intro). La función base de R para leer estos archivos en el espacio de trabajo es read.csv. El principal argumento que se da a la función es la ruta al archivo que se da envuelta en comillas: read.csv("Directorio/archivo.csv"). Veamos el ejemplo:

tabla.archivo <- read.csv("./Base-datos.csv")
head(tabla.archivo)
##   X Tratamiento   Valores
## 1 1           A  8.879049
## 2 2           A  9.539645
## 3 3           A 13.117417
## 4 4           A 10.141017
## 5 5           A 10.258575
## 6 6           A 13.430130

En este ejemplo el operador . indica leer en el mismo directorio de trabajo. Si se desea cambiar el directorio de trabajo de R es puede hacer con la función setwd("Dir nuevo/Subdir nuevo"). Una sesión normal de R utiliza como directorio de trabajo por default la carpeta personal del usuario. En R studio el directorio de trabajo de puede cambiar desde el menú principal: Sesión/Directorio de trabajo/Seleccionar directorio.

4 Aplicación del aprendizaje

En esta ocasión harás un ANOVA con efectos fijos con unos datos simulados parecidos a los que se utilizaron en el ejemplo del tutorial. Todas las indicaciones para hacerlo están en el Classroom del curso.

Regresar al índice del curso