Introducción a R

Antonio Martínez Pineda

26 de febrero de 2018

¿Qué es R?

R es un primeramente un lenguaje de programación y también un ambiente estadístico con amplias capacidades analíticas y gráficas. Un gran número de los líderes innovadores en investigación de todas las áreas de conocimiento han optado por utilizar R por sus ventajas prácticas ante los paquetes estadísticos comerciales, por mencionar las más importantes, R permite conocer los algoritmos con que se realizan los análisis y modificar los outputs de acuerdo a las necesidades del investigador, además de contar con características gráficas que permiten incluso modelación en 3D y animación. Por último, pero en cierta forma lo más atractivo para la academia, R es un ambiente de open source, miles de colaboradores aumentan y dan mantenimiento día a día a las capacidades de R y es gratuito por lo que las limitaciones de presupuesto no son un obstáculo.

Propiedades aritméticas

R tiene amplias capacidades aritméticas

5 + 4  #suma
[1] 9
5 - 4  #resta
[1] 1
5 * 4  #multiplicación
[1] 20
144/12  #división
[1] 12
12^2  #exponencial
[1] 144

Propiedades aritméticas (cont.)

log(10)  #logaritmo natural
[1] 2.302585
exp(10)  #antilogaritmo
[1] 22026.47
sqrt(36)  #raíz cuadrada
[1] 6
factorial(4)  #números factoriales
[1] 24
round(pi, 2)  #redondeo
[1] 3.14

Simulación

Con R se puede hacer simulación de datos con funciones para números aleatorios siguiendo diferentes distribuciones (beta, binomial, \(\chi^2\), exponecial, normal, etc.)

rnorm(10)  # 10 números aleatorios con distribución normal
 [1] -0.4158982 -2.5158034  1.3278188  0.2252587 -0.6837098  0.1408196
 [7] -1.0334554  0.6642428 -0.4301620  1.3501236
rbinom(10, 1, 0.5)  # 10 número aleatorios con distribución binomial
 [1] 1 1 0 1 0 0 0 1 0 0
rchisq(10, 5)  # 10 número aleatorios con distribución ji cuadrada
 [1] 3.593771 9.707816 5.348830 6.746918 4.756520 6.021645 7.025801
 [8] 7.886793 1.718199 6.300808
runif(10, -3, 3)  # 10 números aleatorios con distribución uniforme
 [1]  1.4924206  2.7094116  1.2989962  2.7161007  0.3535093 -1.4996755
 [7]  0.8861450 -0.1238757  0.5089241  0.9539725

Ayuda

La gran mayoría de los paquetes y funciones de R tienen documentos de ayuda asociados, estos documentos pueden consultarse con la funciones ‘help()’ o ‘?’ si se conoce el nombre de la función o paquete que se quiere consultar, o se pueden utilizar terminos de búsqueda con la función ‘apropos()’

Además existen foros de ayuda para la comunidad usuaria de R y generalmente googlear alguna pregunta sobre cómo realizar algún procedimiento con R dará varios resultados que pueden ser de utilidad.

¿Cómo funciona R?

R trabaja orienatado a objetos en los cuales se almacena información, lo cual es una gran ventaja ya que una vez obtenida o cargada la información puede llamarse fácilmente para realizar un análisis o agregar la información con otra.

La asignación de datos a un objeto se realiza mediante el símbolo <- aunque también puede realizarse mediante el signo de igual. El código de R es sensible a las mayúsculas y minúsculas por lo que utilizarlas implica diferencias de forma que R no es lo mismo que r.

x <- 2
2 + x
[1] 4

Existen diferentes tipos de objeto en R.

Funciones

Uno de los componentes principales para trabajar en R son las funciones, estos son comandos que realizan una acción en el programa. Las funciones tienen un esquema general como el siguiente: nombre.funcion(argumentos). Como R es un lenguaje nos permite crear nuestras propias funciones.

# Función para obtener la media
mean(mtcars$mpg)
[1] 20.09062
# Argumentos de plot()
str(plot)
function (x, y, ...)  
mi_edad <- function(nacimiento, fecha) {
    cat("Tienes ", edad <- fecha - nacimiento, " años")
}
mi_edad(1993, 2016)
Tienes  23  años

Vectores

Son la unidad funcional de R, los vectores son objetos que tienen una sola dimensión y almacenan elementos de un solo tipo (numérico,caracter,lógico,etc.)

numeros <- c(1:4)  #Vector numérico
class(numeros)
[1] "integer"
numeros
[1] 1 2 3 4
letras <- letters[1:4]  #Vector de caracteres
class(letras)
[1] "character"
letras
[1] "a" "b" "c" "d"

Factores

A diferencia de los vectores de caracteres el factor determina que valores puede tomar nuestro vector. Los factores pueden ser ordenados o no. Como en todos los vectores podemos ubicar elementos señalando su posición entre corchetes.

letras
[1] "a" "b" "c" "d"
fletras <- factor(letras)
class(fletras)
[1] "factor"
fletras
[1] a b c d
Levels: a b c d
fletras[3]
[1] c
Levels: a b c d

Arreglos

Los arreglos son objetos que tienen al menos dos dimensiones y que solo pueden contener elementos de una misma clase.

arreglo <- array(1:12, dim = c(2, 3, 2))
dim(arreglo)
[1] 2 3 2
arreglo
, , 1

     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

, , 2

     [,1] [,2] [,3]
[1,]    7    9   11
[2,]    8   10   12

Matrices

matriz <- matrix(1:4, nrow = 2, ncol = 2)  #Matriz de 2X2
inversa <- solve(matriz)  #Matriz inversa de la matriz
matriz  #Las matrices son arreglos de dos dimensiones
     [,1] [,2]
[1,]    1    3
[2,]    2    4
inversa
     [,1] [,2]
[1,]   -2  1.5
[2,]    1 -0.5
matriz %*% inversa  #matriz*inversa=matriz de identidad
     [,1] [,2]
[1,]    1    0
[2,]    0    1

Matrices (cont.)

Los elementos de una matriz pueden ubicarse de forma similar a las coordenadas, por ejemplo, martiz[1,2] ubica el elemento en la fila uno y la columna dos.

matriz
     [,1] [,2]
[1,]    1    3
[2,]    2    4
matriz[1, 2]
[1] 3

Listas

Las listas son objetos que nos permiten almacenar otros objetos de distinta clase.

lista <- list(numeros, letras, arreglo, matriz)
lista
[[1]]
[1] 1 2 3 4

[[2]]
[1] "a" "b" "c" "d"

[[3]]
, , 1

     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

, , 2

     [,1] [,2] [,3]
[1,]    7    9   11
[2,]    8   10   12


[[4]]
     [,1] [,2]
[1,]    1    3
[2,]    2    4

Listas (cont.)

Los elementos de una lista pueden extraerse con [[]] o cuando se asigna un nombre con $.

names(lista) <- c("numeros", "letras", "arreglo", "matriz")
lista[[1]]
[1] 1 2 3 4
lista$letras
[1] "a" "b" "c" "d"

Bases de datos

Las bases de datos son una variación de las listas, permiten almacenar vectores de objetos de diferente tipo (numéricas, lógicas, etc.) pero todos estos objetos deben ser de la misma longitud. Generalmente en las bases de datos tenemos variables en las columnas y observaciones en las filas.

df <- data.frame(nombre = c("Ana", "Luis", "Juan", "Mary"), num.list = numeros, 
    calificacion = letras)
df
  nombre num.list calificacion
1    Ana        1            a
2   Luis        2            b
3   Juan        3            c
4   Mary        4            d
df[1, 2]  #Elemento de la fila uno columna dos
[1] 1
df$calificacion
[1] a b c d
Levels: a b c d

Bases de datos (cont.)

# La función str nos da un resumen de qué contiene información importante de
# la base de datos
str(df)
'data.frame':   4 obs. of  3 variables:
 $ nombre      : Factor w/ 4 levels "Ana","Juan","Luis",..: 1 3 2 4
 $ num.list    : int  1 2 3 4
 $ calificacion: Factor w/ 4 levels "a","b","c","d": 1 2 3 4
summary(df)  #También la función summary es de mucha utilidad
  nombre     num.list    calificacion
 Ana :1   Min.   :1.00   a:1         
 Juan:1   1st Qu.:1.75   b:1         
 Luis:1   Median :2.50   c:1         
 Mary:1   Mean   :2.50   d:1         
          3rd Qu.:3.25               
          Max.   :4.00               

Guardar y cargar objetos en R

objects()  #Lista de objetos en el espacio de trabajo
 [1] "arreglo" "df"      "fletras" "inversa" "letras"  "lista"   "matriz" 
 [8] "mi_edad" "numeros" "x"      
ls()  #Igual que objects()
 [1] "arreglo" "df"      "fletras" "inversa" "letras"  "lista"   "matriz" 
 [8] "mi_edad" "numeros" "x"      
save.image()  #Guarda una imagen del espacio de trabajo en formato .RData
save(df, file = "basedatos.RData")  #Guardar un objeto en específico

Guardar y cargar objetos en R (cont.)

rm(df)  #Se borra el objeto del ambiente global
ls()  #Ya no aparece df
[1] "arreglo" "fletras" "inversa" "letras"  "lista"   "matriz"  "mi_edad"
[8] "numeros" "x"      
load("basedatos.Rdata")  #Se carga el objeto guardado
ls()  #Nuevamente tenemos el objeto df
 [1] "arreglo" "df"      "fletras" "inversa" "letras"  "lista"   "matriz" 
 [8] "mi_edad" "numeros" "x"      

Importar datos de texto

Para importar datos desde archivos de texto existe más de una docena de funciones, las más utilizadas son read.table() y read.csv().

help(read.csv)

Importar datos

Paquete Archivos
xlsReadWrite Excel (.xls)
XLConnect Excel (.xlsx)
RODBC Bases compiladoras ODBC (MS SQLServer, MS Access, Oracle)
RMySQL Bases de datos compiladoras (MySQL)
RSQLite SQLite
foreing Minitab, S3, SAS, SPSS, Stata, Systat, dBase, ARFF, DBF,Octave,REC

Importar desde una url

R también permite importar datos desde un sitio o página web, existen varias funciones que permiten esto, pero la función download.file() es la más utilizada.

# Por practicidad guradamos la url en un vector
urlfile <- paste0("http://www.sagarpa.gob.mx//", "quienesomos/datosabiertos/uach/Documents/", 
    "Matr%C3%ADcula%20egresados%20y%20titulados%20", "Licenciatura%20UACh%202013-2014.csv")
# Después descargamos los datos indicando a la función la dirección url y el
# archivo donde se va a guardar la base de datos.
download.file(urlfile, destfile = "matUACH.csv")

Gráficas

Una de las características de R que siempre es mencionada es su poder gráfico, en R existen principalmente tres sistemas gráficos: base, ggplot2 y lattice pero hay otros paquetes que permiten realizar gráficos en 3D y animaciones.

Sistema base

Se genera una imagen en una sola capa.

data(mtcars)  #R tiene bases de datos precargados
with(mtcars, plot(wt, mpg, pch = 16, col = "orange"))
title("Gráfica con base", sub = "Relación millas por galón / peso")

ggplot2

Son gráficos construidos por capas que permiten un mayor control en la producción de la imagen.

library(ggplot2)
ggplot(mtcars, aes(wt, mpg, color = factor(cyl))) + geom_point() + geom_smooth(method = "lm")

lattice

Lattice es un sistema que permite mostrar múltiples gráficos de un conjunto de datos.

library(lattice)
xyplot(mpg ~ wt | factor(cyl), data = mtcars, panel = function(x, y) {
    panel.xyplot(x, y)
    panel.loess(x, y, span = 1)
})