En este laboratorio, introduciremos algunos comandos R simples. La mejor manera de aprender un nuevo lenguaje es probando los comandos.
R utiliza funciones para realizar operaciones. Para ejecutar una función llamada funcname, escribimos funcname(input1, input2), donde las entradas (o argumentos) input1 y input2 le dicen a R cómo ejecutar la función. Una función puede tener cualquier número de entradas. Por ejemplo, para crear un vector de números, usamos la función c() (para concatenar). Cualquier número dentro de los paréntesis se unen entre sí. El siguiente comando instruye a R para que junte los números 1, 3, 2 y 5, y los guarde como un vector llamado x. Cuando tecleamos x, nos devuelve el vector.
x<-c(1,3,2,5)
x
## [1] 1 3 2 5
También podemos guardar cosas usando = en lugar de <-:
x=c(1,252,2)
x
## [1] 1 252 2
y=c(1,4,3)
?y
## No documentation for 'y' in specified packages and libraries:
## you could try '??y'
Si se escribe ?funcname, R abrirá siempre una nueva ventana de ayuda con información adicional sobre la función funcname.
Podemos decirle a R que sume dos conjuntos de números. Entonces sumará el primer número de x al primer número de y, y así sucesivamente. Sin embargo, x y y deberían tener la misma longitud. Podemos comprobar su longitud usando la función length().
#?length
length (x)
## [1] 3
length (y)
## [1] 3
z<-x+y
La función matrix() puede ser usada para crear una matriz de números. Antes de usar la función matrix(), podemos aprender más sobre ella:
#?matrix
El archivo de ayuda revela que la función matrix() toma un número de entradas, pero por ahora nos centramos en las tres primeras: los datos (las entradas en la matriz), el número de filas y el número de columnas. Primero, creamos una matriz simple.
x<-matrix (data=c(1,2,3,4) , ncol =2, nrow=2)
x
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
Note que podríamos omitir el teclear data=, nrow=, y ncol= en el comando matrix() de arriba: es decir, podríamos simplemente teclear
x<-matrix (c(1,2,3,4) ,2,2)
x
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
y esto tendría el mismo efecto. Sin embargo, a veces puede ser útil especificar los nombres de los argumentos que se pasan, ya que de lo contrario R asumirá que los argumentos de la función se pasan a la función en el mismo orden que se da en el archivo de ayuda de la función. Como ilustra este ejemplo, por defecto R crea matrices rellenando sucesivamente las columnas. Alternativamente, se puede utilizar la opción byrow=TRUE para rellenar la matriz en el orden de las filas.
matrix (data=c(1,2,3,4) , nrow=2, ncol =2,byrow =TRUE)
## [,1] [,2]
## [1,] 1 2
## [2,] 3 4
Observe que en el comando anterior no asignamos la matriz a un valor como x. En este caso la matriz se imprime en la pantalla pero no se guarda para futuros cálculos. La función sqrt() devuelve la raíz cuadrada de cada elemento de un vector o matriz. El comando x^2 eleva cada elemento de x a la potencia 2; cualquier potencia es posible, incluyendo las potencias fraccionarias o negativas.
sqrt(x)
## [,1] [,2]
## [1,] 1.000000 1.732051
## [2,] 1.414214 2.000000
x^2
## [,1] [,2]
## [1,] 1 9
## [2,] 4 16
La función rnorm() genera un vector de variables normales aleatorias, con el primer argumento n el tamaño de la muestra. Cada vez que llamemos a esta función, obtendremos una respuesta diferente. Aquí creamos dos conjuntos de números correlacionados, x e y, y usamos la función cor() para calcular la correlación entre ellos.
x<-rnorm (50)
y<-x+rnorm (50, mean=50, sd=.1)
mean(y)
## [1] 50.07526
cor(x,y)
## [1] 0.9914996
Por defecto, rnorm() crea variables aleatorias normales estándar con una media de 0 y una desviación estándar de 1. Sin embargo, la media y la desviación estándar pueden ser alteradas usando los argumentos mean y sd, como se ilustra arriba. A veces queremos que nuestro código reproduzca exactamente el mismo conjunto de números aleatorios; podemos utilizar la función set.seed() para hacerlo. La función set.seed() toma un argumento entero (arbitrario).
set.seed(5)
rnorm(50)
## [1] -0.84085548 1.38435934 -1.25549186 0.07014277 1.71144087 -0.60290798
## [7] -0.47216639 -0.63537131 -0.28577363 0.13810822 1.22763034 -0.80177945
## [13] -1.08039260 -0.15753436 -1.07176004 -0.13898614 -0.59731309 -2.18396676
## [19] 0.24081726 -0.25935541 0.90051195 0.94186939 1.46796190 0.70676109
## [25] 0.81900893 -0.29348185 1.41858907 1.49877383 -0.65708209 -0.85279544
## [31] 0.31591504 1.10969417 2.21546057 1.21710364 1.47922179 0.95157383
## [37] -1.00953265 -2.00047274 -1.76218587 -0.14260813 1.55006037 -0.80242318
## [43] -0.07457892 1.89566795 -0.45656894 0.56222336 -0.88700851 -0.46024458
## [49] -0.72432849 -0.06921116
Utilizamos set.seed() en todos los laboratorios siempre que realizamos cálculos que implican cantidades aleatorias. En general, esto debería permitir al usuario reproducir nuestros resultados. Sin embargo, debe tenerse en cuenta que a medida que se disponga de nuevas versiones de R es posible que se formen algunas pequeñas discrepancias entre el libro y la salida de R.
Las funciones mean() y var() pueden utilizarse para calcular la media y la varianza de un vector de números. Aplicando sqrt() a la salida de var() se obtendrá la desviación estándar. O simplemente podemos usar la función sd().
set.seed(3)
y<-rnorm(100)
mean(y)
## [1] 0.01103557
var(y)
## [1] 0.7328675
sqrt(var(y))
## [1] 0.8560768
sd(y)
## [1] 0.8560768
A menudo deseamos examinar parte de un conjunto de datos. Supongamos que nuestros datos están almacenados en la matriz A.
A<-matrix(data=1:16 , nrow=4 , ncol=4)
A
## [,1] [,2] [,3] [,4]
## [1,] 1 5 9 13
## [2,] 2 6 10 14
## [3,] 3 7 11 15
## [4,] 4 8 12 16
Luego, tecleando:
A[ 2,3 ]
## [1] 10
A[2,3]
## [1] 10
seleccionará el elemento correspondiente a la segunda fila y la tercera columna. El primer número después del símbolo de paréntesis abierto [ se refiere siempre a la fila, y el segundo número se refiere siempre a la columna. También podemos seleccionar varias filas y columnas a la vez, proporcionando vectores como los índices.
A[ , ]
## [,1] [,2] [,3] [,4]
## [1,] 1 5 9 13
## [2,] 2 6 10 14
## [3,] 3 7 11 15
## [4,] 4 8 12 16
A[c(1,3) , c(2,4) ]
## [,1] [,2]
## [1,] 5 13
## [2,] 7 15
A[1:3 ,2:4]
## [,1] [,2] [,3]
## [1,] 5 9 13
## [2,] 6 10 14
## [3,] 7 11 15
A[seq(1,3),seq(2,4)]
## [,1] [,2] [,3]
## [1,] 5 9 13
## [2,] 6 10 14
## [3,] 7 11 15
A[1:2,]
## [,1] [,2] [,3] [,4]
## [1,] 1 5 9 13
## [2,] 2 6 10 14
A[,1:2]
## [,1] [,2]
## [1,] 1 5
## [2,] 2 6
## [3,] 3 7
## [4,] 4 8
Los dos últimos ejemplos incluyen la ausencia de índice para las columnas o la ausencia de índice para las filas. Estos indican que R debe incluir todas las columnas o todas las filas, respectivamente. R trata una sola fila o columna de una matriz como un vector.
A[1,]
## [1] 1 5 9 13
El uso de un signo negativo - en el índice le dice a R que mantenga todas las filas o columnas excepto las indicadas en el índice.
A[-c(1,3), ]
## [,1] [,2] [,3] [,4]
## [1,] 2 6 10 14
## [2,] 4 8 12 16
A[-c(1,3),-c(1,3,4)]
## [1] 6 8
La función dim() da como resultado el número de filas seguido por el número de columnas de una matriz dada.
dim(A)
## [1] 4 4
La función plot() es la forma principal de representar los datos en R. Por ejemplo, plot(x,y) produce un diagrama de dispersión de los números en x frente a los números en y. Hay muchas opciones adicionales que pueden pasarse a la función plot(). Por ejemplo, si se pasa el argumento xlab se obtendrá una etiqueta en el eje x. Para obtener más información sobre la función plot(), escribe ?plot.
set.seed(80)
x<-rnorm(100)
set.seed(80)
y<-rnorm(100)
plot(x,y)
plot(x,y,xlab="Este es el eje x",ylab="Este es el eje y",
main="Plot de X vs Y")
La función seq() puede ser usada para crear una secuencia de números. Por ejemplo, seq(a,b) hace un vector de números enteros entre a y b. Hay muchas otras opciones: por ejemplo, seq(0,1,length=10) hace una secuencia de 10 números que están igualmente espaciados entre 0 y 1. Escribir 3:11 es una forma abreviada de seq(3,11) para argumentos de números enteros.
x<-seq (1 ,10)
x
## [1] 1 2 3 4 5 6 7 8 9 10
x<-1:10
x
## [1] 1 2 3 4 5 6 7 8 9 10
x<-seq(-pi ,pi ,length =50)
x
## [1] -3.14159265 -3.01336438 -2.88513611 -2.75690784 -2.62867957 -2.50045130
## [7] -2.37222302 -2.24399475 -2.11576648 -1.98753821 -1.85930994 -1.73108167
## [13] -1.60285339 -1.47462512 -1.34639685 -1.21816858 -1.08994031 -0.96171204
## [19] -0.83348377 -0.70525549 -0.57702722 -0.44879895 -0.32057068 -0.19234241
## [25] -0.06411414 0.06411414 0.19234241 0.32057068 0.44879895 0.57702722
## [31] 0.70525549 0.83348377 0.96171204 1.08994031 1.21816858 1.34639685
## [37] 1.47462512 1.60285339 1.73108167 1.85930994 1.98753821 2.11576648
## [43] 2.24399475 2.37222302 2.50045130 2.62867957 2.75690784 2.88513611
## [49] 3.01336438 3.14159265
Para la mayoría de los análisis, el primer paso consiste en importar un conjunto de datos a R. La función read.table() es una de las principales formas de hacerlo. El archivo de ayuda contiene detalles sobre cómo utilizar esta función. Podemos usar la función write.table() para exportar datos.
Antes de intentar cargar un conjunto de datos, debemos asegurarnos de que R sepa buscar los datos en el directorio apropiado estableciendolo desde las opciones de RStudio. Comenzamos cargando en el conjunto de datos de Auto. Estos datos son parte de la biblioteca de ISLR pero para ilustrar la función read.table() los cargamos ahora desde un archivo de texto. El siguiente comando cargará el archivo Auto.data en R y lo almacenará como un objeto llamado Auto, en un formato llamado data frame.
Auto<-read.table("Auto.data.txt")
head(Auto)
## V1 V2 V3 V4 V5 V6 V7 V8
## 1 mpg cylinders displacement horsepower weight acceleration year origin
## 2 18.0 8 307.0 130.0 3504. 12.0 70 1
## 3 15.0 8 350.0 165.0 3693. 11.5 70 1
## 4 18.0 8 318.0 150.0 3436. 11.0 70 1
## 5 16.0 8 304.0 150.0 3433. 12.0 70 1
## 6 17.0 8 302.0 140.0 3449. 10.5 70 1
## V9
## 1 name
## 2 chevrolet chevelle malibu
## 3 buick skylark 320
## 4 plymouth satellite
## 5 amc rebel sst
## 6 ford torino
Tenga en cuenta que Auto.data es simplemente un archivo de texto, que puede abrir en su computadora usando un editor de texto estándar.
Este conjunto de datos en particular no se ha cargado correctamente, porque R ha asumido que los nombres de las variables forman parte de los datos y por lo tanto los ha incluido en la primera fila. El conjunto de datos también incluye una serie de observaciones que faltan, indicadas por un signo de interrogación ?. Los valores faltantes son comunes en los conjuntos de datos reales. El uso de la opción header=T (o header=TRUE) en la función read.table() le dice a R que la primera línea del archivo contiene los nombres de las variables, y el uso de la opción na.strings le dice a R que cada vez que vea un determinado carácter o conjunto de caracteres (como un signo de interrogación), debe tratarse como un elemento faltante de la matriz de datos.
Auto<-read.table ("Auto.data.txt", header =T,na.strings ="?")
head(Auto)
## mpg cylinders displacement horsepower weight acceleration year origin
## 1 18 8 307 130 3504 12.0 70 1
## 2 15 8 350 165 3693 11.5 70 1
## 3 18 8 318 150 3436 11.0 70 1
## 4 16 8 304 150 3433 12.0 70 1
## 5 17 8 302 140 3449 10.5 70 1
## 6 15 8 429 198 4341 10.0 70 1
## name
## 1 chevrolet chevelle malibu
## 2 buick skylark 320
## 3 plymouth satellite
## 4 amc rebel sst
## 5 ford torino
## 6 ford galaxie 500
Excel es un programa de almacenamiento de datos de formato común. Una forma fácil de cargar esos datos en R es guardarlos como un archivo csv (valor separado por comas) y luego usar la función read.csv() para cargarlos.
Auto<-read.csv("Auto.csv", header =TRUE,na.strings ="?")
head(Auto)
## mpg cylinders displacement horsepower weight acceleration year origin
## 1 18 8 307 130 3504 12.0 70 1
## 2 15 8 350 165 3693 11.5 70 1
## 3 18 8 318 150 3436 11.0 70 1
## 4 16 8 304 150 3433 12.0 70 1
## 5 17 8 302 140 3449 10.5 70 1
## 6 15 8 429 198 4341 10.0 70 1
## name
## 1 chevrolet chevelle malibu
## 2 buick skylark 320
## 3 plymouth satellite
## 4 amc rebel sst
## 5 ford torino
## 6 ford galaxie 500
dim(Auto)
## [1] 397 9
Auto[1:4,]
## mpg cylinders displacement horsepower weight acceleration year origin
## 1 18 8 307 130 3504 12.0 70 1
## 2 15 8 350 165 3693 11.5 70 1
## 3 18 8 318 150 3436 11.0 70 1
## 4 16 8 304 150 3433 12.0 70 1
## name
## 1 chevrolet chevelle malibu
## 2 buick skylark 320
## 3 plymouth satellite
## 4 amc rebel sst
La función dim() nos dice que los datos tienen 392 observaciones, o filas, y nueve variables, o columnas. Hay varias maneras de tratar los datos que faltan. En este caso, sólo cinco de las filas contienen observaciones faltantes, y por lo tanto elegimos usar la función na.omit() para simplemente eliminar estas filas.
Auto<-na.omit(Auto)
dim(Auto)
## [1] 392 9
Una vez que los datos se cargan correctamente, podemos usar names() para comprobar los nombres de las variables.
names(Auto)
## [1] "mpg" "cylinders" "displacement" "horsepower" "weight"
## [6] "acceleration" "year" "origin" "name"
1. Carga y Limpieza de Datos Carga nuevamente el
archivo Auto.csv en un objeto llamado datos.
Asegúrese de especificar que los signos de interrogación
(?) deben ser tratados como valores faltantes
(NA). Una vez cargado, utilice la función
na.omit() para eliminar las filas con datos faltantes y
utilice la función dim() para reportar cuántas
observaciones y variables quedaron en el conjunto de datos limpio.
datos<-read.csv('Auto.csv', header =TRUE, na.strings ='?')
head(datos)
## mpg cylinders displacement horsepower weight acceleration year origin
## 1 18 8 307 130 3504 12.0 70 1
## 2 15 8 350 165 3693 11.5 70 1
## 3 18 8 318 150 3436 11.0 70 1
## 4 16 8 304 150 3433 12.0 70 1
## 5 17 8 302 140 3449 10.5 70 1
## 6 15 8 429 198 4341 10.0 70 1
## name
## 1 chevrolet chevelle malibu
## 2 buick skylark 320
## 3 plymouth satellite
## 4 amc rebel sst
## 5 ford torino
## 6 ford galaxie 500
datos<-na.omit(datos)
dim(datos)
## [1] 392 9
2. Indexación y Subconjuntos Basándote en los datos
limpios del ejercicio anterior, crea una nueva matriz u objeto que
contenga solamente las columnas correspondientes a
mpg, horsepower y weight. De este
nuevo objeto, selecciona y guarda únicamente las primeras 20 filas.
Imprime el resultado en pantalla.
clean <- datos[c(1:20),c(1,4,5)]
print(clean)
## mpg horsepower weight
## 1 18 130 3504
## 2 15 165 3693
## 3 18 150 3436
## 4 16 150 3433
## 5 17 140 3449
## 6 15 198 4341
## 7 14 220 4354
## 8 14 215 4312
## 9 14 225 4425
## 10 15 190 3850
## 11 15 170 3563
## 12 14 160 3609
## 13 15 150 3761
## 14 14 225 3086
## 15 24 95 2372
## 16 22 95 2833
## 17 18 97 2774
## 18 21 85 2587
## 19 27 88 2130
## 20 26 46 1835
3. Estadística Descriptiva Utilizando el conjunto de
datos completo y limpio: a) Calcula la media (mean) de la
variable weight. b) Calcula la desviación estándar
(sd) de la variable mpg. c) Calcula la
varianza (var) de ambas variables para observar las
diferencias en magnitud y dispersión.
mean(clean[['weight']])
## [1] 3367.35
sd(clean[['mpg']])
## [1] 4.185187
var(clean[['weight']])
## [1] 565947.7
var(clean[['mpg']])
## [1] 17.51579
4. Gráficos Personalizados Genera un gráfico de
dispersión (plot) para visualizar la relación entre la
potencia (horsepower) en el eje X y el rendimiento
(mpg) en el eje Y. El gráfico debe incluir:
Un título principal (main) que diga: “Relación
Potencia vs Consumo”.
Etiqueta del eje X (xlab): “Caballos de
Fuerza”.
Etiqueta del eje Y (ylab): “Millas por
Galón”.
plot(clean[['horsepower']], clean[['mpg']],xlab ='caballos de Fuerza',ylab='Millas por Galón',
main='Relación Potenica vs. Cosumo')
5. Correlación y Simulación Primero, calcula la
correlación real entre horsepower y mpg
utilizando la función cor(). Segundo, realiza una
simulación para comparar:
Fija la semilla en 50 usando set.seed(50).
Genera un vector de variables normales aleatorias
(rnorm) del mismo tamaño que su conjunto de datos limpio
(recuerda usar dim() o nrow() para saber el
tamaño).
Calcula la correlación entre este vector de ruido aleatorio y la
variable mpg.
Pregunta: ¿Esperabas que esta correlación fuera alta o baja? ¿Por qué?
Esperaba que no hubiera correlación o que estuviera cerca al cero, ya que son variables independientes que no solo no se relacionan, si no que al ser generadas de manera aleatoria, no deberían necesariamente de reflejar una correlaación
cor(clean[['horsepower']],clean[['mpg']])
## [1] -0.8733469
set.seed(50)
ab<-rnorm (392)
cor(ab, datos[['mpg']])
## [1] -0.05537666