En este laboratorio, introduciremos algunos comandos R simples. La mejor manera de aprender un nuevo lenguaje es probando los comandos.

1. Comandos básicos

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

2. Matrices e Indexación de datos

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

3. Gráficos básicos

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")

4. Secuencias de números

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

5. Carga de datos

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"

6. Resuelve

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:

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:

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