Creación y manipulación de objetos en R; principalmente vectores, matrices y funciones, para las operaciones básicas de cálculo, álgebra y probabilidad.
R es un lenguaje de programación y de distribución libre que funciona en los sistemas operativos de Windows, Linux, Macintosh y Unix.
R fue creado en \(1992\) en Nueva Zelanda por Ross Ihaka y Robert Gentleman adoptando la sintaxis del lenguaje S desarrollado por Bell Laboratories, actualmente Lucent Tecnologies. El lenguaje S fue desarrollado en \(1976\) por John Chambers y colaboradores.
Ventajas que se tienen al utilizar R, como lenguaje de programación:
Es un software con código totalmente libre.
Se puede almacenar y manipular objetos como vectores, matrices, arreglos, listas, funciones, etc.
Las contribuciones de los usuarios, http://cran.r-project.org/bin/windows/contrib/ hacen de R una herramienta completa y potente para la programación, edición y procesamiento de datos.
El ambiente de trabajo en R es intuitivo y relativamente simple, ya que solo necesitamos identificar las funciones y paquetes que vamos a utilizar, para empezar a trabajar. Si ocupamos de un paquete que no está instalado en R, entonces se instala y se carga al archivo de trabajo. Todas las funciones empleadas en R están contenidas en paquetes (bibliotecas).
Actualmente, el repositorio de paquetes CRAN tiene alrededor de \(18,365\) paquetes disponibles:
Paquetes que se pueden instalar en R:
Para instalar R en el sistema operativo de Windows:,
Revisar el sistema de su equipo de cómputo para saber que versión de R instalar: \(32\) o \(64\) bit.
Descargar el ejecutable de R Versión 4.1.2.
Guía para el entorno de RStudio: https://raw.githubusercontent.com/rstudio/cheatsheets/main/translations/spanish/rstudio-ide_es.pdf
Paquetes a los que se tienen acceso una vez que se instala R:
search()
[1] ".GlobalEnv" "package:rmarkdown" "package:tinytex"
[4] "package:knitr" "package:stats" "package:graphics"
[7] "package:grDevices" "package:utils" "package:datasets"
[10] "package:methods" "Autoloads" "package:base"
Instalación de R en Mac:
Un paquete: Se instala con la función install.packages() y se activar con la función library(). La instalación de un paquete solo se realiza una vez, mientras que la activación del paquete se realiza siempre que se utilicen las funciones del paquete en cuestión.
El paquete ggplot2 se utiliza para la creación de gráficos.
Guía del paquete ggplot2: https://raw.githubusercontent.com/rstudio/cheatsheets/main/translations/spanish/data-visualization_es.pdf
install.packages("ggplot2") # Instalación del paquete ggplot2
install.packages("plotly")
library("ggplot2") #ggplot # Activación del paquete ggplot2
library("plotly") #ggplotly
library(help=ggplot2) # Funciones y bases de datos del paquete ggplot2
Para pedir ayuda al R con la función geom_line del paquete ggplot2
?geom_line
help(geom_line )
Funciones relacionadas con la instalación de paquetes
install.packages( ,dependence=T):
install.packages( ,dependencies =c(“Depends”,“Imports”))
remove.packages(): Quita un paquete de R.
update.packages(): Actualiza un paquete de R.
updata.packages(): Actualiza los paquetes de R.
Para instalar paquetes de R desde GitHub primero se instala el paquete devtools: install.packages(devtools) y library(devtools); para poder usar la función install_github; la forma de usar esta función es la siguiente: install_github(“tidyverse/ggplot2”), con esta indicación se está instalando el paquete ggplot2.
Si se quiere usar la función de un paquete el cual no se ha instalado previamente, se puede usa la siguiente instrucción: devtools::install_github(“tidyverse/ggplot2”)
Ejemplos de instalación de paquetes: https://r-coder.com/instalar-paquetes-r/
Tipos de objetos en R:
https://raw.githubusercontent.com/rstudio/cheatsheets/main/translations/spanish/introduccion-a-r.pdf
https://www.rstudio.com/wp-content/uploads/2016/02/advancedR.pdf
Objetos en R:
vector(): Vectores
matrix(): Matrices, es decir, arreglos de \(2\) dimensiones.
array(): Arreglos con más de dos dimensiones.
data.frame(): Arreglos para manipular bases de datos.
list(): Las listas tienen la capacidad de guardar vectores, matrices, funciones, listas, etc.
function(): La creación de funciones es útil cuando se tiene una gran cantidad de código y se quiere optimizar el proceso.
La función class() es útil para identificar el tipo es el objeto con el cual se está trabajando; otras funciones de utilidad son attributes() y str.
Por ejemplo utilicemos estas funciones con la base de datos iris que se encuentra disponible en R.
class(iris)
[1] "data.frame"
attributes(iris)
$names
[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"
$class
[1] "data.frame"
$row.names
[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 101 102 103 104 105 106 107 108
[109] 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
[127] 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
[145] 145 146 147 148 149 150
str(iris)
'data.frame': 150 obs. of 5 variables:
$ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
$ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
$ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
$ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
Grupo de funciones:
Funciones matemáticas:
?Arithmetic
?Trig
?Special
Dados \(a\) y \(b\), en \(\mathbb{R}\):
# forma 1
a<-8
b<-2
a # muestra lo que se guardo en a
[1] 8
b # muestra lo que se guardo en b
[1] 2
# forma 2
(a<-8)
[1] 8
(b<-2)
[1] 2
# forma 3
a=8; a
[1] 8
b=2; b
[1] 2
a+b
[1] 10
a-b
[1] 6
a*b
[1] 16
a/b
[1] 4
a%/%b
[1] 4
a%%b
[1] 0
a^b
[1] 64
sqrt(a)
[1] 2.828427
log(a)
[1] 2.079442
exp(a)
[1] 2980.958
abs(a)
[1] 8
sin(a)
[1] 0.9893582
Función polinómica: \[ f(x)=x^2+x \]
n<-100
x<-seq(-n,n, by=10)
fx<-x^2+x
plot(x, fx, pch = "❤️",col="red") # Grafico
Creación de un data.frame
dat<-data.frame(x,fx) # creación de un data.frame
Generación de un gráfico con funciones del paquete ggplot2:
p<-ggplot(dat, aes(x, fx))+
geom_line(col="purple",size=2)+ # geom_line agrega la línea
theme_dark() # theme_dark especifica el diseño del gráfico
ggplotly(p)
Función racional:
\[ f(x)=\frac{x}{1+x^2} \]
n<-100
x<-seq(-n,n, by=0.5)
fx<- x/(1+x^2)
dat<-data.frame(x,fx) # creación de un objeto data.frame
p<-ggplot(dat, aes(x, fx))+
geom_line()+ # geom_line: generar la línea
geom_point(aes(x, fx)) # geom_point: agrega los puntos
ggplotly(p)
p<- ggplot(dat, aes(x, fx, group=1)) +
geom_line(linetype = "dashed",color="black", size=1)+ # geom_line generar la línea
geom_point() # geom_point agrega los puntos
ggplotly(p)
Dada la función \[ f(x)=e^{-\frac{x^2}{2}} \] integrarla en el intervalo \([1,\infty)\)
f<-function(x)
{
exp(-x^2/2)
}
integrate(f, lower=1, upper=Inf)
0.3976897 with absolute error < 1.2e-06
Dada la función \[ f(x)=\frac{\sin(x)}{x+1} \] integrarla en el intervalo \([0,1]\)
f<-function(x)
{
sin(x)/(x+1)
}
integrate(f, lower=0, upper=1)$value
[1] 0.284227
Calcular la siguiente integral
\[ F_{X}(x)=P(X<1)= \int_{-\infty}^{1}\frac{1}{\sqrt{2\pi}}e^{- \frac{x^2}{2}}dx \]
#--- Definición de una función
h <- function(x){
(1/sqrt(2*pi))*exp(-(x^2)/2)
}
#--- valor exacto de la integral
integrate(h,-Inf,1)$value
[1] 0.8413448
Las funciones que se emplean en esta sección pertenecen al paquete base; lo cual se puede verificar ejecutando la línea library(help=base).
Existen varias formas de crear vectores en R, una de ellas es con la función c(), la cual ayuda a agrupar datos numéricos, alfabéticos y alfanuméricos. Vectores de números:
a <- c(-3,-2,-1, 1, 2, 3, 4, 5); a
[1] -3 -2 -1 1 2 3 4 5
b <- -3:5; b
[1] -3 -2 -1 0 1 2 3 4 5
f <- seq(from = -3, to = 5, by = 2);f
[1] -3 -1 1 3 5
g <- seq(from = -3, to = 5, length = 30);g
[1] -3.00000000 -2.72413793 -2.44827586 -2.17241379 -1.89655172 -1.62068966
[7] -1.34482759 -1.06896552 -0.79310345 -0.51724138 -0.24137931 0.03448276
[13] 0.31034483 0.58620690 0.86206897 1.13793103 1.41379310 1.68965517
[19] 1.96551724 2.24137931 2.51724138 2.79310345 3.06896552 3.34482759
[25] 3.62068966 3.89655172 4.17241379 4.44827586 4.72413793 5.00000000
Vectores de letras:
y <-c("a","b","c");y
[1] "a" "b" "c"
let <-LETTERS[1:10];let
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J"
# vectores
a<-c(2,4,6) # la función c concatena elementos
b<-c(1,3,5)
# Suma de vectores: a+b
a+b
[1] 3 7 11
# Resta de vectores: a-b
a-b
[1] 1 1 1
# Multiplicación de vectores: a∗b
a*b
[1] 2 12 30
# División de vectores a/b
a/b
[1] 2.000000 1.333333 1.200000
# División entera: a%/%b
a%/%b
[1] 2 1 1
# Potencia: a^{b}
a^b
[1] 2 64 7776
# Raíz cuadrada: sqrt()
sqrt(a)
[1] 1.414214 2.000000 2.449490
# logaritmo
log(a)
[1] 0.6931472 1.3862944 1.7917595
# seno()
sin(b)
[1] 0.8414710 0.1411200 -0.9589243
Funciones:
diff(a)
[1] 2 2
cumsum(a)
[1] 2 6 12
cumprod(a)
[1] 2 8 48
cummax(a)
[1] 2 4 6
cummin(a)
[1] 2 2 2
Una matriz:
Es un arreglo con dos dimensiones.
Es una colección de datos del mismo tipo.
Es un vector con un atributo adicional (dim).
Una matriz se puede crear con la función matrix(). Dada la matriz \(A\):
A[i,j]: indica la entrada (i,j) de la matriz \(A\).
A[i,]: indica la i-ésima fila de la matriz \(A\).
A[,j]: indica la j-ésima columna de la matriz \(A\).
Matrices:
\[ A=\begin{pmatrix} 2 & 5 & 0\\ 7 & 3 & 8\\ 3 & 0 & 1 \end{pmatrix} \]
A<-matrix(c(2,7,3,5,3,0,0,8,1),3,3) # Capturar la información por columna
A
[,1] [,2] [,3]
[1,] 2 5 0
[2,] 7 3 8
[3,] 3 0 1
\[ B=\begin{pmatrix} 1 & 1 & 2\\ 2 & 2 & 3\\ 4 & 6 & 1 \end{pmatrix} \]
B<-matrix(c(1,2,4,1,2,6,2,3,1),3,3)
B
[,1] [,2] [,3]
[1,] 1 1 2
[2,] 2 2 3
[3,] 4 6 1
Funciones para matrices en R:
dim(A)
[1] 3 3
sum(A)
[1] 29
prod(A)
[1] 0
mean(A)
[1] 3.222222
colSums(A)
[1] 12 8 9
rowSums(A)
[1] 7 18 4
colMeans(A)
[1] 4.000000 2.666667 3.000000
rowMeans(A)
[1] 2.333333 6.000000 1.333333
diag(A) # diagonal de la matriz A
[1] 2 3 1
\[ tr(A)=\sum_{i=1}^ka_{ij} \]
sum(diag(A)) # Traza de la matriz A
[1] 6
det(A)
[1] 91
t(A)
[,1] [,2] [,3]
[1,] 2 7 3
[2,] 5 3 0
[3,] 0 8 1
Con la función solve(), se calcula la inversa de una matriz.
solve(A) # inversa de la matriz A
[,1] [,2] [,3]
[1,] 0.03296703 -0.05494505 0.4395604
[2,] 0.18681319 0.02197802 -0.1758242
[3,] -0.09890110 0.16483516 -0.3186813
\[ A=\sum_{i=1}^{κ}\lambda_{i}e_{i}e_{i}´ \]
eigen(A)
eigen() decomposition
$values
[1] 9.523447+0.000000i -1.761724+2.540018i -1.761724-2.540018i
$vectors
[,1] [,2] [,3]
[1,] -0.5432879+0i 0.6371432+0.0000000i 0.6371432+0.0000000i
[2,] -0.8174795+0i -0.4793513+0.3236711i -0.4793513-0.3236711i
[3,] -0.1912212+0i -0.3749493-0.3448492i -0.3749493+0.3448492i
Eigenvalores: 9.523447+0i, -1.761724+2.540018i, -1.761724-2.540018i
Eigenvalores: -0.543288+0i, -0.81748+0i, -0.191221+0i, 0.637143+0i, -0.479351+0.323671i, -0.374949-0.344849i, 0.637143+0i, -0.479351-0.323671i, -0.374949+0.344849i
\[ A=\sum_{i=1}^{r}\lambda_{i}\mathbf{u}_{i}\mathbf{v}_{i}' \]
svd(A)
$d
[1] 11.711634 4.577856 1.697312
$u
[,1] [,2] [,3]
[1,] -0.2639427 -0.9630370 -0.0537965
[2,] -0.9376196 0.2430923 0.2485471
[3,] -0.2262825 0.1160428 -0.9671247
$v
[,1] [,2] [,3]
[1,] -0.6634489 0.02702149 -0.7477335
[2,] -0.3528604 -0.89253749 0.2808315
[3,] -0.6597917 0.45016293 0.6016878
qr(A)
$qr
[,1] [,2] [,3]
[1,] -7.8740079 -3.9370039 -7.493007
[2,] 0.8890009 4.3011626 -1.278724
[3,] 0.3810004 0.6312972 -2.686951
$rank
[1] 3
$qraux
[1] 1.254000 1.775541 2.686951
$pivot
[1] 1 2 3
attr(,"class")
[1] "qr"
A %*% B
[,1] [,2] [,3]
[1,] 12 12 19
[2,] 45 61 31
[3,] 7 9 7
Dado el sistema
\[ x+y=7 \]
\[ x-2y=1 \]
Encontrar el valor de \(x\) y \(y\). En este caso
\[ A=\begin{pmatrix} 1 & 1 \\ 1 & -2 \end{pmatrix} \]
y \[ b=\begin{pmatrix} 7 \\ 1 \end{pmatrix} \]
A<-matrix(c(1,1,1,-2),2,2)
A
[,1] [,2]
[1,] 1 1
[2,] 1 -2
b<-c(7,1)
b
[1] 7 1
solve(A,b)
[1] 5 2
Luego \(x=5\) y \(y=2\)
Definición: Si cada elemento de \(A\) pertenece también a \(B\), entonces \(A\subset B\).
Definición: El complemento de un conjunto \(A\) con respecto a \(\Omega\) denotado por \(A^c\), es el conjunto de todos los elementos que están en \(\Omega\) pero que no están en \(A\).
Definición: Dado \(A\) y \(B\) dos conjuntos de \(\Omega\) la unión de \(A\) y \(B\), dado por \(A\cup B\), es el conjunto de todos los elementos que están en \(A\) o en \(B\) o en ambos.
Definición: Dado \(A\) y \(B\) dos conjuntos de \(\Omega\) la intersección de \(A\) y \(B\), dado por \(A\cap B\), es el conjunto que contiene a todos los elementos que están en \(A\) y en \(B\).
Definición: Dos conjuntos \(A\) y \(B\) definidos en \(\Omega\) se dice que son mutuamente excluyentes o disjuntos si no tienen elementos en común, es decir, \(A\cap B= \varnothing\)
Definición: Dados \(A\) y \(B\) conjuntos definidos en \(\Omega\), el conjunto de elementos que están en \(A\) pero que no están en \(B\) es el conjunto diferencia y se denota con \(A-B\).
Operaciones en R:
Dado: \(A=\{a,k,m\}\), \(B=\{b,k,f\}\), encontrar \(A\cup B\) y \(A\cap B\) :
A<-c("a","k","m")
B<-c("b","k","f")
union(A,B) # Conjunto unión
[1] "a" "k" "m" "b" "f"
intersect(A,B) # Conjunto intersección
[1] "k"
setdiff(A,B) # Conjunto diferencia.
[1] "a" "m"
Ejercicio:
Dado \(U=\{1,3,5,7,9\}\), \(A=\{1,3\}\) y \(B=\{1,5,7\}\). Calcular \(U\cap A\) y \(U\cap B\)
Dado \(A=\{1,3,5\}\) y \(B=\{1,5,7\}\), calcular \(A-B\)
El factorial de un número esta dado por \[ n!=\prod_{k=1}^{n} k \] Ejemplo:
n<-4
factorial(n) # factorial de 4
[1] 24
Definición: De un conjunto de \(n\) elementos distintos se seleccionan \(k\) elementos uno a la vez sin remplazo. El resultado es una perpetuación de \(n\) elementos tomados \(k\) a la vez. Así el número de ordenamientos distintos de \(k\) objetos seleccionados sin remplazo de una colección de \(n\) objetos diferentes está dado por:
\[ P_{n,k}=\frac{n!}{(n-k)!} \] Ejercicio: Calcular \(P_{4,2}\), es decir, \(n=4\) y \(k=2\)
n<-4
k<-2
factorial(n)/factorial(n-k)
[1] 12
Si el muestreo es realizado con remplazo, entonces el número de formas en las que se puede seleccionar una muestra ordenada de \(k\) objetos de un conjunto de \(n\) objetos distintos es
\[ n^k \]
Ejemplo:
n^k
[1] 16
Definición: Dado un conjunto de \(n\) elementos diferentes, cada subconjunto de tamaño \(k\) elegido del conjunto sin remplazo, se le conoce como combinación de \(n\) elementos \(k\) a la vez. El número de estas combinaciones está dado por
\[ C_{n,k}=\binom{n}{k} = \frac{n!}{k!(n - k)!} \]
Así el número de formas en la cual se puede seleccionar una muestra (no ordenada) de \(k\) objetos sin remplazo de un conjunto con \(n\) objetos diferentes, está dado por \(C_{n,k}\).
Ejemplo:
n<-4
k<-2
choose(n, k) # número de combinaciones
[1] 6
Si el muestreo es realizado con remplazo, entonces el número de formas en la cual se puede seleccionar una muestra de \(k\) objetos de un conjunto con \(n\) objetos diferentes está dado por \[ \frac{(n-1+k)!}{k!(n-1)!} \]
Ejemplo:
n<-4
k<-2
factorial(n-1+k)/(factorial(k)*factorial(n-1))
[1] 10
Resumen:
| Muestra | Ordenada | No ordenada |
|---|---|---|
| Sin remplazo | \(P_{n,k}=\frac{n!}{(n-k)!}\) | \(C_{n,k}= \frac{n!}{k!(n - k)!}\) |
| Con remplazo | \(n^k\) | \(\frac{(n-1+k)!}{k!(n-1)!}\) |
La función nsamp del paquete prob también ayudan con los cálculos del Resumen anterior.
Instalación del paquete prob
install.packages("prob")
library(prob)
Ejemplo de: \[ P_{n,k}=\frac{n!}{(n-k)!} \]
nsamp(n=4,k=2,replace=F,ordered = T)
[1] 12
Ejemplo de: \[ n^k \]
nsamp(n=4,k=2,replace=T,ordered = T)
[1] 16
Ejemplo de \[ C_{n,k}= \frac{n!}{k!(n - k)!} \]
nsamp(n=4,k=2,replace=F,ordered = F)
[1] 6
Ejemplo de
\[ \frac{(n-1+k)!}{k!(n-1)!} \]
nsamp(n=4,k=2,replace=T,ordered = F)
[1] 10
Ejercicio: Generar un número aleatorio
sample(1:23,1)
[1] 7
#install.packages("vistributions")
library(vistributions)
Si \(X\), tiene distribución normal estándar, entonces \[ f_{X}(x)=\frac{1}{\sqrt{2\pi}}e^{-\frac{x^2}{2}} \] donde \(-\infty<x<\infty\)
Ejemplo: Sea \(X\) una v.a con distribución normal con media \(0\) y varianza \(1\), calcular \[ P(1\leq X \leq 3) \]
vdist_normal_prob(c(1,3),mean = 0,sd=1,type="both")
Links para aprender más de R: