Apuntes completos R | EYP1113 | StuBoxApuntes completos R
Todo lo que necesitas de R. Si quieres el archivo R de estos apuntes mandame un correo ([email protected])
frame_exclamation
Nota de mi
# Para que te sirvan estos apuntes, pegalos en R
# Luego, para encontrar algo en estos apuntes: ctrl + F
# Tambien justo entre esta "pantalla" (en R-studio) y la consola esta el "outline" para navegar todo mas rapidamente
#RECORDAR USAR rm(list=ls()) o rm(lo que se quiera eliminar)
rm(list=ls())
rm(x)
folder_open
1. INFO SOBRE FUNCIONES
?nombre_funcion # Buscar dentro de R por ayuda
# Para ejecutar una linea hacer ctrl + enter
folder_open
2. VARIABLES/OBJETOS
## 2.1 Asignación de valores ---------------------------------------------------
a <- 5**2
x <- 5
y <- 2
b <- TRUE # Booleano
# Estas se guardan y pueden ver en "Environment" cuando se ejecutan
## 2.2 Borrar y visualizar -----------------------------------------------------
rm(b) # borra este objeto
rm(list=ls()) # borra todas las variables (Clear All global)
ls() # ver todos los objetos creados
folder_open
3. OPERACIONES MATEMATICAS
5 + 2 # Suma
5 - 2 # Resta
5 * 2 # Multiplicación
5 / 2 # Division
5 ** 2 # Exponente
sqrt(2) # Raiz cuadrada
log(a) # Logaritmo natural de a
loga(2) # Logaritmo base a de 2
exp(a) # Exponente de a (e^a)
abs(a) # Valor absoluto de a
sign(a) # Signo de a (postivo -> 1, negativo -> -1)
choose(5, 2) # Combinatoria (5 2) (De 5 escoger 2)
folder_open
4. OPERACIONES LÓGICAS
# Devuelven booleanos
x < y # Menor que
x <= y # Menor o igual que
x > y # Mayor que
x >= y # Mayor o igual que
x == y # Igual a
x != y # Diferente a
! (x > y) # Negación (No)
(x > y) & (x < 10) # Y (and)
(x < y) | (y > 1) # O (or)
folder_open
5. FUNCIONES
## 5.1 Crear una función -------------------------------------------------------
nombre_funcion <- function(argumentos) {
# cuerpo de la función
return(resultado)
}
## 5.2 Ejecutar una función ----------------------------------------------------
nombre_funcion(argumentos)
# notar que el return imprime automatico
# ejemplo:
suma <- function(x,y){
resultado <- x+y
return(resultado)
folder_open
6. CLASE DE OBJETOS
class(a) # Ver la clase del objeto
## 6.1 Numeros ("numeric") -----------------------------------------------------
c <- 3504
c
class(c)
## 6.2 Texto ("character") -----------------------------------------------------
texto <- "Hola Mundo"
texto
class(texto)
as.character(3) # Transformar a texto
paste("Hola, ", nombre, "!", sep = "") # Transformar diferentes clases de objeto a texto y unirlas
folder_open
7. IMPORTAR / EXPORTAR ARCHIVOS
# cuando se importan se vuelven dataframes, por lo que se manipulan igual que esa categoria de datos
##Primera mirada de los datos
str(Tenis)
## 7.1 Importar datos ----------------------------------------------------------
### FORMA 1: archivos.txt (forma básica) ---------------------------------------
data <- read.table(file.choose(), header = TRUE) #file.choose() abre un explorador para seleccionar el archivo
# Header=TRUE si tiene nombres de columnas
# Si los decimales vienen con coma (",") en vez de punto:
data <- read.table(file.choose(), header = TRUE, dec = ",")
folder_open
8. ESTADISTICAS DESCRIPTIVAS DE ARCHIVOS/DATAFRAMES
names(Tenis) # nombres de las variables
summary(Tenis) #Resumen de las estadisticas de las variables numericas
## 8.1 Variables Categoricas ---------------------------------------------------
table(Tenis$Temperatura) # cuenta frecuencia de cada categroia
which.max(table(Tenis$Temperatura)) # posición de la categoría más frecuente y cual es
## 8.2 Medidas de tendencia central --------------------------------------------
mean(Tenis$Temperatura_Maxima) # Promedio de las temperaturas maximas de la base de datos "Tenis"
median(Tenis$Temperatura_Maxima) # Mediana de la temperatura maxima
folder_open
9. GRÁFICOS SIMPLES (DE DATAFRAMES, VECTORES O FUNCIONES)
# Para guardar gráficos podemos ir a la ventana Plots, dar click en export y guardar como imagen o pdf.
## 9.1 Gráficos de dispersión (scatterplot) ------------------------------------
plot(x = Tenis$Temperatura_Maxima, # dato eje x
y = Tenis$Temperatura_Minima, # dato eje y
# (no obligatorios...)
pch = 16, # tipo de punto (16 = solido)
xlab = "T° máxima", # titulo eje x
ylab = "T° mínima",
main = "Temperatura Máxima vs Mínima") #titulo general
### Agregar puntos específicos -------------------------------------------------
folder_open
10. DPLYR
install.packages("dplyr")
library(dplyr)
# El pipe %>% permite encadenar funciones de forma ordenada.
# Lo que está a la izquierda pasa como primer argumento a la función siguiente.
## 10.1 PIPE (%>%) -------------------------------------------------------------
# f(g(h(x))) se escribe como:
x %>% h() %>% g() %>% f()
# Ejemplo 1
c(1,2,3,4) %>% mean()
# Equivalente a:
mean(c(1,2,3,4))
folder_open
11. MODELOS DE PROBABILIDAD
#como ejemplo usaremos
.= 10
# pero podria ser cualquier cosa
# Notación estándar:
d___(x , parámetros) # P(X = x) o densidad
p___(q , parámetros) # P(X ≤ q)
q___(p , parámetros) # cuantil p
r___(n , parámetros) # muestra aleatoria de n datos que se comportan mas o menos ocmo la distribución
## mientras mas grande el n, mas se comporta enverdad como la distribución
folder_open
12. GRAFICOS DE DISTRIBUCIONES
## 12.1 Función de densidad ----------------------------------------------------
curve(dnorm(x, # dejar como x
mean=550, sd=50), # parametros
from=400, to=700) # rango visual
## 12.2 Funcion de probabilidad acumulada --------------------------------------
curve(pnorm(x, mean=550, sd=50), from=400, to=700, xlab = "x", ylab = "Probabilidad acumulada")
## 12.3 Histograma con realizaciones -------------------------------------------
## histograma de la muestra tamaño n
folder_open
13. MULTIPLES VARIABLES ALEATORIAS
## 13.1 Distribución/Probabilidad conjunta --------------------------------------
# P(X = x , Y = y)
# La distribución conjunta describe la probabilidad de que dos
# variables aleatorias tomen simultáneamente valores específicos
### De base de datos -----------------------------------------------------------
# Ejemplo con base de datos: mtcars
# X: rendimiento (mpg), Y: potencia (hp)
X <- mtcars$mpg
Y <- mtcars$hp
# Tabla conjunta: frecuencias n(x, y)
tabla_conjunta <- table(X, Y) # filas: valores de X, columnas: valores de Y
folder_open
14. TRANSFORMACIÓN DE VARIABLES
### Para esto usaremos de ejemplo el excel "maquina" del canvas
## Variables identicamente distribuidas ----------------------------------------
# Definir las variables, probablemente de una base de datos (X e Y)
X <- maquina$motor1 #basedatos$columna1
Y <- maquina$motor2 #basedatos$columna2
# Definir que tipo de distribucion siguen y sus parametros
# Usar summary() para obtener un analisis
# Graficar el histograma de ambas variables
par(mfrow = c(1,2)) # par() define la grilla de gráficos (1 fila, 2 columnas)
folder_open
15. ESTIMACIÓN DE PARAMETROS
## 15.1 funciones utiles para estimación ---------------------------------------
# (1) OPTIMIZE:
# Funcion: optimizar una funcion definida
optimize(f = fx, # fx: función en 1 variable
interval = c(a,b), # intervalo donde buscar
tol = 0.0001, # tolerancia numérica
maximum = TRUE) # TRUE maximiza, FALSE minimiza
# (2) UNIROOT:
#encontrar la raiz de una ecuacion
#encuentra una sola raiz, la primera (en orden aleatorio)
uniroot(df = g, # df: función que queremos igualar a 0 (usualmente la derivada)
factorial(a) # Factorial (a!)
# Funciones trigonometricas
# Funciones trigonometricas inversas
## 5.3 Funciones de control: if, else, for, while ------------------------------
# if / else: ejecutar código según una condición lógica
# if anidado (varias condiciones)
# for: repetir código sobre una secuencia
# while: ejecutar mientras la condición sea TRUE
## 6.3 Booleano ("logical") ----------------------------------------------------
## 6.4 Fechas ("Date") ---------------------------------------------------------
e <- as.Date('año-mes-dia')
e <- as.Date('2005-03-01')
f <-as.Date('01/03/2005', format = '%d/%m/%Y')
## 6.4 Vectores ==================================================================
# Vector: colección de elementos del mismo tipo
### Definir vector -------------------------------------------------------------
v1 <- c("I1","I2","Examen")
class(v1) #te dice el tipo de elementos dentro del vector
### Vectores preexistentes -----------------------------------------------------
vector <- c(numero_inicial:numero_final)
letters # lista con las letras minusculas en orden alfabetico
### Nombrar los elementos de un vector -----------------------------------------
names(v2) <- v1 # Los elementos del vector 2 se llaman lo del vector 1
### Operaciones con un vector --------------------------------------------------
mean(v2) # promedio de los elementos
sd(v2) # desviación estándar de los elementos
sum(r2) # suma de los elementos
prod(v2) # producto de los elementos
min(v2) # mínimo de los elementos
max(v2) # máximo de los elementos
### Operaciones con más de un vector -------------------------------------------
v1 + v2 # Suma elemento a elemento
v1 - v2 # Resta elemento a elemento
v1 * v2 # Multiplicación elemento a elemento
v1 / v2 # División elemento a elemento (cuidado con división por 0)
### Encontrar un elemento dentro de un vector ----------------------------------
v1[n] # Por ubicación (te da el elemento numero n)
v1[c(2, 3, 1)] # Acceder a múltiples elementos
v1[k:n] # Sublista con los elementos de k a n
### Otras funciones utilies de vectores ----------------------------------------
which(v2==7) # posición donde el elemento de v2 es igual a 7
6.3 %in% vector2 # TRUE si está en el vector
length(V2) # Cantidad de elementos del vector
### Filtrado de vectores -------------------------------------------------------
v2[v2 > 5] # Notas mayores a 5
v2 == max(v2) # Comparación con el máximo (te da un vector booleano)
## 6.2 CATEGORIAS ("factor") ===================================================
# Describe una cualidad y agrupa los datos en un número limitado de categorías o grupos
### Variable nominal -----------------------------------------------------------
# Categoria sin orden, son solo etiquetas
colores_vec <- c("Rojo", "Verde", "Azul", "Rojo")
factor(colores_vec) # Crea un factor. Niveles (por defecto en orden alfabético): Azul, Rojo, Verde
### Variable ordinal -----------------------------------------------------------
# Categoria con orden o jerarquia
# Creamos el factor y lo guardamos en una variable, definiendo los niveles
opiniones_factor <- factor(c("Bueno", "Malo", "Neutro", "Bueno", "Malo"),
levels = c("Malo", "Neutro", "Bueno"))
# Para ordenar el vector segun estas categorias
## 6.3 MATRICES Y ARRAYS ========================================================
### Crear una matriz, dado un vector -------------------------------------------
# matrix(data, nrow= , ncol= , byrow=TRUE/FALSE)
m1 <- matrix(1:20, nrow=4, ncol=5, byrow=TRUE)
### Crear un array, dado un vector ---------------------------------------------
# array(data, dim=c(filas, columnas, profundidad))
A1 <- array(1:72, dim=c(3,4,6))
### Extracción -----------------------------------------------------------------
m1[1, 1] # Elemento (1,1)
m1[c(1,2),c(3,4)] # Submatriz
A1[,1,] # Primera columna de cada capa
### Filtrado (con operadores lógicos) ------------------------------------------
### Funciones útiles -----------------------------------------------------------
diag(m1) # Diagonal de la matriz
t(m1) # Transponer matriz
dim(m1) # Dimensiones de la matriz
nrow(m1) # Cantidad de filas
ncol(m1) # Cantidad de columnas
m1 * m2 # Producto elemento a elemento
m1 %*% m2 # Producto matricial
solve(m1) # Inversa de una matriz
rowSums(m1) # Suma de filas
colSums(m1) # Suma de columnas
rowMeans(m1) # Promedio simple de filas
colMeans(m1) # Promedio simple de columnas
m2 <- rbind(m1, c(2,4,6,8,10)) # Agregar fila
m2 <- cbind(m1, c(1,2,3,4)) # Agregar columna
rownames(m2) <- c("f1","f2","f3","f4","f5") # Nombrar filas
## 6.4 DATA FRAMES ("data.frame") ============================================
# Hay dataframes ya incorporados en R, algunos son:
### Crear un dataframe ---------------------------------------------------------
# podemos crear un dataframe dado ciertas variables
# data.frame(Nombre 1 = Variable 1, Nombre2 = variable 2,...)
Libreta <- data.frame(Tipo = c("Ev1","Ev2","Ev3","Ev4","L1","L2"),Nota = c(4.5,5.3,3.9,6.0,6.5,7.0), Azul = Azul <- c(T,T,F,T,T,T))
### Explorar la base de datos --------------------------------------------------
head(mtcars) # primeras 6 filas
tail(mtcars) # últimas 6 filas
summary(mtcars) # resumen estadístico
### Filtrar la base de datos ---------------------------------------------------
Libreta[c(2,4), c("Azul","Nota")] # Acceder a subconjuntos por filas y columnas
subset(Libreta, subset= Azul == T) # Acceder a un subconjunto de datos con alguna restricción en específico
Libreta$Nota # Filtrar dataset por variable !!! (esta es la mas usada)
Libreta[Libreta$Azul == TRUE, ] # Filtrar con corchetes
Libreta[order(Libreta$Nota), ] # Orden creciente en función de una variable
Libreta[order(-Libreta$Nota), ] # Orden decreciente en función de una variable
### Agregar una nueva fila -----------------------------------------------------
nuevafila <- data.frame(Tipo="I5", Nota=4.5, Azul=TRUE)
nuevaLibreta <- rbind(Libreta, nuevafila)
### Agregar una nueva columna --------------------------------------------------
# Dataframe$nombrenuevacolumna <- vector
porcentaje = (Libreta$Nota)/7 * 100
Libreta$Porcentaje <- porcentaje
### Renombrar filas o columnas -------------------------------------------------
rownames(Libreta) <- LETTERS[1:6]
rownames(Libreta)[1] <- "NombreFila"
colnames(Libreta)[1] <- "NombreColumna"
## 6.5 LISTAS ("list") =========================================================
# Una lista puede contener objetos de distinto tipo
lista <- list(v1 = v1, datos = mtcars, matriz = m1)
names(lista) <- c("numeros", "matriz", "nombre") # Agregar/ cambiar nombres
mi_lista$nuevo_elemento <- "Dato nuevo" # Agregar un nuevo elemento a la lista (con nombre)
### Filtrar --------------------------------------------------------------------
lista$datos # Acceder por nombre
lista[[1]] # Acceder por posición !!SON DOBLES!!
### FORMA 2: Desde environment -------------------------------------------------
#Excel: File > Import Dataset > From Excel
#.txt: File > Import Dataset > From Text (base)
### FORMA 3: paquete rio -------------------------------------------------------
install.packages("rio") #(se corre una sola vez)
bd <- import(file.choose()) #lee .csv, .xlsx, .sav, etc.
### Corregir el tipo de variable de una fila -----------------------------------
Tenis$Juega_Tenis <- as.factor(Tenis$Juega_Tenis) #Transformar una variable numérica (0/1) a factor
## caracter (str) → categória
Tenis$var <- as.factor(Tenis$var) # Transforma de variable "texto" (str) a categoria/factor
# a numero: as.numeric (NOTA: para pasar de factor a numeric hay q transformarlo a texto primero)
## 7.2 Exportar datos ----------------------------------------------------------
write.table(mtcars, "Autos.txt") #Exportar un data frame a .txt
# Ojo: el archivo se guarda en el directorio de trabajo actual.
# Se puede cambiar en RStudio: Session -> Set Working Directory.
table(Tenis$Temperatura_Maxima) # Cuenta frecuencia de cada numero (Para encontrar la moda)
## 8.3 Medidas de posicion -----------------------------------------------------
min(Tenis$Temperatura_Minima) # Temperatura mínima
quantile(Tenis$Temperatura_Maxima, probs = c(0.25, 0.5, 0.75)) # Cuartiles (25%, 50%, 75%) de la temperatura máxima
max(Tenis$Temperatura_Maxima) # Temperatura mínima
## 8.4 Medidas de disperción ---------------------------------------------------
var(Tenis$Temperatura_Maxima) # Varianza de la temperatura máxima
sd(Tenis$Temperatura_Maxima) # Desviación estándar
range(Tenis$Temperatura_Maxima) # Dato mas grande y mas chico
IQR(Tenis$Temperatura_Maxima) # Rango intercuartil (Q3 - Q1)
## 8.5 Medidas de forma --------------------------------------------------------
#se debe instalar un paquete para esto
install.packages("moments")
skewness(Tenis$Temperatura_Maxima) # Asimetría
kurtosis(Tenis$Temperatura_Maxima) # Curtosis
points(x = 20, y = 10, pch =16, col = "blue", lwd = 3)
points(x = 22, y = 14, pch = 16, col = "red", lwd = 3)
### Agregar lineas -------------------------------------------------------------
#### Agregar una línea entre dos puntos
lines(x = c(20, 22), # x de ambos puntos
lwd = 3) # grosor de linea
#### Líneas de referencia punteadas (v: vertical, h: horizontal)
lty = 2, # tipo de linea (2 = punteado)
abline(h = 10, lwd = 2, lty = 2, col = "orange")
#### Recta que pasa por dos puntos [(20,10) y (22,14)]
# lo mismo para una recta y = a + bx
m <- (14 - 10) / (22 - 20) # pendiente (b)
abline(a = 10 - 20*m, # a = y - bx con (y) e (x) del punto que intercepta la recta
## 9.2 Gráfico de funciones de una variable: curve() ---------------------------
# f(α) = e^(-0.5 α) * cos(3 α)
curve(exp(-0.5 * x) * cos(3 * x), # funcion
from = 0, to = 10, n = 5000, # rango de funcion
xlab = expression(alpha),
ylab = expression(e^{-0.5*alpha} * cos(3*alpha)),
main = expression(paste("Función: ",
f(alpha) == e^{-0.5*alpha} * cos(3*alpha))),
# Agregar curvas al mismo gráfico (add = TRUE)
curve(exp(-0.5 * x), add = TRUE, lty = 2, col = 2)
curve(-exp(-0.5 * x), add = TRUE, lty = 2, col = 4)
## 9.3 Histograma (distribución de una variable numérica) ----------------------
hist(x = Tenis$Temperatura_Maxima,
main = "Histograma de T° Máxima",
freq = FALSE, # FALSE = muestra densidad
border = "white") # borde de cada "rectanguloE
## 9.4 Gráfico de caja (boxplot) -----------------------------------------------
# Boxplot de una variable
boxplot(Tenis$Temperatura_Maxima,
main = "Boxplot de Temperatura Máxima",
ylab = "Temperatura Máxima",
# Boxplot de Temperatura_Maxima según categoría Temperatura
boxplot(Tenis$Temperatura_Maxima ~ Tenis$Temperatura, #los characeters son tratados automaticamente como factores
main = "Boxplot de Temperatura",
ylab = "Temperatura Máxima",
## 9.5 Gráficos de barras (para variables de texto o categoricas) --------------
# Barras simples para una variable categórica
barplot(height = table(Tenis$Temperatura), #MUY IMPORTANTE QUE DIGA TABLE Y QUE CORRAS TABLE ANTES
# Barras agrupadas para dos variables categóricas
frecuencias <- table(Tenis$Temperatura, Tenis$Pronostico)
barplot(height = frecuencias,
col = c("tomato", "violetred", "turquoise"),
beside = TRUE, # barras lado a lado
# Ejemplo práctico con mtcars
# Filtro → selección → orden
data_filtrada <- mtcars %>%
# Sin pipe (más difícil de leer)
data_filtrada <- arrange(select(filter(mtcars, am==1), mpg, cyl), cyl)
## 10.2 Select -----------------------------------------------------------------
dataTaller7 <- dplyr::select(heightweight, # dataframe
# select() elige columnas específicas de un data frame
## 10.3 Group_by ---------------------------------------------------------------
#Permite agrupar la base de datos en un parametro deseado
#agr: sobre que variable se quiere agrupar
## lo genera como una lista
set.seed(numero) # Hace que lo "aleatorio" sea igual para todos
## 11.1 Variables discretas ====================================================
### Binomial -------------------------------------------------------------------
# X ~ Binomial(size = 12, prob = 0.3)
## size: número de ensayos
## prob: probabilidad de éxito
dbinom(x = ., size = 12, prob = 0.3) # P(X = .)
pbinom(q = ., size = 12, prob = 0.3) # P(X ≤ .)
qbinom(p = ., size = 12, prob = 0.3) # cuantil p
rbinom(n = ., size = 12, prob = 0.3) # muestra aleatoria de n datos
### Geométrica -----------------------------------------------------------------
# X ~ Geométrica(prob = 0.25)
## prob: probabilidad de éxito por intento
dgeom(x = ., prob =0.25) # P(X = .)
pgeom(q = ., prob = 0.25) # P(X ≤ .)
qgeom(p = ., prob = 0.25) # cuantil p
rgeom(n = ., prob = 0.25) # muestra aleatoria
### Binomial Negativa ----------------------------------------------------------
# X ~ BinomialNeg(size = 5, prob = 0.4)
## size: número de éxitos buscados
## prob: probabilidad de éxito
dnbinom(x = ., size = 5, prob = 0.4) # P(X = .)
pnbinom(q = ., size = 5, prob = 0.4) # P(X ≤ .)
qnbinom(p = ., size = 5, prob = 0.4) # cuantil p
rnbinom(n = ., size = 5, prob = 0.4) # muestra aleatoria
### Poisson --------------------------------------------------------------------
# X ~ Poisson(lambda = 6.5)
## lambda: número promedio de ocurrencias
dpois(x = ., lambda = 6.5) # P(X = .)
ppois(q = ., lambda = 6.5) # P(X ≤ .)
qpois(p = ., lambda = 6.5) # cuantil p
rpois(n = ., lambda = 6.5) # muestra aleatoria
### Hipergeométrica ------------------------------------------------------------
# X ~ Hipergeométrica(m = 15, n = 25, k = 10)
## m: éxitos en la población
## n: fracasos en la población
## k: tamaño de la muestra
dhyper(x = ., m = 15, n = 25, k = 10) # P(X = .)
phyper(q = ., m = 15, n = 25, k = 10) # P(X ≤ .)
qhyper(p = ., m = 15, n = 25, k = 10) # cuantil p
rhyper(nn = ., m = 15, n = 25, k = 10) # muestra aleatoria
### Uniforme -------------------------------------------------------------------
# X ~ Uniforme(min = -3, max = 12)
dunif(x = ., min = -3, max = 12) # f(.)
punif(q = ., min = -3, max = 12) # P(X ≤ .)
qunif(p = ., min = -3, max = 12) # cuantil p
runif(n = ., min = -3, max = 12) # muestra aleatoria
## 11.2 Variable continuas =====================================================
### Normal ---------------------------------------------------------------------
# X ~ Normal(mean = 10, sd = 2)
## sd: desviación estándar
dnorm(x = ., mean = 10, sd = 2) # f(.)
pnorm(q = ., mean = 10, sd = 2) # P(X ≤ .)
qnorm(p = ., mean = 10, sd = 2) # cuantil p
rnorm(n = ., mean = 10, sd = 2) # muestra aleatoria
### Log-Normal -----------------------------------------------------------------
# X ~ Log-Normal(meanlog = 6, sdlog = 1.2)
dlnorm(x = ., meanlog = 6, sdlog = 1.2) # f(.)
plnorm(x = ., meanlog = 6, sdlog = 1.2) # P(X ≤ .)
qlnorm(x = ., meanlog = 6, sdlog = 1.2) # cuantil p
rlnorm(x = ., meanlog = 6, sdlog = 1.2) # muestra aleatoria
### Exponencial ----------------------------------------------------------------
# X ~ Exponencial(rate = 4)
## rate: parámetro de tasa (1/media)
dexp(x = ., rate = 4) # f(.)
pexp(q = ., rate = 4) # P(X ≤ .)
qexp(p = ., rate = 4) # cuantil p
rexp(n = ., rate = 4) # muestra aleatoria
### Gamma ----------------------------------------------------------------------
# X ~ Gamma(shape = 3, rate = 1.5)
## shape: parámetro de forma
## rate: parámetro de tasa
dgamma(x = ., shape = 3, rate = 1.5) # f(.)
pgamma(q = ., shape = 3, rate = 1.5) # P(X ≤ .)
qgamma(p = ., shape = 3, rate = 1.5) # cuantil p
rgamma(n = ., shape = 3, rate = 1.5) # muestra aleatoria
### Chi-Cuadrado ---------------------------------------------------------------
# X ~ ChiCuadrado(df = 8)
## df: grados de libertad
dchisq(x = ., df = 8) # f(.)
pchisq(q = ., df = 8) # P(X ≤ .)
qchisq(p = ., df = 8) # cuantil p
rchisq(n = ., df = 8) # muestra aleatoria
### t-Student ------------------------------------------------------------------
## df: grados de libertad
dt(x = ., df = 12) # f(.)
pt(q = ., df = 12) # P(X ≤ .)
qt(p = ., df = 12) # cuantil p
rt(n = ., df = 12) # muestra aleatoria
### Fisher (F) -----------------------------------------------------------------
# X ~ F(df1 = 5, df2 = 20)
## df1: grados de libertad del numerador
## df2: grados de libertad del denominador
df(x = ., df1 = 5, df2 = 20) # f(.)
pf(q = ., df1 = 5, df2 = 20) # P(X ≤ .)
qf(p = ., df1 = 5, df2 = 20) # cuantil p
rf(n = ., df1 = 5, df2 = 20) # muestra aleatoria
#notar que a "n" se le asigna valor no como a x en las "Curve" de arriba
hist(rnorm(n, mean=550, sd=50), freq = FALSE, xlab = "x", ylab = "Probabilidad")
## 12.4 Ver a que distribución se parecen los datos ----------------------------
hist(rweibull(10000, shape = 1, scale = 2),
## agregar curva para probar
curve(dweibull(x, shape = 1, scale = 2),
tabla_conjunta # muestra cuántas veces ocurre cada par (x,y)
# Función de probabilidad conjunta p(x, y) = n(x,y) / n
p_conjunta <- prop.table(tabla_conjunta)
p_conjunta # cada celda es P(X = x, Y = y)
# Acceder a una probabilidad conjunta puntual:
# Ojo: los nombres de filas/columnas son caracteres
p_conjunta["21", "110"] # P(X = 21, Y = 110) como ejemplo
### De distribuciones independientes -------------------------------------------
# Si X y Y son independientes entonces:
# fX,Y(x,y) = fX(x) * fY(y)
# Ejemplo: X ~ Bin(5, 0.3), Y ~ Poisson(λ=4)
# Prob conjunta = p_X(x) * p_Y(y)
p_xy <- dbinom(2, size = 5, prob = 0.3) * dpois(3, lambda = 4)
# Ejemplo 2: X ~ Exp(λ=2), Y ~ N(0,1)
# f(x,y) = f_X(x) * f_Y(y)
f_xy <- dexp(1.2, rate = 2) * dnorm(0.5, mean = 0, sd = 1)
f_xy # densidad conjunta en (x=1.2, y=0.5)
### De distribuciones dependientes ---------------------------------------------
# Cuando existe dependencia se usa:
# p(x,y) = pY(y) * pX|Y(x|y)
# Ejemplo 1 (dependencia básica):
# Y ~ Poisson(lambda = 6)
# X|Y=y ~ Binomial(size = y, prob = 0.3)
dpois(y, lambda = 6) * dbinom(x, size = y, prob = 0.3)
## 13.2 Distribuciones marginales ------------------------------------------------
### De base de datos -----------------------------------------------------------
#Forma 1: Sumar todo X que cumpla con Y
marginalY = colSums(p_conjunta)
indices <- which(as.numeric(names(marginalX)) > 20)
#Forma 2: Marginal de X (suma por columnas → margin = 1 = filas)
p_X <- apply(X = p_conjunta,
MARGIN = 1, # 1 = filas = valores de X
# Marginal de Y (suma por filas → margin = 2 = columnas)
p_Y <- apply(X = p_conjunta,
MARGIN = 2, # 2 = columnas = valores de Y
### De distribuciones independientes -------------------------------------------
# px y py ya son marginales por definición
px <- dbinom(0:5, 5, 0.3)
#fx y fy (densidades marginales) ya vienen definidas por separado
### De distribuciones dependientes ---------------------------------------------
# pX(x) = sum_{y = -inf} ^inf (P(Y = y)*P(X = x | Y = y))
#Ejemplo: P(X = 0) dado que Y <- dpois(lambda = 6) y X_dado_Y <- dbinom(size = y, prob = 0.6)
sum(dpois(0:1000, λ) * dbinom(x = 0, size = 0:1000, prob = p))
# f_X(x) = ∫ f(x,y) dy (en R se aproxima con sumas o integrate())
## 13.3 Distribuciones condicionales --------------------------------------------
# P(X=x | Y=y) = P(X=x, Y=y) / P(Y=y)
# P(Y=y | X=x) = P(X=x, Y=y) / P(X=x)
### De base de datos -----------------------------------------------------------
# P(Y = y | X = x) y P(X = x | Y = y) a partir de la tabla de frecuencias
# P(Y = y | X = x) = p(x,y) / p_X(x)
# Se obtiene normalizando por filas (margin = 1)
# P(Y = y | X = x) : normalizar fila (margin=1)
p_Y_dado_X <- prop.table(tabla_conjunta, margin = 1) # cada fila suma 1: distribución de Y dado X
# P(X = x | Y = y) : normalizar columna (margin=2)
p_X_dado_Y <- prop.table(tabla_conjunta, margin = 2) # cada columna suma 1: distribución de X dado Y
#Tambien podemos calcular P(A y B)/P(B)
## identificar que filas y que columnas cumplen
indices <- which(as.numeric(names(marginalX)) > 20)
cols_wt3 <- which(as.numeric(colnames(p_conjunta)) < 3)
sum(p_conjunta[indices, cols_wt3])
#probabilidad condicional
sum(p_conjunta[indices, cols_wt3])/sum(marginalX[indices])
### De distribuciones independientes -------------------------------------------
# Ejemplo con X ~ Bin(5,0.3), Y ~ Poisson(4)
px <- dbinom(0:5, 5, 0.3)
# P(Y=y | X=x = 2) = py (porque independencia)
### De distribuciones dependientes ---------------------------------------------
# Si tienes f_conj = outer(fx, fy)
# Densidad condicional f(y|x) = f(x,y) / f_X(x)
f_X_emp <- apply(f_conj, 1, sum) # aproximación por sumas
f_Y_dado_X <- f_conj / f_X_emp # divide filas por f_X(x)
# Si tienes P(X=x, Y=y) = p_conj (matriz)
p_X_emp <- apply(p_conj, 1, sum) # marginal X
p_Y_dado_X_emp <- p_conj / p_X_emp # divide cada fila por p_X(x)
## 13.4 Gráficos de dos variables ----------------------------------------------
### Gráfico de dispersión de los datos (X vs Y) --------------------------------
xlab = "X = rendimiento (mpg)",
ylab = "Y = potencia (hp)",
main = "Diagrama de dispersión de X e Y")
### Gráfico 3D de la distribución conjunta discreta P(X = x, Y = y) ------------
# a) Matriz de probabilidades conjuntas
Z_vals <- as.matrix(p_conjunta) # matriz con p(x,y)
# b) Valores posibles de X e Y (convertir nombres de filas/columnas a numéricos)
X_vals <- as.numeric(rownames(Z_vals))
Y_vals <- as.numeric(colnames(Z_vals))
# c) Todas las combinaciones (x, y) con su probabilidad z = P(X = x, Y = y)
coords <- expand.grid(X = X_vals, Y = Y_vals) # todas las parejas (x,y)
coords$Z <- as.vector(Z_vals) # prob conjunta asociada a cada (x,y)
# d) Gráfico 3D tipo "palitos" de la función de probabilidad conjunta
install.packages("scatterplot3d") # ejecutar solo la primera vez
scatterplot3d(coords$X, coords$Y, coords$Z,
type = "h", # líneas desde el plano XY hasta la altura Z
lwd = 2, # grosor de las líneas
pch = "", # sin punto en la punta
xlab = "X = rendimiento (mpg)",
ylab = "Y = potencia (hp)",
zlab = "P(X = x, Y = y)",
main = "Distribución conjunta de X e Y",
highlight.3d = TRUE, # colorea según la altura
angle = 70) # ángulo de vista (se puede cambiar)
## 13.5 NORMAL BIVARIADA ======================================================
# En esta sección trabajamos con la distribución Normal bivariada usando:
# - Datos reales (peso y altura)
# - Funciones del paquete mvtnorm para densidades y probabilidades
# Ver Taller 7 si estas perdido con funciones and whatnot
install.packages("mvtnorm")
### Distribución conjunta, marginal, y condicional -----------------------------
# f_X = \int f_(X,Y) (x,y) dx
# aunque usualmente te van a dar esto de un principio
# X ~ Normal(mu_x, sigma_x ^2)
# Y ~ Normal(mu_y, sigma_y ^2)
# necesitamos el vector de medias y la matriz de covarianzas (slide 4 lab 7)
vec.mu <- c(mean(X),mean(Y)) #(mu_x, mu_y)
vec.mu <- c(mean(X), mean(Y), mean(Z))
#matriz de varianzas y covarianzas (asumiendo que son independientes)
mat.cov <- matrix(c(sd(X)^2,Cov(X,Y),Cov(X,Y),sd(Y)^2), ncol = 2) # (sigma_x^2, cov , cov, sigma_y^2)
sd(X)^2, Cov(X, Y), Cov(X, Z),
cov(X, Y), sd(Y)^2, Cov(Y, Z),
cov(X, Z), cov(Y, Z), sd(Z)^2
), ncol = 3, byrow = TRUE)
# cov() calcula la matriz de covarianzas de las columnas de un data frame
# Definimos una función de ayuda para la densidad normal bivariada
d2norm <- function(x, y){ # function() define una función en R
z <- numeric(length(x)) # numeric(n) crea un vector numérico de largo n
for(i in 1:length(x)){ # for() recorre los índices 1,2,...,length(x)
z[i] <- dmvnorm(c(x[i], y[i]),
# dmvnorm(x, mean, sigma) calcula la densidad multivariada en el punto x
return(z) # return() entrega el resultado de la función
# P(X1 > 100, X2 > 60) bajo Normal bivariada
p.x1x2 <- pmvnorm(lower = c(100, 60), # vector de límites inferiores
upper = Inf, # Inf indica +infinito como límite superior
# pmvnorm(lower, upper, mean, sigma) calcula P(lower <= X <= upper) en multivariado
# Numerador: P(X<75 , Y<200 , Z>100)
lower = c(-Inf, -Inf, 100),
# Densidad puntual f_{X1,X2}(100, 60) bajo Normal bivariada
# dmvnorm() aquí entrega la densidad conjunta en el punto (100,60)
# f_(X|Y>y) = f_(X,Y) / f_Y
# f_(X < b|Y = a) = Normal (mu_x|y, sigma_x|y ^2)
rho <- cov(x1, x2) / (sigma_x * sigma_y) #funcion de correlación
mu_X_dado_Ya <- mu_X + rho * (sigma_x / sigma_y) * (a - mu_Y) # Promedio de la condicional
var_X_dado_Y <- sigma_x^2 * (1 - rho^2) # Varianza de la condicional
pnorm(q = b, mean = mu_X_dado_Ya, sd = sqrt(var_X_dado_Y))
### Bases de datos y análisis descriptivo --------------------------------------
install.packages("gcookbook") # instala el paquete (solo la primera vez)
data("heightweight") # data() carga un dataset incluido en un paquete
head(heightweight) # head() muestra las primeras filas del data frame
dataTaller7 <- dplyr::select(heightweight, weightLb, heightIn)
# select() elige columnas específicas de un data frame
X1 <- dataTaller7$weightLb # extrae la columna "weightLb" (peso) como vector
X2 <- dataTaller7$heightIn # extrae la columna "heightIn" (altura) como vector
# Gráficos descriptivos univariados
par(mfrow = c(1,2)) # par(mfrow=) divide la ventana gráfica en 1x2 paneles
hist(X1, freq = FALSE) # hist() grafica un histograma; freq=FALSE escala como densidad
dev.off() # dev.off() restaura la configuración gráfica por defecto
# Gráfico de dispersión (relación entre peso y altura)
plot(X1, X2, # plot(x,y) hace un grafico de dispersión de X vs Y
pch = 19, # pch define el símbolo de los puntos (19 = circulo sólido)
cex = 0.7, # cex controla el tamaño de los puntos
main = "X1 = Peso, X2 = Altura")
# Promedios y desviaciones estándar
mean(X1) # mean() calcula el promedio de un vector numérico
sd(X1) # sd() calcula la desviación estándar de un vector
round(3.14159, 3) # round(x, d) redondea x a d decimales
paste0("Promedio peso: ", round(mean(X1), 3))
# paste0() concatena texto sin espacios intermedios
paste0("Promedio altura: ", round(mean(X2), 3))
paste0("SD peso: ", round(sd(X1), 3))
paste0("SD altura: ", round(sd(X2), 3))
cor(bd$heightIn, bd$weightLb)
# cor(x,y) calcula el coeficiente de correlación de Pearson entre x e y
### Normal bivariada teórica y gráficos -------------------------------
install.packages("mvtnorm")
library(mvtnorm) # mvtnorm entrega funciones para distribuciones normales multivariadas
?dmvnorm # dmvnorm(): densidad normal multivariada
?rmvnorm # rmvnorm(): simula datos normales multivariados
?pmvnorm # pmvnorm(): probabilidad acumulada multivariada
### PARA P(X > x, Y > y):
pmvnorm(lower = c(), # lower: vector (x, y)
mean = , # vector de medias
sigma = )[1] # Matriz de covarianzas
# Construimos una grilla de puntos donde evaluar la densidad
x.axis <- seq(-3, 3, length = 50)
# seq(desde, hasta, length=) genera una secuencia equiespaciada
y.axis <- seq(-3, 3, length = 50)
vec.mu <- c(0, 0) # crear el vector de medias (mu1, mu2)
mat.cov <- matrix(c(1, 0, # crear matriz de covarianza 2x2
# Definimos una función de ayuda para la densidad normal bivariada
d2norm <- function(x, y){ # function() define una función en R
z <- numeric(length(x)) # numeric(n) crea un vector numérico de largo n
for(i in 1:length(x)){ # for() recorre los índices 1,2,...,length(x)
z[i] <- dmvnorm(c(x[i], y[i]),
# dmvnorm(x, mean, sigma) calcula la densidad multivariada en el punto x
return(z) # return() entrega el resultado de la función
z.axis <- outer(x.axis, y.axis, FUN = d2norm)
# outer(a, b, FUN) aplica FUN a todas las combinaciones de elementos de a y b
# y devuelve una matriz; aquí produce la matriz de densidades f(x,y)
#### Gráfico 3D de la superficie de densidad -----------------------------------
persp(x.axis, y.axis, z.axis, # persp() dibuja una superficie 3D
theta = 40, # theta controla el ángulo horizontal de vista
phi = 30, # phi controla el ángulo vertical de vista
expand = 1, # expand ajusta la altura relativa del eje z
shade = 0.1, # shade agrega sombreado para dar profundidad
#### Imagen desde arriba (mapa de calor de la densidad) ------------------------
image(x.axis, y.axis, z.axis)
# image(x,y,z) dibuja una "imagen" con colores según los valores de z
contour(x.axis, y.axis, z.axis,
# contour(x,y,z) dibuja curvas de nivel; add=TRUE superpone sobre el gráfico anterior
#### Efecto de medias y covarianzas --------------------------------------------
# Cambiar el vector de medias (mueve el "centro" de la elipse)
# Cambiar medias y covarianza (incluye correlación) (las curvas se vuelven más "elípticas")
#### Ajuste de normalidad bivariada a bases de datos ---------------------------
mu.x1 <- mean(X1) # promedio muestral de X1
sd.x1 <- sd(X1) # desviación estándar muestral de X1
hist(X1, freq = FALSE, xlim = c(20, 180))
curve(dnorm(x, mean = mu.x1, sd = sd.x1), add = TRUE, col = "red", lwd = 3) # curve(expr, from, to, add=TRUE) dibuja una curva de una función
hist(X2, freq = FALSE, xlim = c(40, 80))
curve(dnorm(x, mean = mu.x2, sd = sd.x2), add = TRUE, col = "red", lwd = 3)
cor.x1x2 <- cor(dataTaller7) # cor(data frame) entrega la matriz de correlaciones
# Estandarizamos peso y altura (media 0, sd 1) (HACER SIOSI)
X1.est <- (X1 - mu.x1) / sd.x1
X2.est <- (X2 - mu.x2) / sd.x2
plot(X1.est, X2.est, pch = 20) # puntos de los datos ya estandarizados
vec.mu <- c(0, 0) # asumimos medias 0 en las estandarizadas
mat.cov <- cor.x1x2 # usamos la matriz de correlaciones como covarianzas
x.axis <- seq(-3, 3, length = 50)
y.axis <- seq(-3, 3, length = 50)
z.axis <- outer(x.axis, y.axis, FUN = d2norm)
image(x.axis, y.axis, z.axis)
points(X1.est, X2.est, pch = 20, col = "darkblue") # points(x,y) agrega puntos a un gráfico ya existente
contour(x.axis, y.axis, z.axis, # Visualmente comparamos los datos con la elipse de la Normal bivariada
hist(X, breaks=30, freq=FALSE, col="lightblue",
main="Motor 1", xlab="Tiempo hasta falla")
curve(dexp(x, rate=1.5), add=TRUE, col="red", lwd=3)
hist(Y, breaks=30, freq=FALSE, col="lightgreen",
main="Motor 2", xlab="Tiempo hasta falla")
curve(dexp(x, rate=1.5), add=TRUE, col="red", lwd=3)
dev.off() # "desactiva" los graficos
### Simulación variables iid ---------------------------------------------------
# Si se pide simular una muestra de n v.a. iid, se hace una matriz de 200 filas
# y n columnas, y se cambia (con un for) cada valor X[, j]
Xn <- matrix(NA, nrow = 200, ncol = n)
Xn[,j] <- rexp(200, rate = lambda)
#El exp debe ser la distribucion requerida, con sus parametros correspondientes
## Suma de Variables Aleatorias ------------------------------------------------
#Definir el tipo de distribucion y sus parametros en base a las v.a.(Z = X + Y)
Z <- X + Y # suma punto a punto
#Graficar la suma de variables (hay ciertas sumas que se sabe un respuesta, como...)
alpha <- 2 # para gamma de dos exponentiales
hist(Z, breaks=15, freq=FALSE, col="lightblue",
main="Tiempos totales", xlab="X+Y")
curve(dgamma(x, shape=alpha, rate=1.5),
add=TRUE, col="red", lwd=3)
#La funcion densidad de Z es fz(z) = integral de -oo a oo(fx,y(z-y,y)dy) o igual despejando para X
#Si X e Y ind --> fx,y = fx(x)*fy(y)
## Transformación de Variables aleatorias --------------------------------------
# W = g(Z) ==> W = log(Z)
# Cálculo de la densidad usando el método del jacobiano
# (1) g^{-1} (W) = Z ==> exp(W) = Z
# La densidad de W = log(Z) [Ver ppt las integrales q explican esto]
# (2) f_W(w) = f_Z(g-1(W)) * |d/dw g-1(W)|
# (3) f_W(w) = f_Z(exp(W)) * |d/dw exp(W)|
# (4) f_W(w) = f_Z(exp(W)) * exp(W)
#lo de arriba son los 4 pasos que uno debe hacer [VERY IMPORTANT]
## Teorema central del limite (TCL) --------------------------------------------
# no simepre podemos encontras la distribucion analiticamente tan facil
# se cumple cuando n es sufiecientemente grande
### SUMA cuando n->oo ----------------------------------------------------------
#### distribuye normal con de la siguiente forma:
# Normal(n*mu, sqrt(n)*sigma)
### El promedio de las variables (suma/n) --------------------------------------
# Normal(mu, sigma/sqrt(n))
################################################################################
## Para las distribuciones (ver TALLER 8): ##
## Bernoulli(p) --> Sn = Binomial(n, p) ~ Normal(np, np(1-p)), ##
## Xprom ~ Normal(p, {p(1-p)}/n) ##
## Poisson(lambda) --> Sn = Poisson(n*lambda) ~ Normal(n*lambda, n*lambda), ##
## Xprom = Normal(lambda, lambda/n) ##
## Exp(lambda) --> Sn = Gamma(n, lambda) ~ Normal(n/lambda, n/lambda^2), ##
## Xprom ~ Normal(1/lambda, 1/(n*lambda^2)) ##
## Notar que el segundo parametro de la normal está dada como varianza, ##
## por lo que para usar pnorm, dnorm,... se debe usar sd = sqrt(parametro) ##
################################################################################
### Ejemplos -------------------------------------------------------------------
mu_prom_beta = b1/(b1+b2)
sd_prom_beta = (b1*b2)/((b1 + b2)^2*(b1+b2+1))
### Lognormal(lambda_ln, zeta_ln)
mu_ln <- exp(lambda_ln + zeta_ln^2 / 2)
var_ln <- (exp(zeta_ln^2) - 1) * exp(2 * lambda_ln + zeta_ln^2)
mu_F <- d2 / (d2 - 2) # d2 > 2
var_F <- (2 * d2^2 * (d1 + d2 - 2)) / (d1 * (d2 - 2)^2 * (d2 - 4))
mu_weib <- lambda * gamma(1 + 1/k)
var_weib <- lambda^2 * ( gamma(1 + 2/k) - gamma(1 + 1/k)^2 )
interval = c(a,b)) # intervalo se quiere buscar la raiz
#Funcion: minimizar funciones multivariadas iterativamente
optim(par = c(valores_iniciales), # vector inicial
fn = f) # f: función a minimizar
## 15.2 FITDIST ----------------------------------------------------------------
install.packages("fitdistrplus")
library(fitdistrplus) # librería con estimación de parámetros
distr = "norm", # distribución asumida
method = "mme", # método: "mme" o "mle"
fix.arg = list(parametro = _)) # si se sabe un parametro, se agrega con este
# Solo permite "norm", "lnorm", "pois", "exp", "nbinom", "geom", "beta", "unif", "logis"
### interpretación del resultado de fitdist ------------------------------------
ajuste <- fitdist(X, "norm", method="mle")
ajuste$estimate # parámetros estimados
ajuste$sd # error estándar
ajuste$loglik # log-verosimilitud
### "mme": Estimación por momentos ---------------------------------------------
# Idea: igualar momentos teóricos con momentos muestrales.
X <- c(0.44,0.70,1.63,3.51,1.11,0.41,0.65,0.93,0.47,4.49)
lambda_EM <- 1 / mean(X) # EM = 1/X̄
### "mle": Estimación por maxima verosimilitud ---------------------------------
# Idea: se busca maximizar la funcion de distribución de la probabilidad de
# todos los x (la muestra) y tmb el parametro
# si creo que mis datos se comportan como exponencial
# f(x, lambda) = L = lambda*e^(-lambda*x)
logL <- function(lambda){
n*log(lambda) - lambda*sum(X) # log-verosimilitud
# Maximizar en intervalo razonable: [0.001, 10]
lambda_EMV <- optimize(logL,
# 16. Prueba de hipotesis ======================================================
#Funcion: comprobar si valor estimado es rechazado o no rechazado
install.packages("TeachingDemos")
# alpha casi siempre va a ser 0.05
# si p < alpha: se rechaza la hipotesis
## Z-Test (TEST DE MU CON DESVIACION ESTANDAR CONOCIDA)-------------------------
z.test(X, mu = mu, sd=sigma, alternative = "", conf.level = 1-alpha)
## T-Test (TEST DE MU CON DESVIACION ESTANDAR DESCONOCIDA) ---------------------
t.test(X, mu = mu, alternative = "", conf.level = 1-alpha)
## Chi-cuadrado (TEST DE SIGMA CON MU DESCONOCIDO) -----------------------------
sigma.test(X, sigma = sigma, alternative = "", conf.level = 1-alpha)
################################################################################
## X: Vector donde tengo guardados los datos ##
## mu: valor de mu que se quiere testear/conocido ##
## sigma: desviación estándar conocida/testeo ##
## alternative: tipo de prueba alternativa (less, greater, two.sided) ##
## conf.level:(1-alpha) ##
################################################################################
## TEST DE P PARA BERNOULLI ----------------------------------------------------
prop.test(x=80, # cuantos 1
n=150, # cuantos datos totales
, alternative = "greater",
correct=FALSE) # siempre poner FALSE