Práctica 1: Introducción a R 1. Introducción R es un lenguaje de alto nivel y un entorno para el análisis de datos y gráficos. Puede descargarse libremente del sitio llamado CRAN (Comprehensive R Archive Network) en la siguiente dirección: http://cran.r-project.org o bien, simplemente buscando CRAN en Google. Al llegar a la pantalla anterior seguid para descargar el programa la siguiente ruta: windows/base/r-2.7.2-win32.exe. Una vez instalado el programa en entorno Windows, lo que vemos es la interfaz RGui (GUI es Graphical User Interface en inglés), con el símbolo > esperando la entrada de instrucciones, tal y como puede apreciarse en la figura siguiente: 1
El menú principal contiene entradas típicas de otras aplicaciones: Archivo, Editar, Visualizar, Ventanas y Ayuda, más otras dos Misc y Paquetes. El menú de Ayuda será importante en esta fase inicial. Para obtener esta ayuda podemos también optar por introducir instrucciones directamente por teclado. Introduce por ejemplo: > help(vector) y aparecerá una ventana de ayuda con información sobre el comando vector. Podemos acceder a la misma pantalla desde el menú Ayuda/Funciones R (texto), aparecerá un cuadro en el que deberemos introducir la palabra vector. Si no recordamos la grafía de una expresión podemos utilizar la expresión apropos poniendo entre paréntesis, y entre comillas, la función que buscamos. 2
que nos da las expresiones que contienen el término integer. Lo mismo se puede conseguir con Ayuda/Sobre y en el cuadro de diálogo que aparece introducimos integer. R es un lenguaje orientado a objetos. Uno de los más simples es vector. Si queremos crear un vector con las componentes (2, 3, 8) y llamarlo x, tecleamos > x <- c(2, 3, 8) Fíjate en que has de introducir el nombre del vector, x, los símbolos <-, la letra c (de concatenate en inglés), y por último las coordenadas del vector entre paréntesis. Para ver el vector que hemos creado, simplemente, tecleamos su nombre: > x [1] 2 3 8 Como ya se ha podido observar al crear el vector x, para hacer asignaciónes a las variables se utiliza una combinación de los símbolos < y - (guión). Y, en esta última versión, también podemos utilizar el signo =. El signo = también se utilizará para asignar valores a parámetros en las funciones. En la salida anterior [1] indica que el 2 que le sigue es el primer elemento del vector. Si el vector ocupara más de una línea, cada una de las nuevas líneas empezaría por [n], indicando n el lugar que ocupa dentro del vector la coordenada que le sigue. Las componentes del vector se referencian por medio de índices entre corchetes. 3
> x <- c(2, 3, 8) > x [1] 2 3 8 > x[2] [1] 3 > x[3] [1] 8 Podemos asignar un nuevo valor a alguna de las componentes del vector como se muestra en el siguiente ejemplo: > x[2] <- -3 > x [1] 2-3 8 Hemos reemplazado la segunda componente del vector x por el valor -3. Nota: Para corregir una instrucción ya introducida, podemos acceder a ella pulsando la tecla de flecha hacia arriba, las veces que sea necesario. Para dejar una instrucción a medias podemos pulsar la tecla Escape. 2. Operaciones con vectores y fucniones a) Multiplicación de un vector por un número > 2 * x [1] 4-6 16 b) Potencias > x^3 [1] 8-27 512 c) Longitud Devuelve la dimensión de un vector > length(x) 4
[1] 3 d) Suma y sumas acumuladas Devuelve la suma de las componentes del vector y la suma acumulada de las componentes > sum(x) [1] 7 > cumsum(x) [1] 2-1 7 e) Valor máximo y mínimo Devuelven los valores máximo y mínimo de las componentes de un vector > max(x) [1] 8 > min(x) [1] -3 f) Media, mediana, cuasivarianza y cuasidesviación típica de las componentes Calculan la media, mediana, cuasivarianza, y cuasidesviación típica de las componentes del vector > mean(x) [1] 2.333333 > median(x) [1] 2 > var(x) [1] 30.33333 > sd(x) [1] 5.50757 5
g) Producto de las componentes y productos acumulados > prod(x) [1] -48 > cumprod(x) [1] 2-6 -48 h) Cuartiles de x > quantile(x) 0% 25% 50% 75% 100% -3.0-0.5 2.0 5.0 8.0 i) Ordenación creciente de las componentes del vector > sort(x) [1] -3 2 8 j) Colocar las componentes de un vector en orden inverso a como han sido introducidas > rev(x) [1] 8-3 2 Cómo ordenarías en orden decreciente? k) Suma de vectores > x <- c(2, -3, 8) > y <- c(1, 2, 3) > x + y [1] 3-1 11 l) Combinación lineal de dos vectores > 5 * x - 2 * y 6
[1] 8-19 34 m) Producto y cociente de vectores > x * y [1] 2-6 24 > x/y [1] 2.000000-1.500000 2.666667 n) Covarianza y coeficiente de correlación > cov(x, y) [1] 3 > cor(x, y) [1] 0.5447048 3. Funciones de uso general 3.1. Exponenciales y logarítmicas Logaritmos neperianos de las componentes > log(y) [1] 0.0000000 0.6931472 1.0986123 Logaritmos en diferentes bases (por ejemplo, base 10) > log(y, 10) [1] 0.0000000 0.3010300 0.4771213 Potencias de base e > exp(y) [1] 2.718282 7.389056 20.085537 7
Potencias en cualquier otra base (por ejemplo, 2) > 2^y [1] 2 4 8 3.2. Raíces cuadradas > sqrt(y) [1] 1.000000 1.414214 1.732051 3.3. Funciones trigonométricas R considera que el argumento viene dado en radianes > sin(y) [1] 0.8414710 0.9092974 0.1411200 > cos(y) [1] 0.5403023-0.4161468-0.9899925 > tan(y) [1] 1.5574077-2.1850399-0.1425465 > z <- c(0.5, 0.7, 0.2) > z [1] 0.5 0.7 0.2 > asin(z) [1] 0.5235988 0.7753975 0.2013579 > acos(z) [1] 1.0471976 0.7953988 1.3694384 > atan(z) [1] 0.4636476 0.6107260 0.1973956 Todas estas funciones se pueden aplicar directamente sobre valores numéricos. > log(3) [1] 1.098612 8
3.4. Otras funciones choose(m,n) da el número de combinaciones de m elementos de orden n > choose(10, 2) [1] 45 factorial(n) da el factorial de un número (n), o lo que es lo mismo, calcula las permutaciones de n elementos > factorial(6) [1] 720 runif(n) genera al azar n valores comprendidos entre 0 y 1 > runif(5) [1] 0.2358614 0.5683257 0.9992840 0.2920381 0.2061905 4. Funciones generadas por el usuario Vamos a crear una función que a cada componente de un vector le reste la media de todas las componentes del vector: desvia<-function(x)x-mean(x) > desvia <- function(x) { + x - mean(x) + } function es la instrucción para crear una función. La x que le sigue es el argumento de la función y entre llaves está lo que la función hace con el argumento. En este ejemplo a cada componente del vector le resta la media de todas las componentes. Para ejecutar la función basta con introducir el nombre de la misma seguido del argumento entre paréntesis > desvia(x) [1] -0.3333333-5.3333333 5.6666667 Recordemos que 9
> x [1] 2-3 8 > mean(x) [1] 2.333333 Cómo calcularías la media creando tu propia función? Cómo calcularías la varianza creando tu propia función? Después de intentar dar una respuesta, mira las soluciones al final de este documento, si lo consideras necesario. 5. Introducción de datos Cuando necesitamos introducir pocos datos, podemos hacerlo como hasta ahora > a <- c(2, 6, 8, 3, 5, 0, 9, 7, 6, 1) Para cantidades no muy grandes de datos podemos utilizar scan() > b<-scan() 1: 1.25 2: 2.56 3: 3.5 4: 2.11 5: 6.32 6: 5.22 7: 6.41 8: Read 7 items Al introducir la instrucción nos aparece 1 y el programa queda a la espera de que introduzcamos un valor, lo hacemos y damos a Enter y aparece 2 para que introduzcamos el siguiente valor. Así continuaremos hasta el final. Para indicar que terminamos y que ya no hay más datos debemos hacer Enter sin introducir ningún valor. Si queremos editar una variable ya introducida podemos usar la función data.entry(b), que abre una ventana como la siguiente: 10
Podemos agregar un nuevo valor en la fila 8 y cerrar la ventana. De esta forma el nuevo valor quedará incorporado al vector b: > b [1] 1.25 2.56 3.50 2.11 6.32 5.22 6.41 Podemos observar que ya hay 8 valores. El último que acabamos de introducir es 3.21. Para introducir datos en una variable nueva con data.entry(x), creamos un vector vacío. Por ejemplo: > w <- numeric() > w Podemos ver el resultado: numeric(0) A continuación, tecleamos: > data.entry(w) Se nos desplegará una ventana como la anterior, en la que la primera columna estará encabezada por el nombre del vector vacío que hemos creado. En dicha columna podremos introducir los valores que queramos. 11
Para introducir un número grande de datos podemos utilizar EXCEL, copiar los datos, volver a R, teclear x<-scan(), y en la entrada 1 pegar los datos. Pulsamos Enter y quedan introducidos. > x<-scan() 1: 2.4 2: 5.6 3: 3.5 4: 1.8 5: 4.5 6: 6.1 7: Read 6 items Hay que tener cuidado con la configuración del separador decimal de EX- CEL, que debe estar puesto en., y no en,, pues de lo contrario, R nos dará error. Si el separador está puesto en, puede cambiarse desde Herramientas/Opciones/Internacional, donde pondremos el separador decimal con punto y los millares con coma. En prácticas posteriores importaremos datos desde EXCEL, SPSS, archivos de texto,etc. También se puede utilizar el Bloc de notas de Windows 6. Dos generadores de datos especiales Si queremos generar un vector con los 100 primeros números naturales, basta con introducir esta orden: 12
> x <- 1:100 > x Al teclear x obtendremos: [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 [19] 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 [37] 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 [55] 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 [73] 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 [91] 91 92 93 94 95 96 97 98 99 100 Hay que fijarse en que cada fila está encabezada por el número que indica la posición del primer elemento de la fila. Hasta ahora hemos hecho la asignación de valores a la variable y la visualización de los mismos con dos instrucciones diferentes. Esto mismo se puede conseguir con una sola instrucción poniéndola entre paréntesis: > x <- -3:5 > x [1] -3-2 -1 0 1 2 3 4 5 También se pueden generar valores sin asignarlos a ninguna variable, con lo cual aparecen en pantalla pero no se pueden volver a llamar y, por lo tanto, a utilizar. Nota: El operador : tiene prelación sobre +, -, *, /. Por ejemplo: > 4 * 1:25 [1] 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 [20] 80 84 88 92 96 100 genera los números del 1 al 25 y los multiplica después por 4. Sin embargo > (4 * 1):25 [1] 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 multiplica el 1 por 4 y después genera números desde el 4 al 25 Otro generador de vectores es la función seq(a,b,r). Con esta instrucción se genera una lista de números que empieza en a y termina en b, yendo de r en r. Por ejemplo: > seq(4, 10, 2) 13
genera una lista de números que empieza en 4 y termina en 10, yendo de dos en dos: > seq(4, 10, 2) [1] 4 6 8 10 Otra cosa es seq(a,b,lenght=r). Con esta instrucción se generan r números entre a y b a distancias iguales. Por ejemplo: > seq(4, 10, length = 8) [1] 4.000000 4.857143 5.714286 6.571429 7.428571 8.285714 9.142857 [8] 10.000000 7. Gráficos en R 7.1. Diagrama de barras Sea > x <- c(1, 1, 1, 2, 2, 2, 2, 3, 4, 4, 4) La función table tabula los datos en x table(x) produce: > table(x) x 1 2 3 4 3 4 1 3 Este resultado nos indica que el 1 aparece tres veces, el 2 cuatro veces, el 3 una vez y el 4 tres veces. La instrucción barplot(table(x)) muestra el diagrama de barras: > barplot(table(x)) 14
0 1 2 3 4 1 2 3 4 El diagrama se puede completar con títulos, subtítulos y etiquetas en los ejes. > barplot(table(x), main = "Título principal", sub = "Subtítulo", + xlab = "Texto en x", ylab = "Texto en y") Si tenemos los datos en un vector x y las frecuencias correspondientes en otro vector y, podemos también obtener el diagrama de barras procediendo de la siguiente forma: > x <- c(1, 2, 3, 4) > y <- c(3, 4, 1, 3) > barplot(y, names.arg = x) 15
0 1 2 3 4 1 2 3 4 7.2. Histograma Consideremos una variable con 100 valores generados de la siguiente forma: > set.seed(111) > x <- rnorm(100) rnorm(100) genera 100 cien valores y set.seed(111) hace que en todos los ordenadores los números generados sean los mismos. Probemos: > x [1] 0.23522071-0.33073587-0.31162382-2.30234566-0.17087604 0.14027823 [7] -1.49742666-1.01018842-0.94847560-0.49396222-0.17367413-0.40659878 [13] 1.84563626 0.39405411 0.79752850-1.56666536-0.08585101-0.35913948 [19] -1.19360897 0.36418674 0.36166245 0.34696437 0.18973653-0.15957681 [25] 0.32654924 0.59825420-1.84153430 2.71805560 0.19124439-1.30129607 [31] -3.11321730-0.94135740 1.40025878-1.62047003-2.26599596 1.16299359 [37] -0.11615504 0.33425601-0.62085811-1.30984491-1.17572604-1.12121553 [43] -1.36190448 0.48112458 0.74197163 0.02782463 0.33137971 0.64411413 16
[49] 2.48566156 1.95998171 0.19166338 1.55254427 0.91424229 0.35862537 [55] 0.17509564-0.84726777 0.97823166 1.80586826 0.12291480-0.12977203 [61] -0.21642866 1.44647817 0.40970980 0.91091657 1.43035817-0.38129196 [67] 0.20230718-0.80619919 0.29463418 1.40488308 1.02376685 0.47612606 [73] -0.67033033 0.15923432-0.38271538 0.93576259-0.63153227-0.09830608 [79] 1.03198498 0.38780843-1.25612931-0.78695273 0.42981155-0.37641622 [85] -1.21622907 1.02927851 0.43039700-1.24557402-0.60272849 0.66006939 [91] 2.05074953 0.49080818-1.73147942 0.71088366 0.01382291-1.40104160 [97] 1.25912367-0.12747752-0.72938651-1.21136136 El histograma se puede obtener con la instrucción hist(). Para obtener el número de intervalos se usa la fórmula de Sturges. > hist(x) Si queremos usar amplitudes de intervalos dados por la fórmula de Scott, siendo s la cuasidesviación típica, o bien la de Freedman-Diaconis, siendo IQ el rango intercuartílico, debemos utilizar el parámetro breaks. Por ejemplo: > hist(x, breaks = "Scott") > hist(x, breaks = "FD") Histogram of x Histogram of x Frequency 0 10 20 30 Frequency 0 5 10 15 20 25 4 3 2 1 0 1 2 3 x 3 2 1 0 1 2 3 x Podemos elegir nuestros propios intervalos. Por ejemplo: > hist(x, breaks = c(-4, -2, 0, 1.5, 3)) 17
Histogram of x Density 0.00 0.05 0.10 0.15 0.20 0.25 0.30 4 3 2 1 0 1 2 3 x Se pueden añadir títulos, subtítulos, etc. de la misma forma que con barplot(): > hist(x, breaks = c(-4, -2, 0, 1.5, 3), main = "Título Principal", + sub = "Subtítulo", xlab = "Etiqueta x", ylab = "Etiqueta y") 7.3. Diagramas de cajas y bigotes Con boxplot() generamos diagramas de cajas y bigotes > boxplot(x, main = "Principal", sub = "Subtítulo", ylab = "Etiqueta y") Podemos ver dos valores atípicos (outliers), uno por cada extremo. 7.4. Diagrama de tallos y hojas Con las instrucciones siguientes, vamos a generar 40 valores entre 0.1 y 10. > set.seed(111) > y <- ceiling(100 * runif(40))/10 18
> y [1] 6.0 7.3 3.8 5.2 3.8 4.2 0.2 5.4 4.4 1.0 5.6 6.0 0.7 0.5 1.6 4.5 1.8 9.7 3.2 [20] 6.2 4.4 2.9 3.5 3.9 9.7 3.3 6.6 2.9 7.9 6.0 0.6 5.1 4.7 4.7 3.6 7.2 1.2 7.9 [39] 6.5 8.1 Con la instrucción ceiling(100*runif(40))/10 primero, con runif() se generan 40 valores aleatorios entre 0 y 1. Al multiplicar por 100, los números se encontrarán entre 0 y 100 y con ceiling, obtendremos el entero mayor más próximo. Por último, al dividir por 10, los números quedan entre 0 y 10. El diagrama de tallos y hojas lo generamos con la instrucción stem(): > stem(y) The decimal point is at the 0 2567 1 0268 2 99 3 2356889 4 244577 5 1246 6 000256 7 2399 8 1 9 77 7.5. Diagrama de puntos Utilizaremos stripchart(y,method="stack",pch=1). pch nos indica el tipo de marca que aparecerá en el diagrama (círculo, triángulo, cuadrado, etc.). Si no especificamos nada, el cuadrado es el tipo de marca por defecto. El método "stack" concatena múltiples vectores en uno solo, con un factor que indica dónde está el inicio de cada observación. > stripchart(y, method = "stack", pch = 2) 19
0 2 4 6 8 10 7.6. Diagrama de sectores Es preciso disponer de dos vectores. Uno con los valores y el otro con los nombres. Por ejemplo: > z <- c(15, 25, 36, 40) > z.nombres <- c("ni~nos", "jóvenes", "maduros", "ancianos") Con la instrucción pie() generamos el diagrama de sectores. > pie(z, labels = z.nombres) 8. Soluciones Ordenación en orden decreciente > rev(sort(x)) 20
[1] 2.71805560 2.48566156 2.05074953 1.95998171 1.84563626 1.80586826 [7] 1.55254427 1.44647817 1.43035817 1.40488308 1.40025878 1.25912367 [13] 1.16299359 1.03198498 1.02927851 1.02376685 0.97823166 0.93576259 [19] 0.91424229 0.91091657 0.79752850 0.74197163 0.71088366 0.66006939 [25] 0.64411413 0.59825420 0.49080818 0.48112458 0.47612606 0.43039700 [31] 0.42981155 0.40970980 0.39405411 0.38780843 0.36418674 0.36166245 [37] 0.35862537 0.34696437 0.33425601 0.33137971 0.32654924 0.29463418 [43] 0.23522071 0.20230718 0.19166338 0.19124439 0.18973653 0.17509564 [49] 0.15923432 0.14027823 0.12291480 0.02782463 0.01382291-0.08585101 [55] -0.09830608-0.11615504-0.12747752-0.12977203-0.15957681-0.17087604 [61] -0.17367413-0.21642866-0.31162382-0.33073587-0.35913948-0.37641622 [67] -0.38129196-0.38271538-0.40659878-0.49396222-0.60272849-0.62085811 [73] -0.63153227-0.67033033-0.72938651-0.78695273-0.80619919-0.84726777 [79] -0.94135740-0.94847560-1.01018842-1.12121553-1.17572604-1.19360897 [85] -1.21136136-1.21622907-1.24557402-1.25612931-1.30129607-1.30984491 [91] -1.36190448-1.40104160-1.49742666-1.56666536-1.62047003-1.73147942 [97] -1.84153430-2.26599596-2.30234566-3.11321730 Función para calcular la media > media <- function(x) { + sum(x)/length(x) + } Función para calcular la varianza varianza<-function(x)sum((x-mean(x))^2)/length(x) 21