Introducción a R

José R. Berrendero

Temas

  • Introducción

  • Tipos de objetos: vectores, matrices, listas, data frames

  • Simulación e inferencia con R: algunos ejemplos sencillos

  • Gráficos

  • Introducción a la programación

¿Qué es R?

R es un conjunto integrado de funciones para manejo de datos, cálculo y gráficos

  • Comandos para manejar y almacenar conjuntos de datos
  • Operadores para llevar a cabo cálculos con vectores y matrices
  • Comandos para llevar a cabo diversos análisis de datos
  • Comandos para gráficos
  • Un lenguaje de programación especialmente adaptado a cálculos estadísticos

La aplicabilidad de R se puede extender mediante paquetes de funciones. La distribución básica contiene aproximadamente 25 paquetes.

Un poco de historia

  • Becker, Chambers y Wilks desarrollaron en los años 70 el lenguaje S en los Bell labs.

  • S tiene implementaciones comerciales (SPlus, muy utilizado en los años 90)

  • Ross Ihaka y Robert Gentleman (R & R) escriben R en 1996

  • Actualmente, es desarrollado y mantenido por un equipo de unas 20 personas, el llamado core group

¿Por qué aprender R?

  • Es gratuito

  • Al ser código abierto, una numerosa comunidad de usuarios ha contribuido a ampliar sus aplicaciones

  • Es mucho más flexible que otros productos comerciales

  • En la actualidad es el software estándar en estadística computacional

  • Existen versiones para Windows, Mac y Linux

Algunos enlaces

Características básicas

  • Orientado a objetos
  • Distingue mayúsculas y minúsculas
  • Los nombres de objetos empiezan por una letra
  • Operador de asignación: x <- 10 o x = 10
  • Combinar objetos: x <- c(2, 3, 4)
  • Lista de objetos en el área de trabajo ls()
  • Borrar objetos: rm()
  • Obtener ayuda: help() o help.search()

Área y directorio de trabajo

  • Para conocer el directorio de trabajo: getwd()
  • Para cambiarlo: setwd()
  • Al responder afirmativamente al salir del programa se guardan todos los objetos del área de trabajo en el fichero .RData
  • Un directorio de trabajo distinto para cada proyecto

Práctica 1: el primer contacto con R

Vectores: comandos para generarlos

1:5
[1] 1 2 3 4 5
seq(2, 10, 2)
[1]  2  4  6  8 10
rep(c(1,3), 4)
[1] 1 3 1 3 1 3 1 3

Vectores: reciclaje

  • En operaciones que requieren cierta dimensión, R automáticamente recicla (repite los valores) hasta llegar a la dimensión requerida
  • Los escalares son vectores de dimensión 1
3 + c(1,2,3)
[1] 4 5 6
c(1,2) + c(7,8,9)
[1]  8 10 10

Vectores: valores especiales

NA, NaN, Inf, NULL

x <- c(NA, NaN, Inf, 0, 3, NULL)
1/x
[1]        NA       NaN 0.0000000       Inf 0.3333333
x - x
[1]  NA NaN NaN   0   0
1/x - (x-x)
[1]        NA       NaN       NaN       Inf 0.3333333

Vectores: variables lógicas

Toman los valores TRUE y FALSE

Se generan al evaluar condiciones:

x = rnorm(7)
x > 0
[1]  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE

Vectores: variables lógicas

Se usan operadores lógicos para escribir condiciones más complejas:

< , <= , > , >= , == , != , & , | , !

  • ¿Cuál es la diferencia entre x = 0 y x == 0?
  • c1 & c2 es la intersección entre las condiciones c1 y c2
  • c1 | c2 es la unión de las condiciones c1 y c2
  • !c es la negación de la condición c

Vectores: variables lógicas

En operaciones aritméticas TRUE toma el valor 1 y FALSE toma el valor 0

x <- -10:20
sum(x>0)
[1] 20
sum(x==0)
[1] 1

Vectores: filtrado

  • Seleccionar algunas de las coordenadas
x <- (1:5)^2
x[2]
[1] 4
x[c(2,5)]
[1]  4 25
x[-c(2,5)]
[1]  1  9 16
  • Seleccionar los elementos que cumplen cierta condición
x <- (1:5)^2
x[x > 15]
[1] 16 25
which(x>15)
[1] 4 5

Matrices

  • Las matrices son también vectores pero con dos atributos adicionales: número de filas y número de columnas

  • Los vectores no son matrices con una fila o con una columna

  • Para crear una matriz

matrix(1:3, nrow = 2, ncol = 3)
     [,1] [,2] [,3]
[1,]    1    3    2
[2,]    2    1    3

Matrices

  • Sumar un vector y una matriz
c(1,2) + matrix(1:9, 3,3)
     [,1] [,2] [,3]
[1,]    2    6    8
[2,]    4    6   10
[3,]    4    8   10
  • El resultado hereda los atributos de la matriz

Matrices

  • Las matrices son también vectores
x <- matrix(5:15, 3, 3)
x
     [,1] [,2] [,3]
[1,]    5    8   11
[2,]    6    9   12
[3,]    7   10   13
x[x>6]
[1]  7  8  9 10 11 12 13

Matrices

Extraer submatrices

x[1,2]
[1] 8
x[,3]
[1] 11 12 13
x[3,-1]
[1] 10 13

Pegar vctores

y <- 1:3
z <- 4:6
cbind(y,z)
     y z
[1,] 1 4
[2,] 2 5
[3,] 3 6
rbind(y,z)
  [,1] [,2] [,3]
y    1    2    3
z    4    5    6

Aplicar funciones a filas o columnas

x
     [,1] [,2] [,3]
[1,]    5    8   11
[2,]    6    9   12
[3,]    7   10   13
mean(x)
[1] 9
apply(x,2,mean)
[1]  6  9 12
apply(x[1:2,],1,sort)
     [,1] [,2]
[1,]    5    6
[2,]    8    9
[3,]   11   12

Cada aplicación de la función da lugar a una columna del resultado

Matrices: operaciones más habituales

  • Producto matricial: A %*% B
  • Producto elemento a elemento: A*B
  • Traspuesta: t(A)
  • Determinante: det(A)
  • Extraer la diagonal: diag(A)
  • Resolver un sistema de ecuaciones lineales (\( Ax=b \)): solve(A,b)
  • Inversa: solve(A)
  • Autovalores y autovectores: eigen(A)

Listas

  • Una lista es un vector de objetos de tipos distintos, que conviene agrupar en la misma estructura
  • Es importante comprenderlas porque muchas funciones de R devuelven los resultados en forma de lista
  • Para crearlas se usa el comando list
milista <- list(nombre='Pepe',no.hijos=3,
edades.hijos=c(4,7,9)) 
str(milista)
List of 3
 $ nombre      : chr "Pepe"
 $ no.hijos    : num 3
 $ edades.hijos: num [1:3] 4 7 9

Listas

milista$nombre 
[1] "Pepe"
milista[[1]]
[1] "Pepe"
milista$edades.hijos[2]
[1] 7

Listas

Algunas cuestiones:

  • ¿Cuál es la diferencia entre milista[1] y milista[[1]]?
  • ¿Cuál es el resultado de milista[2:3]?
  • ¿Y el resultado de milista[[2:3]]?

Dos comandos útiles:

  • lapply para aplicar una función a cada elemento de una lista (el resultado es otra lista)
  • sapply actúa igual, pero el resultado es un vector

Data frames

  • Se utilizan para guardar los ficheros de datos
  • Intuitivamente son matrices con entradas de distintos tipos. Técnicamente es una lista formada por vectores (heterogéneos) de la misma longitud
  • Para crearlos se utiliza el comando data.frame
x <- 7:9
y <- c('a','b','c')
mifichero <- data.frame(edad=x, grupo=y)
mifichero
  edad grupo
1    7     a
2    8     b
3    9     c

Data frames

  • Admiten comandos para matrices y para listas
mifichero$edad
[1] 7 8 9
mifichero[1,]
  edad grupo
1    7     a

Data frames

  • Admiten los comandos lapply y sapply

  • Datos de duración y tiempo de espera entre erupciones del geyser Old faithful

sapply(faithful,summary)
        eruptions  waiting
Min.     1.600000 43.00000
1st Qu.  2.162750 58.00000
Median   4.000000 76.00000
Mean     3.487783 70.89706
3rd Qu.  4.454250 82.00000
Max.     5.100000 96.00000
  • ¿Qué ocurre si usamos lapply(faithful,summary)?

Importar datos a R

enlace <- 'http://verso.mat.uam.es/~joser.berrendero/datos/notas.txt'
notas <- read.table(enlace, sep = " ", dec = ",", header = TRUE)
  • Significado de las opciones utilizadas:
argumento valor efecto
sep Espacio en blanco El carácter que se usa para separar variables
dec , Una coma separa la parte entera y la decimal de cada número
header TRUE La primera línea contiene los nombres de las variables

Importar datos a R

  • En lugar del enlace, se puede dar simplemente el nombre de un fichero situado en el directorio de trabajo.

  • Si el fichero está en formato csv (variables separadas por comas) se puede usar read.csv en lugar de read.table.

  • Muchos programas (excel, SPSS) permiten guardar los datos en formato de texto o csv.

  • Una vez guardados los datos en uno de estos formatos, podemos usar read.table o read.csv para llevarlos a R.

Distribuciones de probabilidad

  • Cada distribución se nombra mediante una palabra clave o alias.

  • Una lista completa de las distribuciones: help(Distributions)

  • A cada distribución se le antepone un prefijo que determina una función relacionada

    Funciones Prefijos
    Función de distribución p
    Función cuantílica q
    Función de densidad (continuas) o de probabilidad (discretas) d
    Generación de números aleatorios r

Distribuciones de probabilidad

Algunas cuestiones:

  • Calcula la mediana de una exponencial de media 2
  • Calcula la probabilidad de que una v.a. \( \chi^2 \) con 5 gl sea menor o igual que 7
  • Determina un valor x tal que \( P(Z > x) = 0,3 \), donde \( Z \) es una v.a. con distribución normal estándar

Simulación: un ejemplo sencillo

  • ¿Qué se obtiene con el código siguiente?
x <- rnorm(50*1000)
x <- matrix(x, nrow=50, ncol=1000)
medianas <- apply(x, 2, median)
  • Alternativamente se puede usar el comando replicate

Simulación

Para obtener n valores sin reemplazamiento del vector x:

x <- 1:5
sample(x, 3)
[1] 1 4 2

Para obtener n valores con reemplazamiento del vector x:

sample(x, 8, rep=TRUE)
[1] 2 3 5 2 2 2 4 4

¿Cómo se obtiene una permutación?

Simulación

  • ¿Qué se obtiene con el código siguiente?
x <- rnorm(50*1000)
x <- matrix(x, nrow=50, ncol=1000)
medianas <- apply(x, 2, median)
  • Alternativamente se puede usar el comando replicate
medianas <- replicate(1000, median(rnorm(50)))

Descripción de datos

hist(medianas)

plot of chunk unnamed-chunk-26

boxplot(medianas)

plot of chunk unnamed-chunk-27

Descripción de datos

mean(medianas)
[1] -0.001740418
quantile(medianas, c(0.25, 0.75))
       25%        75% 
-0.1182902  0.1122466 
sd(medianas)
[1] 0.1713657
var(medianas)
[1] 0.0293662

Ajuste de un modelo de regresión

  • Para ajustar un modelo lm(formula, data)
  • Para especificar el modelo se utiliza el argumento fórmula
  • El data frame en el que están los datos se especifica con el argumento data
  • La siguiente tabla muestra ejemplos de especificaciones del modelo
Sintaxis Modelo Formulación
y~x Regresión simple \( Y=\beta_0 + \beta_1x+ \epsilon \)
y~x-1 Regresión simple a través del origen \( Y=\beta_1x+ \epsilon \)
y~x1+x2 Regresión múltiple \( Y=\beta_0 + \beta_1x_1+ \beta_2x_2 + \epsilon \)

Ajuste de un modelo de regresión

x <- rnorm(50)
y <- x + rnorm(50, sd=0.2)
plot(x,y)

plot of chunk unnamed-chunk-30

regresion <- lm(y~x)

Ajuste de un modelo de regresión

summary(regresion)

Call:
lm(formula = y ~ x)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.43736 -0.11597  0.00842  0.09560  0.43883 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -0.008595   0.027260  -0.315    0.754    
x            1.035475   0.027348  37.862   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.1922 on 48 degrees of freedom
Multiple R-squared:  0.9676,    Adjusted R-squared:  0.9669 
F-statistic:  1434 on 1 and 48 DF,  p-value: < 2.2e-16

Ajuste de un modelo de regresión

names(regresion)
regresion$coefficients
 (Intercept)            x 
-0.008594736  1.035474991 

Ajuste de un modelo de regresión

plot(regresion$residuals,regresion$fitted.values)

plot of chunk unnamed-chunk-34

Práctica 2: regresión lineal con R

Gráficos

  • Comandos de alto nivel: Son comandos con los que se puede crear un gráfico nuevo.

  • Comandos de bajo nivel: Son comandos que permiten añadir elementos (puntos, líneas, texto, etc.) a un gráfico ya existente

  • Parámetros: Permiten modificar el aspecto de los gráficos

  • Paquetes especializados: Un paquete de gráficos muy utilizado es ggplot2

Gráficos: comandos de alto nivel

  • Ya han ido apareciendo los más importantes: plot, hist, boxplot, etc

  • Los argumentos que más se usan son:

Uso Argumento
Tipo de gráfico (puntos, líneas) type='l'
Leyendas de los ejes xlab=, ylab=
Rango de los ejes xlim=c(min,max), ylim=c(min,max)
Título main=
Subtítulo sub=

Gráficos: comandos de bajo nivel

Los que más se usan son:

Uso Commando
Añadir puntos \( (x_i,y_i) \) points(x,y)
Añadir líneas lines(x,y)
Dibuja una recta \( y=a+bx \) abline(a,b)
Dibuja una recta \( y=c \) abline(h=c)
Dibuja la recta de regresion abline(lm(y~x))
Añade título title()
Añade una leyenda en \( (x,y) \) legend(x,y,legend)

Gráficos: parámetros

  • Los gráficos se pueden personalizar a través de más de 60 parámetros

  • La mayoría de los parámetros (pero no todos) se pueden usar como argumentos en los comandos de alto y bajo nivel. En este caso tienen efecto en el gráfico que estamos dibujando en este momento

  • También pueden fijarse valores mediante el comando par. Los valores tendrán efecto para todos los gráficos

Gráficos: parámetros

Algunos de los parámetros más usados

Parámetro Uso
bg Color del fondo (véase colors())
bty Tipo de ejes ('o','l','c','7','u',']'
cex Tamaño de los símbolos y texto
col Color de los símbolos y texto
lty Tipo de líneas (1, continua; 2, discontinua; 3, puntos;…)
lwd Ancho de líneas (por defecto, lwd=1)
pch Tipo de símbolo

Gráficos: ejemplo

x <- rnorm(50)
y <- x + rnorm(50, sd=0.5)
plot(x,y,cex=1.1,pch=16,col='blue',bty='l')
abline(lm(y~x), lwd=2,col='red',lty=2)

plot of chunk unnamed-chunk-35

Representa los siguientes gráficos

Función seno entre 0 y \( 2\pi \) (en color azul, línea el doble de gruesa)

plot of chunk unnamed-chunk-36

Representa los siguientes gráficos

Función coseno entre 0 y \( 2\pi \) (en color rojo, línea discontinua)

plot of chunk unnamed-chunk-37

Representa los siguientes gráficos

Cambiamos el tipo de ejes y añadimos línea vertical gruesa en \( \pi \)

plot of chunk unnamed-chunk-38

Representa los siguientes gráficos

Añadimos un punto en \( (4,0) \)

plot of chunk unnamed-chunk-39

Representa los siguientes gráficos

Añadimos título y leyenda:

plot of chunk unnamed-chunk-40

Código final completo

x <- seq(0, 2*pi, 0.01)
y <- sin(x)
plot(x,y, t='l', col='blue', lwd=2, bty='l')
lines(x, cos(x), col='red', lty=2)
abline(v=pi, lwd=3)
points(4,0,pch=16)
legend('bottomleft', c('seno','coseno'),lty=c(1,2),
       lwd=c(2,1),col=c('blue','red'))
title('Funciones seno y coseno')

Gráficos en paneles

x <- rnorm(50)
y <- x + rnorm(50, sd=0.5)
layout(matrix(1:4, 2))
hist(x)
boxplot(x)
plot(x,y)
plot(x,y)
abline(lm(y~x))

Gráficos en paneles

plot of chunk unnamed-chunk-43

Introducción a la programación con R

  • El formato general de una función es
nombre <- function(arg1=val1,arg2=val2,...){
...
expresiones de R
...
}
  • Los valores por defecto de los argumentos no son obligatorios

  • Una función puede no terner argumentos

  • La función devuelve como resultado el valor de la última expresión evaluada, o aquello que aparezca en el comando return

Introducción a la programación con R

  • Antes de utilizar una función hay que cargarla en el área de trabajo. Para ello, hay varias alternativas:

    1. Escribir el código directamente en la consola (solo funciones muy sencillas)
    2. Escribir el código en un fichero de texto, marcarlo con el ratón y copiarlo en la consola
    3. Escribir el código en un fichero de texto, guardar el fichero en el directorio de trabajo y ejecutar source(fichero)
  • Una vez cargada la función en la memoria activa, ya puede utilizarse.

Práctica 3: introducción a la programación