Ventajas de R

Un lenguaje para estadística

Objectivo

  • Veamos por qué R es una herramienta atractiva para el análisis de datos y la estadística, en especial si no tienes experiencia previa en programación.
  • Aunque todos los lenguajes de programación tienen sus ventajas, R es un lenguaje enfocado a la estadística y análisis de datos.

Comparación con otros lenguajes

En el siguiente ejemplo, compara el código que usamos en estos tres lenguajes de programación para hacer esta tarea: importar datos -> realizar un ANOVA de una vía y un ANOVA de medidas repetidas. Toma en cuenta lo siguiente:

  • MATLAB: este lenguaje es ampliamente utilizado en ingeniería y matemáticas. Como su nombre lo indica, es una herramienta de cálculo matricial (matrix laboratory). Por lo mismo, el nombre de las funciones y la sintaxis no son intuitivos para estadística. En el siguiente ejemplo, usamos la función anova1 para un ANOVA de una vía y fitrm para un ANOVA de medidas repetidas.
  • Python: es un lenguaje de programación muy poderoso con aplicaciones que cubren todo el espectro de la programación. Sin embargo, si no tiene experiencia previa en programación, la sintaxis y la estructura de los datos pueden ser confusas.
  • R: Tiene una gramática intuitiva, enfocada al análisis estadístico y amigable para principiantes. En el siguiente ejemplo, para ambos ANOVA usamos la misma función. Los argumentos de la función son claros y fáciles de entender (data significa datos, dv significa variable dependiente… etc.).

% Importar datos desde un archivo CSV
data = readtable('datos.csv');

% Realizar ANOVA
[p, tbl, stats] = anova1(data.Var1, data.Group);
disp(tbl);

% Realizar ANOVA de medidas repetidas
% Supongamos que tenemos tres medidas repetidas (Cond1, Cond2, Cond3) 
% y un factor de sujetos (Subject)
% tenemos que transformar los datos a un formato nuevo
Meas = table([data.Cond1, data.Cond2, data.Cond3], 'VariableNames', {'Measurements'});
Subjects = table(data.Subject, 'VariableNames', {'Subject'});
factorNames = {'Condition'};
rm = fitrm(Meas, 'Measurements~1', 'WithinDesign', factorNames);
ranova(rm)
import pandas as pd
import statsmodels.api as sm
from statsmodels.formula.api import ols
from statsmodels.stats.anova import AnovaRM

# Importar datos desde un archivo CSV
data = pd.read_csv('datos.csv')

# Realizar ANOVA
model = ols('Var1 ~ C(Group)', data=data).fit()
anova_table = sm.stats.anova_lm(model, typ=2)
print(anova_table)

# Realizar ANOVA de medidas repetidas
rm_anova = AnovaRM(data, 'Var1', 'Subject', within=['Condition'])
anova_results = rm_anova.fit()
print(anova_results)
# Cargar las librerías necesarias
library(tidyverse)
library(ez)

# Importar los datos desde un archivo CSV
data <- read_csv('datos.csv')

# Realizar ANOVA
ezANOVA(
  data = data,         # El dataframe con los datos
  dv = .(Var1),        # Variable dependiente
  between = .(Group),  # Factor entre sujetos
  wid = .(Subject)         # ID de los sujetos o identificador único
)

# Realizar ANOVA de medidas repetidas
ezANOVA(
  data = data,
  dv = .(Var1),  # Variable dependiente
  wid = .(Subject),  # Variable de sujeto
  within = .(Condition)  # Condiciones (medidas repetidas)
)

Uso de tuberías o pipas

  • El uso de las tuberías o “pipes” (%>%) en R te facilira el análisis de datos, especialmente si eres principiante.
  • El operador %>%, proporcionado por el paquete magrittr (parte de Tidyverse, lo veremos más a detalle adelante), permite encadenar una serie de operaciones de forma fluida.
  • Funciona al tomar el resultado de una operación y pasarlo como el primer argumento de la siguiente. Esto permite escribir código de una manera más lineal y natural, como una secuencia de pasos.

Pipas - Lectura más fácil y natural

  • Con las tuberías, el flujo de las operaciones sigue el orden en que se leen naturalmente los pasos en lugar de anidar funciones (lo cual puede ser confuso). El código se estructura de arriba a abajo, como si fuera una receta de cocina.

  • Aunque todavía no entiendas las funciones, observa cómo encadenamos las operaciones vs cómo se haría sin pipas. ¿Puedes seguir la lógica del código en los dos casos?

# Ejemplo sin pipa
summary(select(filter(data, Group == "A"), Var1))
# Ejemplo con pipa
data %>%
    filter(Group == "A") %>%
    select(Var1) %>%
    summary()

Explicación de la lógica

  • Para el ejemplo summary(select(filter(data, Group == "A"), Var1)), primero filtramos los datos filter(data, Group == "A"), luego seleccionamos la variable (select()) y finalmente mostramos el resumen summary().
  • En el segundo caso, observa el flujo por pasos:
data %>%
    dplyr::filter(Group == "A") %>%
    select(Var1) %>%
    summary()

seguir encadenando…

Como verás en el curso, muchas funciones de R se pueden encadenar de esta manera. Observa cómo ahora encadenamos un gráfico a nuestro código anterior. Esto se verá más adelante en el curso.

data %>%
  filter(Group == "A") %>%            # Filtrar por un grupo específico
  mutate(logVar = log(Var1)) %>%      # Crear una nueva columna con el log de una variable
  ggplot(aes(x = Var1, y = Var2)) +   # Crear un gráfico
  geom_point() +
  labs(title = "Gráfico de Var1 vs Var2") +
  theme_minimal()

gramática de R

  • El enfoque de R em en estadística se observa en el nombre de sus funciones
  • Estas tienden a ser muy simples y consistentes.
  • Por ejemplo, filter() filtra observaciones de tus datos, select() selecciona variables específicas,

Fin