Introducción a R 1 Empecemos

Anuncio
Introducción a R.
Mathieu Kessler
Departamento de Matemática Aplicada y Estadı́stica
Universidad Politécnica de Cartagena
Introducción a R
R es un programa de análisis de datos y realización de gráficos, en código abierto y
freeware. Es un “dialecto” del programa S y altamente compatible con el programa
comercial S-plus. La página oficial del proyecto R: http://cran.r-project.org, contiene un
gran número de recursos muy utiles, como actualizaciones, documentación, y librerı́as
de funciones.
Este documento proporciona a través de ejemplos una muy breve introducción al lenguaje
R. El objetivo es que en poco tiempo, el lector sea capaz de progresar en el dominio de
R con la ayuda de la más completa ”Introducción a R” por Venables & Smith.
1
1.1
Empecemos...
Manipulación de vectores
R manipula objetos, estos objetos pueden ser números, vectores, matrices, variables,
funciones o incluso gráficos.
Empecemos por manipular un poco objetos que son fundamentales para R: los vectores. Queremos definir un vector x que contenga los números de errores tipográficos
por páginas de un documento de 8 páginas:
23031001
Para ello, introducimos en la consola de R, la instrucción:
x=c(2,3,0,3,1,0,0,1)
La función c corresponde a la concatenación de valores.
Podemos ahora operar sobre el vector x, en particular aplicarle algunas funciones:
Podemos calcular la media y la varianza de los datos contenidos en x por ejemplo con
mean(x) y var(x), o incluso sum(x).
También podemos aplicar a x una función aunque ésta admita en principios argumentos
escalares: en este caso, el resultado es un vector que contiene el valor de la función para
cada uno de los componentes de x. Por ejemplo,
exp(x)
[1] 7.389056 20.085537 1.000000 20.085537 2.718282 1.000000 1.000000
[8] 2.718282
De hecho R está pensado para manipular vectores y no para realizar bucles. La programación por bucles es lenta y poco eficiente en R.
Podemos en todo momento obtener una lista de los objetos definidos en nuestra sesión
con el comando ls().
Insistimos en que x es un vector. Podemos manipularlo, creando por ejemplo una copia:
1
y=x
Una carácterı́stica importante de un vector es su longitud, que podemos obtener con la
instrucción length:
> length(x)
[1] 8
Para aceder a algun o algunos elementos concretos del vector x utilizaremos corchetes
[]:
> x[3]
[1] 0
> x[-1]
[1] 3 0 3 1 0 0 1
> x[c(1,3,8)]
[1] 2 0 1
El último ejemplo es particularmente importante: es fácil extraer de un vector de R un
subvector.
Para ello, podemos indicar un vector de ı́ndices tal como en x[c(1,3,8]), o indicar un
vector que contenga elementos lógicos: TRUE o FALSE:
> x[c(TRUE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE,TRUE)]
[1] 2 0 1
De hecho, permite extraer los componentes de un vector que cumplan una determinada
condición lógica: puesto que x>0 proporciona el vector lógico
> TRUE TRUE FALSE TRUE TRUE FALSE FALSE TRUE
podemos obtener los números de erratas en las páginas que presentan por lo menos una
errata introduciendo:
> x[x>0]
[1] 2 3 3 1 1
Serı́a más útil saber en qué paginas hay erratas... Para ello, podemos utilizar el comando
which, que indica en qué indices de un vector lógico aparecen TRUE:
> which(x>0)
[1] 1 2 4 5 7
R proporciona muchas facilidades para generar vectores a partir de determinados patrones:
x=1:1000
genera un vector que contiene los enteros hasta 1000. Una instrucción relacionada y más
flexible es seq que permite especificar el incremento entre cada componente:
x=seq(1,1000,by=1)
Otra función útil para generar vectores es rep que permite repetir un argumento: e.g
rep(2,5) define el vector (2,2,2,2,2).
Problemas
1. Dado un vector x, crear un vector i que contenga los ı́ndices de x.
2. Dado un vector x, crear un vector inv i que contenga los ı́ndices de x ordenados
de mayor a menor.
3. Dado un vector x, crear un vector inv x que contenga los valores de x empezando
por el último, luego el penúltimo, etc....
2
4. Introducir el vector x=c(2,5,120,5,8,11). Supongamos que me he equivocado y
he olvidado el número 7 entre el 5 y el 8 (ı́ndices 4 y 5 resp.). ¿Cómo arreglarlo?
También he olvidado el último número: después del 11, viene un 3. Finalmente,
resulta que el valor 120 es un error tipográfico, en realidad es un 12. Llevar a cabo
las correcciones pertinentes...
5. Generar dos vectores x e y tal que x contenga los valores de 0 a 5 con un incremento
de 0.01, y tal que y sea igual a sen(x). A continuación se puede realizar la gráfica
de y en función de x con la instrucción plot(x,y).
6. Generar un vector que contenga 12 valores, los primeros 4 siendo igual a 0.5, los 4
siguientes a 1.5, y los 4 últimos a 3.
7. Introduzca los siguientes vectores: > x =c(1,3,5,7,9)
> y=c(2,3,5,7,11,13)
Intentar adivinar los resultados de las siguientes instrucciones:
(a)
(b)
(c)
(d)
(e)
(f)
(g)
(h)
x+1
y*2
c(length(x),length(y))
x+y
sum(x>5)
sum(x[x>5])
sum(x[x>5 | x>3])
y[y>7]
8. Encontrar cómo calcular la media de un vector x sin utilizar la función mean.
Encontrar una manera alternativa de calcular la varianza de un vector x, utilizando
la fórmula
n
var(x) =
{x2 − (x̄)2 }
n−1
9. A lo largo de un año, los importes de las facturas mensuales de vuestro móvil han
sido:
23, 33, 25, 45, 10, 28, 39, 27, 15, 38, 34, 29
¿Cuanto habeis gastado en total en el año? ¿Cuál ha sido el gasto mı́nimo?, ¿y
el máximo? ¿Qué meses han supuesto un gasto mayor que el gasto medio? ¿Qué
porcentaje de meses han supuesto un gasto mayor que el gasto promedio?
1.2
Un poco de estadı́stica descriptiva
Pasemos ahora a considerar el ejemplo ilustrativo siguiente: queremos introducir los
valores obtenidos en mediciones repetidas de contenido en nitratos de una muestra de
agua que aparecen tabulados a continuación:
3
Concentraciónµg/l
0.45
0.46
0.47
0.48
Frecuencia Concentraciónµg/l
1
0.49
2
0.50
4
0.51
8
0.52
Frecuencia
8
10
5
2
Introducimos los valores en una variables concentracion:
concentracion<-c(0.45,rep(0.46,2),rep(0.47,4),rep(0.48,8),rep(0.49,8),rep(0.5,10),rep(0.
Podemos empezar con una exploración de los datos: la instrucción
> table(concentracion)
nos proporciona la lista de los valores distintos de concentracion junto con sus frecuencias, mientras que podemos obtener un diagrama de barra con
>barplot(table(concentracion))
Un diagrama de sectores se obtiene con
> pie(table(concentracion))
En lugar de un diagrama de sectores, podemos prefirir un histograma:
hist(concentracion) nos proporciona un histograma de los valores. Por supuesto
podemos personalizar el histograma, podemos por ejemplo añadir un titulo, y cambiar
las clases:
brk<-seq(0.4,0.6,0.5)
hist(concentracion,breaks=brk, main="Histograma de las concentraciones")
También podemos realizar un diagrama de caja y bigotes con la instrucción boxplot(concentracion),
y calcular la media, desviación tı́pica, y cuartiles:
mean(concentracion);sd(concentracion); quantile(concentracion,c(0.25,0.75))
Supongamos ahora que en una segunda sesión de mediciones se obtienen otros 20 datos
que aparecen a continuación:
0.51 ,0.51 ,0.5 ,0.49 ,0.5 ,0.56 ,0.48 ,0.49 ,0.45 ,0.48 ,0.49 ,0.53 ,0.48 ,0.48 ,0.49 ,0.49 ,0.51
,0.47 ,0.44 ,0.49
Ejercicio: Añadir a la variable concentracion ya definida los valores de la segunda
sesión. Definir una variable sesion que contenga 40 valores iguales a 1 y 20 iguales a
2.
Podemos ahora definir un ”conjunto” de datos (data frame en inglés) que asocie concentracion
con sesion utilizando la función data.frame().
conc.data<-data.frame(sesion, concentracion); conc.data
La estructura de data frame nos permite realizar análisis comparativo de las dos sesiones.
Empecemos por ejemplo por repetir el análisis descriptivo:
boxplot(concentracion∼sesion)
Si queremos calcular carácteristicas del conjunto de datos de concentracion según los
grupos definidos por la variable sesion, por ejemplo la media y la desviación tı́pica,
debemos utilizar la función tapply.
tapply(concentracion,sesion,mean).
1.3
Importar y exportar datos
En cuanto tengamos conjuntos de datos más interesantes, es muy probable que los
tengamos que importar de un fichero. Para ello, utilizaremos la instrucción read.table.
Supongamos que queremos importar los datos de un fichero llamado datos.txt, que se
presenta de la manera siguiente
4
x
y
z
1 1.2 1.5 5
2 2
3
4.4
3 1.5 5
5.4
4 2.2 3
6.1
5 1.6 3
5
Podemos introducir los datos en un conjunto (data.frame) que llamemos datos por
ejemplo:
> datos <- read.table(file="datos.txt")
> datos
x
y
z
1 1.2 1.5 5
2 2
3
4.4
3 1.5 5
5.4
4 2.2 3
6.1
5 1.6 3
5
Para aceder a las variables del data.frame datos, podemos utilizar por una parte los
corchetes:
> datos[,1]
[1] 1.2 2.0 1.5 2.2 1.6
> datos[,2]
[1] 1.5 3.0 5.0 3.0 3.0
> datos[,3]
[1] 5.0 4.4 5.4 6.1 5.0
¿Cómo podrı́amos aceder al tercer elemento de z?
Por otra parte, también podemos utilizar el hecho que un data.frame corresponde a una
lista, constituido por los objetos x, y & z:
> datos$x
[1] 1.2 2.0 1.5 2.2 1.6
> datos$y
[1] 1.5 3.0 5.0 3.0 3.0
> datos$z
[1] 5.0 4.4 5.4 6.1 5.0
La instrucción read.table admite muchas opciones (ver el documento de referencia de
R para detalles). Supongamos que queremos importar los datos desde un fichero que se
presente de la manera siguiente, por ejemplo:
10;8,04;10;9,14;10;7,46;8;6,58
8;6,95;8;8,14;8;6,77;8;5,76
13;7,58;13;8,74;13;12,74;8;7,71
9;8,81;9;8,77;9;7,11;8;8,84
11;8,33;11;9,26;11;7,81;8;8,47
14;9,96;14;8,10;14;8,84;8;7,04
6;7,24;6;6,13;6;6,08;8;5,25
4;4,26;4;3,10;4;5,39;8;5,56
12;10,84;12;9,13;12;8,15;8;7,91
7;4,82;7;7,26;7;6,42;8;6,89
5;5,68;5;4,74;5;5,73;19;12,50
El fichero (anscombe.txt en vuestro ordenador) no contiene los nombres de las variables,
utiliza el punto y coma ; como separador de columnas, y la coma, como separador decimal. Tampoco contiene etiquetas para cada fila. Supongamos que queremos importar
los datos en un data.frame llamado ans, y que les queremos dar los nombres x1, y1,
x2,y2, x3, y3, x4, y4 a los columnas.
5
ans <- read.table(file="anscombe.txt", sep=";", dec = ",", header =F, col.names
=c ("x1","y1","x2","y2","x3","y3","x4","y4"))
Finalmente, utilizaremos también la instrucción write.table para exportar data.frame
a un fichero externo. Admite la mayor parte de las opciones de read.table. ¿Podeis
adivinar el resultado de la instrucción siguiente?
write.table(ans,file="ans.txt", sep=";", dec=".")
Problemas
1. Para el conjunto de datos asociados al fichero anscombe.txt
(a) Utilizando write.table, crear un fichero llamado “ans13.txt” que sólo contenga los datos de las variables x1, y1, x3, y3.
(b) Realizar gráficas individuales de (x1,y1), (x2,y2), (x3,y3), (x4,y4).
2. Newcomb fue el primero en conseguir ¡en 1882! una estimación bastante precisa
de la velocidad de la luz. Las mediciones recogidas a continuación corresponden
a los tiempos codificados que tardó un rayo de luz en recorrer el camino de ida y
vuelta desde el laboratorio de Simon Newcomb situado en el Rı́o Potomac hasta
un espejo situado en la base del “Washington Monument”, en total una distancia
de 7400m. Para obtener los tiempos en nano segundos (10−9 s) no codificados, hay
que añadir 24800 a cada dato.1
Tiempos codificados: 28, 26, 33, 24, 34, -44, 27, 16, 40, -2, 29, 22, 24, 21, 25,
30, 23, 29, 31, 19, 24, 20, 36, 32, 36, 28, 25, 21, 28, 29, 37, 25, 28, 26, 30, 32,
36, 26, 30, 22, 36, 23, 27, 27, 28, 27, 31, 27, 26, 33, 26, 32, 32, 24, 39, 28, 24,
25, 32, 25, 29, 27, 28, 29, 16, 23
Los datos se pueden encontrar en el fichero newcomb.txt.
(a) Después de importar los datos, llevar a cabo un análisis exploratorio del
conjunto, utilizando cuantas representaciones gráficas estimeis necesarias.
(b) Utilizando estos datos, ¿qué valor proporcionarı́as para la velocidad de la luz?
3. Un geyser es un nacimiento de agua hirviente que de vez en cuando se vuelve
inestable y expulsa agua y vapor. El geyser ”Old Faithful” en el parque de Yellowstone en Wyoming es probablemente el más famoso del mundo. Los visitantes
del parque se acercan al emplazamiento del geyser intentando no tener que esperar
demasiado para verlo estallar. Los servicios del Parque colocan un cartel donde
se anuncia la próxima erupción. Es por lo tanto de interés estudiar los intervalos
de tiempo entre dos erupciones conjuntamente con la duración de cada erupción.
En el fichero geyser.txt están los datos correspondientes a la duración de 222
erupciones asi como el intervalo de tiempo hasta la siguiente erupción, durante los
meses de agosto 1978 y agosto 1979. Las unidades de medición son mn.
(a) Importar los datos, realizar una exploración gráfica, ¿qué caracterı́sticas parecen presentar los datos?.
1
Fuente: Moore, David S. and McCabe, George P. (1989). Introduction to the Practice of Statistics,
W. H. Freeman and Company: New York, NY, pp 3-16.
6
(b) ¿Podeis identificar dos grupos de erupciones? Crear una variable grupo, que
indique a qué grupo se asigna cada erupción.
(c) ¿Cómo utilizar estos datos para predicir el momento de la próxima erupción?
7
Descargar