José R. Berrendero
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
R es un conjunto integrado de funciones para manejo de datos, cálculo y gráficos
La aplicabilidad de R se puede extender mediante paquetes de funciones. La distribución básica contiene aproximadamente 25 paquetes.
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
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
La página de R: www.r-project.org/
Documentación oficial: cran.r-project.org/manuals.html
Blogs: www.r-bloggers.com
Paquetes de R: cran.at.r-project.org/web/packages/
RStudio: www.rstudio.com/ide/
x <- 10 o x = 10x <- c(2, 3, 4)ls()rm()help() o help.search()getwd()setwd().RData1: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
3 + c(1,2,3)
[1] 4 5 6
c(1,2) + c(7,8,9)
[1] 8 10 10
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
Toman los valores TRUE y FALSE
Se generan al evaluar condiciones:
x = rnorm(7)
x > 0
[1] TRUE FALSE TRUE TRUE FALSE TRUE TRUE
Se usan operadores lógicos para escribir condiciones más complejas:
< , <= , > , >= , == , != , & , | , !
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
x <- (1:5)^2
x[2]
[1] 4
x[c(2,5)]
[1] 4 25
x[-c(2,5)]
[1] 1 9 16
x <- (1:5)^2
x[x > 15]
[1] 16 25
which(x>15)
[1] 4 5
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
c(1,2) + matrix(1:9, 3,3)
[,1] [,2] [,3]
[1,] 2 6 8
[2,] 4 6 10
[3,] 4 8 10
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
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
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
A %*% BA*Bt(A)det(A)diag(A)solve(A,b)solve(A)eigen(A)listmilista <- 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
milista$nombre
[1] "Pepe"
milista[[1]]
[1] "Pepe"
milista$edades.hijos[2]
[1] 7
Algunas cuestiones:
milista[1] y milista[[1]]?milista[2:3]?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 vectordata.framex <- 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
mifichero$edad
[1] 7 8 9
mifichero[1,]
edad grupo
1 7 a
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
lapply(faithful,summary)?enlace <- 'http://verso.mat.uam.es/~joser.berrendero/datos/notas.txt'
notas <- read.table(enlace, sep = " ", dec = ",", header = TRUE)
| 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 |
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.
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 |
Algunas cuestiones:
x <- rnorm(50*1000)
x <- matrix(x, nrow=50, ncol=1000)
medianas <- apply(x, 2, median)
replicatePara 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?
x <- rnorm(50*1000)
x <- matrix(x, nrow=50, ncol=1000)
medianas <- apply(x, 2, median)
replicatemedianas <- replicate(1000, median(rnorm(50)))
hist(medianas)
boxplot(medianas)
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
lm(formula, data)fórmula| 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 \) |
x <- rnorm(50)
y <- x + rnorm(50, sd=0.2)
plot(x,y)
regresion <- lm(y~x)
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
names(regresion)
regresion$coefficients
(Intercept) x
-0.008594736 1.035474991
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
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= |
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) |
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
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 |
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)
Función seno entre 0 y \( 2\pi \) (en color azul, línea el doble de gruesa)
Función coseno entre 0 y \( 2\pi \) (en color rojo, línea discontinua)
Cambiamos el tipo de ejes y añadimos línea vertical gruesa en \( \pi \)
Añadimos un punto en \( (4,0) \)
Añadimos título y leyenda:
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')
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))
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
Antes de utilizar una función hay que cargarla en el área de trabajo. Para ello, hay varias alternativas:
source(fichero)Una vez cargada la función en la memoria activa, ya puede utilizarse.