El objetivo de esta primera práctica es que nos comencemos a familiarizar con la manera de trabajar de R y con las principales características de su sintaxis.Seguiremos los pasos siguientes:
Hay que seguir los siguientes pasos:
Entrar en http://cran.es.r-project.org/
Elegir el enlace de descarga adecuado en función del sistema operativo (supongamos que es Windows)
Entrar en base y descargar el fichero Download R ?.??.? for Windows, donde los interrogantes ?.??.? corresponden al número de la versión más reciente
Ejecutar el fichero descargado en el ordenador
Una vez instalado el programa, veremos el correspondiente icono (con una R grande) en el escritorio. Si ejecutamos el programa, veremos una ventana (llamada la consola) en la que tenemos que escribir los comandos de los ejemplos que se describen a continuación. Para llevar a cabo esta práctica, lo más simple es copiar los comandos de R y pegarlos en la consola, y después comprobar que el resultado coincide con el que aparece aquí.
R distingue mayúsculas y minúsculas.
Para asignar contenido a un objeto usamos <-. Por ejemplo, x <- 10 asigna a x el valor 10. En lugar de <- también podemos usar =.
Para ver el contenido de un objeto simplemente escribimos su nombre.
Para usar los comandos escribimos el nombre del comando seguido de sus argumentos entre paréntesis. Por ejemplo, ls() da una lista de los objetos en el área de trabajo. Como no usamos argumentos (diferentes a los que el comando tenga por defecto) no escribimos nada en el paréntesis.
Para obtener ayuda usamos el comando help. Por ejemplo, help(mean) para obtener ayuda sobre el comando mean que calcula la media.
El comando c se usa para combinar varios objetos en uno solo. Por ejemplo:
x <- c(3, 5, 10) # Crea el vector x = (3, 5, 10)
x
## [1] 3 5 10
mean(x) # Calcula la media de x
## [1] 6
Es bastante habitual encontrar datos en la web en formato de texto. Antes de poder trabajar con ellos hemos de importarlos a un formato con el que R pueda trabajar.
La Comunidad de Madrid evalúa anualmente a los alumnos de sexto de primaria de todos los colegios sobre varias materias. Los datos que vamos a utilizar corresponden a las notas medias obtenidas por los colegios en los años 2009 y 2010 (fuente: diario El País) junto con el tipo de colegio (concertado, privado o público)
El comando read.table lee un fichero de datos de texto y crea un fichero con el que R ya puede trabajar. En nuestro ejemplo vamos a usar los siguientes argumentos:
El camino en el que se encuentra el fichero (entre comillas).
El argumento sep que especifica la separación entre las distintas variables. En este caso, un espacio en blanco.
El argumento dec que especifica cómo se separa en los números la parte entera y la parte decimal. En este caso, mediante una coma.
El argumento header que especifica si la primera fila del fichero contiene (TRUE) o no (FALSE) los nombres de las variables. En este caso, la primera fila sí contiene los nombres de las variables.
notas <- read.table("http://www.uam.es/joser.berrendero/datos/notas.txt",
sep = " ", dec = ",", header = TRUE)
Hemos creado un objeto de R, llamado notas, que contiene los datos en un formato con el que R ya puede trabajar. Técnicamente, este tipo de objetos se llaman data frames.
Para ver los nombres de las variables del fichero notas, escribimos:
names(notas)
## [1] "tipo" "nota09" "nota10"
Dentro de este fichero cada variable se identifica usando la sintaxis fichero$variable. Por ejemplo, las medias de las notas de 2009 y 2010 se obtienen con los comandos:
mean(notas$nota09)
## [1] 6.605
mean(notas$nota10)
## [1] 5.44
Las desviaciones típicas de las notas de 2009 y 2010 se obtienen con los comandos:
sd(notas$nota09)
## [1] 1.032
sd(notas$nota10)
## [1] 1.195
El comando summary permite calcular algunas medidas descriptivas elementales de todas las variables del fichero simultáneamente:
summary(notas)
## tipo nota09 nota10
## concertado:392 Min. :2.17 Min. : 0.00
## privado : 98 1st Qu.:5.97 1st Qu.: 4.81
## publico :732 Median :6.68 Median : 5.50
## Mean :6.61 Mean : 5.44
## 3rd Qu.:7.35 3rd Qu.: 6.25
## Max. :9.34 Max. :10.53
Un histograma de las notas de 2009. La distribución es bastante simétrica aunque muestra una ligera asimetría a la izquierda.
hist(notas$nota09)
Para comparar conjuntos de datos un diagrama de caja puede ser más útil que un histograma. Por ejemplo, para comparar las notas de 2009 con las de 2010:
boxplot(notas$nota09, notas$nota10)
Vemos que en 2010 las notas tienden a ser más bajas. También podemos comparar las notas de 2010 para cada tipo de colegio. Aunque las diferencias no son muy grandes, los centros privados tienden a tener notas más altas que los concertados, y éstos más altas que los públicos.
boxplot(notas$nota10 ~ notas$tipo)
Para estudiar si hay relación entre las notas de los dos años podemos representar la correspondiente nube de puntos:
plot(notas$nota09, notas$nota10)
Se observa una relación positiva moderada. Numéricamente, esta relación se puede cuantificar mediante la covarianza y la correlación:
cov(notas$nota09, notas$nota10)
## [1] 0.6504
cor(notas$nota09, notas$nota10)
## [1] 0.5273
El valor de la correlación es moderadamente positivo, tal y como habíamos observado al mirar la nube de puntos.
Además de para analizar datos, R se puede usar para llevar a cabo todo tipo de representaciones gráficas y cálculos matemáticos. Por ejemplo, la función \( cos (x^2) \) se puede representar (entre 0 y \( 2\pi \)) mediante:
curve(cos(x^2), 0, 2 * pi)
La integral de la función anterior entre 0 y \( \pi \) se calcula con:
integrate(function(x) cos(x^2), 0, pi)
## 0.5657 with absolute error < 9.5e-06
Una derivada de la función se obtiene de la siguiente forma:
D(expression(cos(x^2)), "x")
## -(sin(x^2) * (2 * x))
Para representar la función de densidad de una variable aleatoria normal de media \( \mu=3 \) y desviación típica \( \sigma=1 \) escribimos:
curve(dnorm(x, mean = 3, sd = 1), -1, 7)
Hemos usado el comando dnorm, con los argumentos adecuados, para evaluar la función de densidad normal. Si lo que queremos es generar 1000 números aleatorios que sigan esta distribución y después representar el correspondiente histograma:
x <- rnorm(1000, mean = 3, sd = 1)
hist(x)
Al entrar en R, se considera cierto directorio por defecto como el directorio de trabajo. Este directorio puede cambiarse en el menú Archivo, Cambiar dir…. Resulta conveniente tener un directorio diferente para cada proyecto que realicemos.
Al salir de R se nos pregunta Guardar imagen de área de trabajo?. Si respondemos afirmativamente, se crea un fichero .RData en el directorio de trabajo que contiene todos los objetos del área de trabajo en el momento de salir. Posteriormente, haciendo doble click en este fichero podremos entrar en R y seguir trabajando exactamente en el mismo punto en que lo habíamos dejado al salir.
Alternativamente podemos usar los comandos save y load para guardar y recuperar objetos. Consulta la ayuda de estos comandos para ver sus diferentes opciones.
Todos los comandos y código de R se pueden guardar en un fichero de texto (con extensión.R) dentro del directorio de trabajo. El comando source se puede usar para ejecutar todo el código contenido en un fichero de texto. En el menú Archivo, Abrir script podemos acceder a un editor muy simple en el que poder ir escribiendo el código.
Podemos escribir también nuestras propias funciones. En este apartado vamos a ver un ejemplo muy simple. Se trata de escribir una función que simule los resultados de \( n \) tiradas de un dado. Por defecto \( n=50 \). El resultado es un vector que contiene las frecuencias de cada posible resultado. Abrimos el editor (Archivo, Abrir script) y escribimos:
Dado <- function(n = 50) {
# Genera n lanzamientos de un dado y devuelve la tabla de frecuencias
lanzamientos <- sample(1:6, n, rep = TRUE) # Selecciona con reemplazamiento n números en 1,2,...,6
frecuencias <- table(lanzamientos) # Obtiene la tabla de frecuencias
return(frecuencias)
}
Una vez guardado el fichero que contiene la función podemos usar source(nombre del fichero) para cargar la función en el área de trabajo y poder usarla o, alternativamente, copiar y pegar el código anterior en la consola. Una vez hecho esto, ya podemos usar la función.
Dado(1000)
## lanzamientos
## 1 2 3 4 5 6
## 149 166 164 178 165 178
Dado()
## lanzamientos
## 1 2 3 4 5 6
## 9 9 6 11 11 4