Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...
Practica 1 Introduccion Al R
1. Practica 1: Introduccion a R
´ ´
1. Introducci´n
o
R es un lenguaje de alto nivel y un entorno para el an´lisis de datos y gr´-
a a
ficos. Puede descargarse libremente del sitio llamado CRAN (Comprehensive
R Archive Network) en la siguiente direcci´n: http://cran.r-project.org
o
o bien, simplemente buscando CRAN en Google.
Al llegar a la pantalla anterior seguid para descargar el programa la si-
guiente ruta: windows/base/R-2.7.2-win32.exe. Una vez instalado el progra-
ma en entorno Windows, lo que vemos es la interfaz RGui (GUI es Graphical
User Interface en ingl´s), con el s´
e ımbolo > esperando la entrada de instruc-
ciones, tal y como puede apreciarse en la figura siguiente:
1
2. El men´ principal contiene entradas t´
u ıpicas de otras aplicaciones: Ar-
chivo, Editar, Visualizar, Ventanas y Ayuda, m´s otras dos Misc
a
y Paquetes. El men´ de Ayuda ser´ importante en esta fase inicial. Pa-
u a
ra obtener esta ayuda podemos tambi´n optar por introducir instrucciones
e
directamente por teclado. Introduce por ejemplo:
> help(vector)
y aparecer´ una ventana de ayuda con informaci´n sobre el comando
a o
vector.
Podemos acceder a la misma pantalla desde el men´ Ayuda/Funciones
u
R (texto), aparecer´ un cuadro en el que deberemos introducir la palabra
a
vector. Si no recordamos la graf´ de una expresi´n podemos utilizar la ex-
ıa o
presi´n apropos poniendo entre par´ntesis, y entre comillas, la funci´n que
o e o
buscamos.
2
3. que nos da las expresiones que contienen el t´rmino integer. Lo mismo se
e
puede conseguir con Ayuda/Sobre y en el cuadro de di´logo que aparece
a
introducimos integer.
R es un lenguaje orientado a objetos. Uno de los m´s simples es vector.
a
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 ultimo las coordenadas del vector
e ´
entre par´ntesis. Para ver el vector que hemos creado, simplemente, tecleamos
e
su nombre:
> x
[1] 2 3 8
Como ya se ha podido observar al crear el vector x, para hacer asignaci´-
o
nes a las variables se utiliza una combinaci´n de los s´
o ımbolos < y - (gui´n).
o
Y, en esta ultima versi´n, tambi´n podemos utilizar el signo =. El signo =
´ o e
tambi´n se utilizar´ para asignar valores a par´metros en las funciones. En
e a a
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´
a ınea, cada una de las nuevas l´
ıneas
empezar´ por [n], indicando n el lugar que ocupa dentro del vector la coor-
ıa
denada que le sigue. Las componentes del vector se referencian por medio de
´
ındices entre corchetes.
3
4. > 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
o
pulsando la tecla de flecha hacia arriba, las veces que sea necesario. Para
dejar una instrucci´n a medias podemos pulsar la tecla Escape.
o
2. Operaciones con vectores y fucniones
a) Multiplicaci´n de un vector por un n´mero
o u
> 2 * x
[1] 4 -6 16
b) Potencias
> x^3
[1] 8 -27 512
c) Longitud Devuelve la dimensi´n de un vector
o
> length(x)
4
5. [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´
a ınimo Devuelven los valores m´ximo y m´
a ınimo de
las componentes de un vector
> max(x)
[1] 8
> min(x)
[1] -3
f) Media, mediana, cuasivarianza y cuasidesviaci´n t´
o ıpica de las compo-
nentes Calculan la media, mediana, cuasivarianza, y cuasidesviaci´n
o
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
6. 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
o
> 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´ en orden decreciente?
o ıas
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
o
> 5 * x - 2 * y
6
7. [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
o
> 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
8. 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
e
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 nu-
m´ricos.
e
> log(3)
[1] 1.098612
8
9. 3.4. Otras funciones
choose(m,n) da el n´mero de combinaciones de m elementos de orden
u
n
> choose(10, 2)
[1] 45
factorial(n) da el factorial de un n´mero (n), o lo que es lo mismo,
u
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
o
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
o o
el argumento de la funci´n y entre llaves est´ lo que la funci´n hace con el
o a o
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
o
nombre de la misma seguido del argumento entre par´ntesis
e
> desvia(x)
[1] -0.3333333 -5.3333333 5.6666667
Recordemos que
9
10. > x
[1] 2 -3 8
> mean(x)
[1] 2.333333
¿C´mo calcular´ la media creando tu propia funci´n? ¿C´mo calcular´
o ıas o o ıas
la varianza creando tu propia funci´n? Despu´s de intentar dar una respuesta,
o e
mira las soluciones al final de este documento, si lo consideras necesario.
5. Introducci´n de datos
o
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
o
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
a
sin introducir ning´n valor. Si queremos editar una variable ya introducida
u
podemos usar la funci´n data.entry(b), que abre una ventana como la
o
siguiente:
10
11. Podemos agregar un nuevo valor en la fila 8 y cerrar la ventana. De esta
forma el nuevo valor quedar´ incorporado al vector b:
a
> b
[1] 1.25 2.56 3.50 2.11 6.32 5.22 6.41
Podemos observar que ya hay 8 valores. El ultimo que acabamos de
´
introducir es 3.21. Para introducir datos en una variable nueva con da-
ta.entry(x), creamos un vector vac´ Por ejemplo:
ıo.
> w <- numeric()
Podemos ver el resultado:
> w
numeric(0)
A continuaci´n, tecleamos:
o
> data.entry(w)
Se nos desplegar´ una ventana como la anterior, en la que la primera
a
columna estar´ encabezada por el nombre del vector vac´ que hemos creado.
a ıo
En dicha columna podremos introducir los valores que queramos.
11
12. Para introducir un n´mero grande de datos podemos utilizar EXCEL,
u
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-
o
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 He-
a a
rramientas/Opciones/Internacional, donde pondremos el separador
decimal con punto y los millares con coma.
En pr´cticas posteriores importaremos datos desde EXCEL, SPSS, archi-
a
vos de texto,etc. Tambi´n se puede utilizar el Bloc de notas de Windows
e
6. Dos generadores de datos especiales
Si queremos generar un vector con los 100 primeros n´meros naturales,
u
basta con introducir esta orden:
12
13. > x <- 1:100
Al teclear x obtendremos:
> x
[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 in-
a u
dica la posici´n del primer elemento de la fila. Hasta ahora hemos hecho
o
la asignaci´n de valores a la variable y la visualizaci´n de los mismos con
o o
dos instrucciones diferentes. Esto mismo se puede conseguir con una sola
instrucci´n poni´ndola entre par´ntesis:
o e e
> 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
e
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:
o
> 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.
u e
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
e u
Otro generador de vectores es la funci´n seq(a,b,r). Con esta instrucci´n
o o
se genera una lista de n´meros que empieza en a y termina en b, yendo de r
u
en r. Por ejemplo:
> seq(4, 10, 2)
13
14. genera una lista de n´meros que empieza en 4 y termina en 10, yendo de dos
u
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´-
o u
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
a
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:
o
> 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
o
diagrama de barras:
> barplot(table(x))
14
15. 4
3
2
1
0
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
e
de la siguiente forma:
> x <- c(1, 2, 3, 4)
> y <- c(3, 4, 1, 3)
> barplot(y, names.arg = x)
15
16. 4
3
2
1
0
1 2 3 4
7.2. Histograma
Consideremos una variable con 100 valores generados de la siguiente for-
ma:
> 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:
u
> 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
17. [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
o
el n´mero de intervalos se usa la f´rmula de Sturges.
u o
> hist(x)
Si queremos usar amplitudes de intervalos dados por la f´rmula de Scott ,
o
siendo s la cuasidesviaci´n t´
o ıpica, o bien la de Freedman-Diaconis , siendo IQ
el rango intercuart´ılico, debemos utilizar el par´metro breaks. Por ejemplo:
a
> hist(x, breaks = "Scott") > hist(x, breaks = "FD")
Histogram of x Histogram of x
25
30
20
Frequency
Frequency
15
20
10
10
5
0
0
−4 −3 −2 −1 0 1 2 3 −3 −2 −1 0 1 2 3
x x
Podemos elegir nuestros propios intervalos. Por ejemplo:
> hist(x, breaks = c(-4, -2, 0, 1.5, 3))
17
18. Histogram of x
0.30
0.25
0.20
Density
0.15
0.10
0.05
0.00
−4 −3 −2 −1 0 1 2 3
x
Se pueden a˜adir t´
n ı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
19. > 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
o
generan 40 valores aleatorios entre 0 y 1. Al multiplicar por 100, los n´meros
u
se encontrar´n entre 0 y 100 y con ceiling, obtendremos el entero mayor m´s
a a
pr´ximo. Por ultimo, al dividir por 10, los n´meros quedan entre 0 y 10. El
o ´ u
diagrama de tallos y hojas lo generamos con la instrucci´n stem():
o
> 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´
a ırculo, tri´ngulo, cuadrado,
a
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
e u
que indica d´nde est´ el inicio de cada observaci´n.
o a o
> stripchart(y, method = "stack", pch = 2)
19
20. 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~os", "j´venes", "maduros", "ancianos")
n o
Con la instrucci´n pie() generamos el diagrama de sectores.
o
> pie(z, labels = z.nombres)
8. Soluciones
Ordenaci´n en orden decreciente
o
> rev(sort(x))
20