Logo Facultad de Matemáticas
EPG3308: Computación Estadística
Diapositivas del Curso

Profesor: Hernán Robledo Araya (harobledo@uc.cl)
Ayudante: Josefa Silva Muñoz (josefa.silva@alumni.uc.cl)

Primer Semestre - 2025

Índice






EPG3308: Computación Estadística

Clase 01: Introducción a R

Profesor: Hernán Robledo Araya (harobledo@uc.cl)
Ayudante: Josefa Silva Muñoz (josefa.silva@alumni.uc.cl)

Primer Semestre - 2025

¡Bienvenidos al Magíster en Estadística!

magister

¡Y al Curso de Computación Estadística!

malla

EPG3308 Computación Estadística

Profesor
Hernán Robledo Araya

hernan

Ayudante
Josefa Silva Muñoz

josefa

¿Computación Estadística?

Aprender a utilizar un Programa para realizar Análisis Estadísticos.



Página Web del Curso


Metodología de Aprendizaje

  1. Asistir a clases.
  2. Participar de las actividades en clases para practicar.
  3. Prepararse para rendir laboratorios con mínimo apoyo.
  4. Realizar tareas desde la casa con todo el material disponible.

Computación
Estadística

En Estadística,

  • Recolectamos datos
  • Organizamos datos
  • Analizamos datos
  • Interpretamos datos
  • Inferimos sobre los fenómenos

¿Para qué?

Tomar Decisiones

¡Necesitamos un programa para hacer todo esto!

Formulario de conocimientos de programas para estadística

En este curso veremos:


R es un Lenguaje de Programación diseñado específicamente para análisis estadístico.

Glosario de Programación

  • Programación: Acción y efecto de programar.

  • Programar: Proceso de crear instrucciones para un computador de modo que este ejecute las instrucciones establecidas.

  • Lenguaje de Programación: dialecto específico utilizado para programar.

    • En Chile se habla español, como en R se habla en lenguaje… ¡R!
    • El lienzo donde el programador escribe sus instrucciones es denominado Código o Script.
  • Sintaxis: son las reglas del lenguaje de programación sobre cómo estructurar las palabras de este lenguaje para que sea funcional.

Dinámica de Programación

  • Humano escribe código,
    • Humano entrega código al programa (R en este caso),
      • Programa ejecuta las instrucciones correctamente.
        • Humano es feliz 😁

Dinámica Realista de Programación

  • Humano escribe código,
    • Humano entrega código al programa,
      • Programa lo rechaza por contener errores de escritura,
        • Humano entrega código corregido,
          • Programa vuelve a rechazar ,
            • Humano entrega código corregido,
              • Programa vuelve a rechazar ,
                • Humano entrega código corregido,
                  • Programa vuelve a rechazar ,
                    • Humano entrega código corregido,

Ejemplo de un código en R


notas <- c(5.1, 4.2, 6.3, 5.9)
promedio <- mean(notas)
print(paste("Nota Final en EPG3308:", promedio))

if(promedio < 4.0){
  print("¡Oh no! He reprobado el curso :( ")
} else{
  print("Facilito el curso :) ")
}


¿Qué hará este código?

¿Por qué usar R?

  1. Es gratis.
  2. Liviano y disponible en múltiples plataformas.
  3. Flexibilidad para construir procesos complejos.
  4. Rápido y eficiente en ejecutar sus tareas.
  5. Programa de Código abierto.
  6. Herramientas básicas y avanzadas para manipulación de datos.
  7. Herramientas básicas y avanzadas para estadística.
  8. Comunidad construye nuevas librerías.
  9. Poderosas herramientas gráficas.

¿Cómo se aprende a programar en u otro lenguaje?


  1. Aprendiendo la sintaxis y el dialecto del lenguaje de programación.
  2. Familiarizándonos resolviendo tareas sencillas.
  3. Resolviendo problemas interesantes.
  4. ¡Equivocándonos mil y un veces!

Corregir los errores enseña más que cien cursos

Hoy aprender a programar es más fácil que nunca

¿Por qué usar R y no Python, o Julia, u otro lenguaje?

  • Python requiere librerías extras para algunos procedimientos estadísticos básicos.
  • R dispone de métodos estadísticos avanzados:
    • Modelos Lineales Generalizados
    • Análisis de Series de Tiempo
    • Métodos Bayesianos

Nota

Python o Julia siguen siendo excelentes opciones para estadística clásica.

Instalar

Página Oficial


Escoger el repositorio chileno para descargar R.


  • Tras la descarga, instalar programa dejando opciones por defecto.
  • En macOS, el procedimiento es equivalente.
  • Para abrir R, ingresar R 4.3 en el buscador.

Interfaz Gráfica mejorada para R










Página Web         Página Web

¡Actividad Bonificada!

  1. Instale R y R Studio.
  2. Desde R Studio, crear un nuevo código y guardarlo bajo algún nombre en alguna carpeta.
  3. Dentro del código creado, escriba comentarios anteponiendo cada una con un símbolo #.
# !Esto es un comentario!
##### ¡Esto tambien es un comentario!
# Copiar desde el boton en la esqina superior derecha de este cuadro.
  1. Escriba en el código lo que ha aprendido durante esta sesión y aquello que le causa curiosidad del curso.
  2. Guarde el archivo y subir a Actividad Bonificada 1 en la sección de Tareas de Canvas.






EPG3308: Computación Estadística

Clase 02: Uso de R Básico

Profesor: Hernán Robledo Araya (harobledo@uc.cl)
Ayudante: Josefa Silva Muñoz (josefa.silva@alumni.uc.cl)

Primer Semestre - 2025

¿Cómo se aprende a programar en u otro lenguaje?


  1. Aprendiendo la sintaxis y el dialecto del lenguaje de programación.
  2. Familiarizándonos resolviendo tareas sencillas.
  3. Resolviendo problemas interesantes.
  4. ¡Equivocándonos mil y un veces!

Como ejecutar código en R











  • Atajo del Teclado: Control + Enter
  • Para código escrito en Consola tan solo presionar Enter.

R La Calculadora

R como Calculadora

Suma con + y Resta con -

1 + 1
[1] 2
10 + 20
[1] 30
-5 + 50
[1] 45
10 - 2
[1] 8
5 - 5
[1] 0
-1 - 10 - 100
[1] -111

R como Calculadora

Multiplicación y División

-5 * 6
[1] -30
3 / -2
[1] -1.5

Potencias y Raíces

2**2 
[1] 4
-1^2
[1] -1
2^(1/2) # Raíz cuadrada
[1] 1.414214
sqrt(-1) # NaN = Not a Number
[1] NaN

R como Calculadora

  • El orden en que se aplican las operaciones sigue las reglas de la matemática.
    • Usar paréntesis () para agrupar sus operaciones y salir de duda.


  • Orden:
    1. Paréntesis
    2. Exponenciación y raíces
    3. Multiplicación y división (de izquierda a derecha)
    4. Suma y resta

R como Calculadora

  • El orden en que se aplican las operaciones sigue las reglas de la matemática.
    • Usar paréntesis () para agrupar sus operaciones y salir de duda.
1 + 2 * 2
[1] 5
1 + (2 * 2)
[1] 5


-1 * 2^3
[1] -8
-1 * (2^3)
[1] -8

R como Calculadora

  • El orden en que se aplican las operaciones sigue las reglas de la matemática.
    • Usar paréntesis () para agrupar sus operaciones y salir de duda.
3 - 2 / 5 * 5
[1] 1
3 - ( (2 / 5) * 5 )
[1] 1


-5 / 7 + 2 * 2
[1] 3.285714
(-5 / 7) + (2 * 2)
[1] 3.285714

¡Actividad de Cinco Minutos!

  1. Transforme a grados Farenheit los 26 grados Celsius pronosticados para mañana.

\[F = 32 + C \times \frac{9}{5}\] 2. Si usted obtuvo un promedio de notas de laboratorios de \(3.5\), un promedio de tareas de \(4.2\), y un examen de \(4.5\), ¿aprueba el curso?

¡Actividad de Cinco Minutos!

  1. Sea \(p\) el puntaje obtenido en una evaluación que tiene \(p_{max}\) puntos como máximo. La nota que un estudiante obtiene bajo cualquier porcentaje de exigencia \(Ex\) se calcula como sigue:
  • Si se obtiene un puntaje \(p < E\cdot p_{max}\), \[\text{Nota} = 1 + 3\cdot\frac{1}{Ex}\cdot\frac{p}{p_{max}}.\]

  • Mientras que si se obtiene un puntaje \(p \geq E \cdot p_{max}\), \[\text{Nota} = 4 + 3\cdot\frac{p - Ex \cdot p_{max}}{p_{max}\cdot ( 1- Ex)}.\]

¿Qué nota obtuvo usted si obtuvo 25 puntos en una prueba de 30 puntos como máximo bajo una exigencia del 80%?

¡Actividad de Cinco Minutos!

  1. (para conocedores de funciones y condicionales) Construya una función que entregue la nota obtenida en una evaluación tras recibir como argumentos el puntaje obtenido, el puntaje total de la evaluación, y el porcentaje de exigencia.
  • Explore las escalas de notas bajo el 50%, 60%, y 70%.

Fuente: J. Pumarino

Texto en R

Escribir e Imprimir Texto en Consola

### ¡Este codigo hace calculos muy importantes!

# Operacion 1
#                    Operacion 2
#         Operacion 3
#             .
#             .     Operacion hecha con IA
#  Error parcheado           
#             .
#             .
#          Operacion 500.

 
# Anunciar finalizacion con exito del proceso:
print("¡Proceso terminado!")

Sintaxis para texto

  • Todo carácter que deseen utilizarse como texto se escribe entre comillas dobles o entre comillas simples.
"¡Hola mundo!"

'¡Tambien sirvo con comillas simples!'

"19.792.578-5"

"(5 + 3/2)^2"

'print("¡Hola mundo!")'
  • Texto así no tiene mayor uso.
  • Comunicar a un lector de código a través de comentario:
## ¡Recorre este código cuan ave aletea en la vastedad!

Impresión de texto en consola

  • Función cat(): concatena texto e imprime en la consola.
    • cat de concatena.
cat("¡Hola mundo!")
¡Hola mundo!


# Una coma separa cada texto, que luego la funcion los une en uno solo.
cat("Este es uno de" , "mis primeros textos" , "impresos.") 
Este es uno de mis primeros textos impresos.


cat("(5 + 3/2)^2")
(5 + 3/2)^2


cat(No se me ocurre qué más decir)
Error in parse(text = input): <text>:1:8: unexpected symbol
1: cat(No se
           ^


cat("Mi nota es \n 1 + 6*(7.2/10) =", 1 + 6*(7.2/10))
Mi nota es 
 1 + 6*(7.2/10) = 5.32
  • Notar que \n hace un salto de línea.
  • Notar que puede recibir una operación e imprime el resultado.
cat('El resultado de la operacion es = ', mil)
Error: objeto 'mil' no encontrado
cat('El resultado de la operacion es =', 1000
Error in parse(text = input): <text>:2:0: unexpected end of input
1: cat('El resultado de la operacion es =', 1000
   ^

cat() es una función.

  • Internamente ejecuta un procedimiento que puede depender o no de los elementos entregados por el usuario.
    • Argumentos de una función: lo que debe recibir para que una función funcione.
cat(Argumento 1, Argumento 2, Argumento 3, ...)


cat("En", "la", "clase","de", "hoy", "veremos", "la", "funcion","cat")
En la clase de hoy veremos la funcion cat

Función print(x): si x es texto, (sólo) lo imprime. Si x es otro objeto, imprime los atributos definidos a ser impresos.

  • Es menos flexible que cat para manipular texto.
print("¡Jelou Mundo!")
[1] "¡Jelou Mundo!"


print(cat) # Imprime el codigo de cat.


print("Este es uno de" , "mis primeros textos" , "impresos.")
Error in print.default("Este es uno de", "mis primeros textos", "impresos."): invalid printing digits -2147483648

Función paste(x, y,...): pega los textos x y y separándolos por un espacio.

  • Similar a cat, pero cat sólo imprime y devuelve texto impreso.
Texto1 <- "Este es mi texto"
Texto2 <- "y de nadie más!"


TextoUnido <- cat(Texto1, Texto2)
Este es mi texto y de nadie más!
print(TextoUnido) # No lo guarda!!
NULL
TextoUnido <- paste(Texto1, Texto2)
print(TextoUnido)
[1] "Este es mi texto y de nadie más!"

¡Actividad de Cinco Minutos!

  1. Usando cat, concatene en una única frase el siguiente poema de Pablo Neruda:

Punto

No hay espacio más ancho que el dolor,

no hay universo como aquel que sangra.

  1. En un único cat y con todo el poema en un único texto, use \n para que al imprimir el poema en la consola se haga un salto de línea tras la coma del poema. Observe qué ocurre si usa print para imprimir el mismo texto.

¡Actividad de Cinco Minutos!

  1. En un único cat y con todo el poema en un único texto, use \n para que al imprimir el poema en la consola se haga un salto de línea tras cada salto incluido por el poeta.

Océano

Cuerpo más puro que una ola,

sal que lava la línea,

y el ave lúcida

volando sin raíces.

Creando Objetos en R

  • Definir cantidades que puedan ser operadas posteriormente en el código.
  • Sintaxis:

Nombre <- Elemento Almacenado como "Nombre"

FondosTotales <- 2234031
##    Se gasto 120000 en impresiones
##                     Se gastaron 120000 en renovacion de equipos
##                     Se gastaron 30000 en chocmans
##   Ingresaron 944000 por pago de clientes
##              .
##              .
##        Otras operaciones importantes
##              .
print(FondosTotales)
[1] -25900
  • Objeto FondosTotales recibió cambios (ficticios) y tiene nuevo valor.
  • Se puede usar = en vez de <- pero puede llevar a confusiones.

  • Definir objetos mejora la legibilidad del código.

Sin objetos definidos

print(4 + 3 * (25 - 0.80*30)/(30 * (1 - 0.80)))
[1] 4.5

Con objetos definidos

puntaje <- 25
puntajeMax <- 30
Exigencia <- 0.80

Nota <- 4 + 3 * (puntaje - Exigencia*puntajeMax)/(puntajeMax * (1 - Exigencia))
print(Nota)
[1] 4.5

Acerca nombres para objetos:

  • No pueden tener espacios dentro del nombre. Ej: mi objeto <- 5

  • No pueden llevar ciertos carácteres especiales. Ej: valor$ <- 5, valor& <- 5

  • No pueden iniciar con un número. ej: 1objeto <- 5

  • Se recomienda no usar palabras reservadas para otras funciones u otros objetos. Ej: print <- 5

¡Nombres de los objetos son sensible a mayúsculas y otras puntuaciones!

Valor <- 1000
TEXTO <- "Esto es un texto!"
datos_2 <- mtcars # Tabla de Datos guardada en R.
lstas <- list()
secuencias  <- c(10, 400, 200, 500)

print(valor)
Error: objeto 'valor' no encontrado
print(texto)
Error: objeto 'texto' no encontrado
print(datos2)
Error: objeto 'datos2' no encontrado
print(listas)
Error: objeto 'listas' no encontrado
print(secuencia)
Error: objeto 'secuencia' no encontrado

Buenas prácticas para asignación de nombres

  1. Usar nombres descriptivos.
a <- 4.3 # ¿?
NotaTarea1 <- 4.3
  1. Usar sólo una convención de nombramiento para todo el código:
  • Camel Case: nombreObjeto
  • Snake Case: nombre_objeto
  • Pascal Case: NombreObjeto
  1. Evitar abreviaciones vagamente informativas. Ej: var1, a1, etc.
  1. Usar patrones coherentes en el código.
total_ventas <- 1000
ventas_totales <- 1000 # Se rotó la posición de totales! Malo.
  1. Añadir contexto si hace falta.
venta <- 200  # ¿?
ventaDiaria <- 2
ventaAnual <- 1000
  1. Usar prefijos o sufijos para caracterizar.
tabla_ventas
vector_productosVendidos
valor_dineroRestante
  1. ¡Cualquier otra cosa que ayude a le legibilidad!

Funciones en R

Funciones: bloque de código que posee un nombre asignado y realiza una tarea específica.

Fuente de Imágen

  • Usualmente recibe de entrada elementos que definen el proceso a realizar.
    • Los Argumentos de la función son estos objetos.
  • Puede o no entregar un objeto de salida.

Sintaxis para crear funciones

NombreFuncion <- function(Argumento1, Argumento2, ..., ArgumentoK){
  
  return(Objeto) # Opcional
}

## Ejecutando la funcion:
NombreFuncion(Argumento1 = ..., Argumento2 = ...)

Sintaxis para crear funciones

NombreFuncion <- function(Argumento1, Argumento2, ...){
  
  ## No dar ningun argumento tambien es opcion.
  
  ## Aqui dentro se escriben todo el procedimiento
  ## que se desea ejecutar cuando NombreFuncion es llamada.
  
  ## Si se desea que la funcion retorne un 
  ## objeto tras su ejecucion:
  return(Objeto)
  
  ## Tambien es opcion que no entregue nada.
}
  • Considere la función Funcion(Argumento, X_Y, Z).

  • Suponga, para este caso, que para que la función funcione, los tres argumentos deben recibir valores numéricos.

  • Cualquiera de las siguientes opciones son sintaxis válidas en R:

Funcion(100, 200, 300)

Funcion(Argumento = 100, X_Y = 200, Z = 300)

Funcion(Arg = 100, X = 200, Z = 300)

Funcion(A = 100, 200, 300)

Ejemplos:

  1. Función que imprime el poema de Neruda cuando es llamada.
Poema <- function(){
  cat("No hay espacio más ancho que el dolor, \nno hay universo como aquel que sangra.")
}


Poema()
No hay espacio más ancho que el dolor, 
no hay universo como aquel que sangra.

Ejemplos:

  1. Función que transforma grados Celsius a Farenheit.
CelsiusFarenheit <- function(Celsius){
  Farenheit <- 32 + Celsius * 9/5
  
  Salida <- paste(Celsius, "grados Celsius son", Farenheit, "grados Farenheit.")
  return(Salida)
  
}
CelsiusFarenheit(0) # Congelamiento del agua
[1] "0 grados Celsius son 32 grados Farenheit."
CelsiusFarenheit(Celsius = 30)
[1] "30 grados Celsius son 86 grados Farenheit."
CelsiusFarenheit(C = 100)  # Ebullicion  del agua
[1] "100 grados Celsius son 212 grados Farenheit."
CelsiusFarenheit(C = 220)  # Temperatura para hornear un pancito
[1] "220 grados Celsius son 428 grados Farenheit."

Ejemplos:

  1. Funcion que calcula el promedio entre los cuatro laboratorios de este curso.
PromedioLaboratorios <- function(Lab1, Lab2, Lab3, Lab4){
  
  Promedio <- (Lab1 + Lab2 + Lab3 + Lab4)/4
  
  Promedio # Equivalente a solo escribir return(Promedio)
}
PromedioLaboratorios(1.0, 7.0, 6.0, 5.5)
[1] 4.875
PromedioLaboratorios(6.0, 5.4, 7.0, 4.3)
[1] 5.675
PromedioLaboratorios(7.0, 7.0, 6.0, 7.0)
[1] 6.75

¡Actividad Bonificada!

  1. Construya una función que reciba de argumentos las notas de la Tarea 1 y 2 y entregue como salida el mensaje Promedio de Laboratorios = NOTA OBTENIDA.

  2. Construya una funcion que reciba de argumentos las notas de los laboratorios 1, 2, 3, y 4, las tareas 1 y 2, y el examen, y que calcule la nota final del curso. La nota final debe entregarla junto a un mensaje acorde.

  3. Muestre evidencia de que realizó el resto de actividades de esta clase.

  • Basta responder hasta aquí para haber completado la actividad bonificada.

. . .

Continúa….

¡Actividad Bonificada!

  1. Escriba una función que tome como argumentos una nota y un porcentaje de exigencia, y que devuelva la nota ajustada a un nuevo porcentaje de exigencia, asumiendo que la nota original corresponde a un 50% de exigencia.

  2. Escriba una función que reciba tantos argumentos como evaluaciones haya en el curso, además de un porcentaje de exigencia. La función deberá recalcular la nota final del curso ajustándola al porcentaje de exigencia indicado, asumiendo que las evaluaciones originales corresponden a un 50% de exigencia.

Estructura de Datos en R

  • Sabemos añadir un único elemento a un objeto
notaEstudiante1 <- 5.4
notaEstudiante2 <- 6.0
  • Quisiéramos añadir múltiples elementos a un único objeto.

Vectores de Datos

  • Función c() (combine) para crear y guardar un vector:

Nombre <- c(Elemento1, Elemen2, Elem3, ...)

  • Ejemplo:
NotasEPG3308 <- c(7.0, 6.9, 7.0, 6.9, 6.8, 7.0)
Estudiantes <- c("Hernan", "Andrea", "Ximena", "Miguel")
  • Es posible asignarle un nombre a los elementos del vector:
Asistencia <- c("Hernan" = 1, "Andrea" = 0, 1, 1)
print(Asistencia)
Hernan Andrea               
     1      0      1      1 
  • Si un vector trae sólo números, R lo identificará como un vector numérico:
NotasEPG3308 <- c(7.0, 6.9, 7.0, 6.9, 6.8, 7.0)
class(NotasEPG3308) # Funcion class() devuelve la "clase" (tipo de objeto).
[1] "numeric"
  • Basta con que haya un elemento que sea carácter/texto para que el vector completo se transforme a texto.
NotasEPG3308 <- c(7.0, 6.9, 7.0, 6.9, 6.8, "7.0")
class(NotasEPG3308) 
[1] "character"

Funciones útiles de R para crear vectores:

  • a:b: crea secuencia de números enteros desde a hasta b.
1:10
0:5
-10:-2
-5:-8
  • seq(from, to, by, ...): crea secuencia numérica desde from hasta to dando saltos de según by.
seq(from = 1, to = 10, by = 1)
seq(from = 1, to = 100, by = 10)
seq(from = 1, to = -10, by = -2)
seq(from = 1, to = 100, length.out = 15) # length.out en vez de by para solicitar largo de secuencia

Funciones útiles de R para crear vectores:

  • rep(x, times, length.out, each): repite el o los valores x dependiendo de si se entrega times, length.out, o each.
    • times: repite x un número times de veces.


rep(x = 1, times = 4)
[1] 1 1 1 1
rep(x = c(1,2), times = 4)
[1] 1 2 1 2 1 2 1 2

rep(x, times, length.out, each):

  • each: repite cada elemento de x un número each de veces.
rep(x = 1, each = 4)
[1] 1 1 1 1
rep(x = c(1,2), each = 4)
[1] 1 1 1 1 2 2 2 2


  • length.out: repite x hasta que vector sea de largo length.out.
rep(x = 1, length.out = 4)
[1] 1 1 1 1
rep(x = c(1,2), length.out = 4)
[1] 1 2 1 2

Ayuda de R

help(funcion) - ?funcion

Estructura de Documentación de Ayuda






EPG3308: Computación Estadística

Clase 03: Estructura de Datos

Profesor: Hernán Robledo Araya (harobledo@uc.cl)
Ayudante: Josefa Silva Muñoz (josefa.silva@alumni.uc.cl)

Primer Semestre - 2025

Hoy veremos:

  1. Operaciones con Vectores
  2. Matrices y Operaciones con Matrices
  3. Listas y Operaciones con Matrices
  4. Cuadros de Datos (Data Frames)
  5. Lectura de Datos

1. Vectores de Datos

  • Función c() (combine) para crear y guardar un vector:

Nombre <- c(Elemento1, Elemen2, Elem3, ...)

  • Funciones: seq y rep.

Veremos:

  1. Acceder a elementos
  2. Funciones para vectores
  3. Matemática Vectorizada
  4. Cálculos Matemáticos
  • Acceso a elementos de vector con vector[posicion]:

  • Acceder a un único elemento:

Notas <- c(4.0, 4.5, 4.7, 5.2, 6.0, 7.0)

Notas[1] # Primer elemento
[1] 4
Notas[2] # Segundo elemento
[1] 4.5
  • Acceder a múltiples elementos: vector de índices.
indices <- c(1,2)
Notas[indices]
[1] 4.0 4.5
indices <- c(3,6)
Notas[indices]
[1] 4.7 7.0
  • Acceso a elementos de vector con vector[posicion]:
  • Todos excepto un elemento: vector[-posicion]
Notas[-1] # Todos excepto primer elemento
[1] 4.5 4.7 5.2 6.0 7.0
Notas[-6] # Todos excepto sexto elemento
[1] 4.0 4.5 4.7 5.2 6.0
  • Acceder a todos excepto un subconjunto:
indices <- c(1,2)
Notas[-indices] # Elementos 3, 4, 5 y 6 
[1] 4.7 5.2 6.0 7.0
pares <- seq(2,6,2)
Notas[pares]
[1] 4.5 5.2 7.0

Modificar o añadir elementos de un vector

vector[indices] <- vector2

vec <- c() # Vector vacío
vec # Equivalente a hacer print(vec1)
NULL
vec[1] <- 4.5
vec
[1] 4.5
vec[5] <- 6.0
vec
[1] 4.5  NA  NA  NA 6.0
vec[2:4] <- c(5.0, 5.1, 5.2)
vec
[1] 4.5 5.0 5.1 5.2 6.0
vec[c(1, 5, 8:9)] <- 1 # Reemplazar todo por valor 1
vec
[1] 1.0 5.0 5.1 5.2 1.0  NA  NA 1.0 1.0

Funciones útiles:

  • length(vector): entrega el numero de elementos contando NAs.
  • sort(vector): ordena los elementos del vector.
  • rank(vector): entrega el ranking de los elementos según su valor.
  • rev(vector): invierte el orden de los elementos del vector.
  • unique(vector): entrega un vector en que se eliminan los valores repetidos de vector.
  • table(vector): tabla de frecuencia de los elementos de vector.

Tip

Tip: Cuando necesiten hacer algo específico pregúntense:

¿existe una función que ya lo haga?

Matemática con Vectores:

  • Sumas, restas, productos, divisiones, potencias y otras operaciones sí funcionan entre vectores.

  • Operación entre Vector y Escalar

vec <- c(1, 2, 4)
vec^2
[1]  1  4 16
  • Operación entre Escalar y Vector
vec <- c(1, 2, 4)
5^vec
[1]   5  25 625
  • Operación entre Vector y Vector
vec1 <- c(1, 2, 3);   vec2 <- c(0, 1, 2)
vec1 ^ vec2
[1] 1 2 9
  • Esta cualidad de R es llamada Cálculos Vectorizados.

  • Más eficientes que recorrer cada elemento, aplicar la operación deseada, y continuar con el siguiente elemento.

mivector <- c(4.8, 5.3, 3.8, 6.1, 3.9, 4.4, 2.6, 1.8, 0.4, 0.5)

## Funcion que eleva al cuadrado cada elemento de un vector
vectoralcuadrado <- function(){
  resultado <- c()
  for(i in 1:10){
    resultado[i] <- mivector[i]^2
  }
  return(resultado)
}

## Comparacion en nanosegundos de tiempos de computo entre
## calculo vectorizado y escalar
microbenchmark::microbenchmark(mivector^2, vectoralcuadrado(), times = 1000)

Reciclaje de elementos:

  • Cuando se aplica una operación entre vectores de distintos tamaños, R comienza a reciclar elementos del vector más corto.
vec1 <- 1:20 # Vector de largo 20
vec2 <- rep(c(0,1), times = 5) # Vector de largo 10

length(vec1*vec2)
[1] 20
vec1*vec2
 [1]  0  2  0  4  0  6  0  8  0 10  0 12  0 14  0 16  0 18  0 20

Advertencia

Preferir no reciclar. Operar con vectores de igual tamaño.

Matemática con Vectores

  • sum(vector): Calcula la suma de todos los elementos.
  • prod(vector): Calcula el producto de todos los elementos.
  • mean(vector): Calcula el promedio entre los elementos.
  • median(vector): Encuentra la mediana de los elementos.
  • var(vector): Calcula la varianza del vector.
  • sd(vector): Calcula la desviación estándar.
  • summary(vector): calcula múltiples estadísticas descriptivas.
  • min(vector): Encuentra el valor mínimo.
  • max(vector): Encuentra el valor máximo.
  • quartile(vector, prob): entrega el cuartil que acumula prob del vector dado.

¡Actividad de Diez Minutos!

El archivo DataC03.RData se carga con el comando load("DataC03.RData") y contiene tres vectores con información de una muestra de estudiantes y sus puntajes en una prueba de competencias matemáticas. Los vectores tienen los nombres edad, comuna y puntuacion.

  1. Corrija el registro de la posición 97 en edad. Cree un nuevo cetor llamado edad2. ¿Habrá otro valor mal codificado?

  2. Siguiendo las recomendaciones de asignaciones de nombres a objetos, cree tres vectores con las edades de los estudiantes y tres vectores con las puntuaciones, agrupados por comuna.

¡Actividad de Diez Minutos!

  1. Calcule estadísticas descriptivas (promedio, mediana, desviación estándar, mínimo y máximo) de las edades de los estudiantes agrupadas por comuna.

  2. Calcule estadísticas descriptivas (promedio, mediana, desviación estándar, mínimo y máximo) de las puntuaciones obtenidas por los estudiantes agrupadas por comuna.

2. Matrices

  • Arreglo bidimensional (tienen filas y columnas) de datos.

\[ \begin{pmatrix} 3 & 17 & 8 & 12 \\ 15 & 4 & 22 & 7 \\ 9 & 6 & 13 & 19 \\ \end{pmatrix} \]

  • Usadas en matemáticas (y estadística) para formalizar cálculos de múltiples números.

Note

Un vector es una matriz de una única columna.

2. Matrices

matrix(vector, nrow, ncol, byrow): crea una función en base a vector con nrow filas, ncol columnas, y rellenada por filas o columnas según byrow.

\[ \begin{pmatrix} 3 & 17 \\ 15 & 4 \\ \end{pmatrix} \]

matrix(c(3, 15, 17, 4), nrow = 2) # Basta con indicar numero de filas
     [,1] [,2]
[1,]    3   17
[2,]   15    4

2. Matrices

Ejemplo 1:

matrix(c(3, 15, 9, 21,
        17, 4, 6, 10,
        8, 22, 13, 5,
        12, 7, 19, 16), 
        nrow = 4, ncol = 4, byrow = TRUE)
     [,1] [,2] [,3] [,4]
[1,]    3   15    9   21
[2,]   17    4    6   10
[3,]    8   22   13    5
[4,]   12    7   19   16

Ejemplo 2:

matrix(1:24, nrow = 2, byrow = TRUE)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,]    1    2    3    4    5    6    7    8    9    10    11    12
[2,]   13   14   15   16   17   18   19   20   21    22    23    24
  • Nombre para filas o columnas: row.names y col.names
A <- matrix(1:24, nrow = 2, byrow = TRUE)
colnames(A) <- paste0("C", 1:12)
rownames(A) <- c("Fila1", "Fila2")
A
      C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12
Fila1  1  2  3  4  5  6  7  8  9  10  11  12
Fila2 13 14 15 16 17 18 19 20 21  22  23  24
  • Construir matrices pegando vectores: cbind y rbind
NotasL1 <- c(5.0, 3.4, 6.0, 5.0)
NotasL2 <- c(4.5, 3.9, 5.8, 5.3)
Notas <- cbind(NotasL1, NotasL2) # Column bind
Notas
     NotasL1 NotasL2
[1,]     5.0     4.5
[2,]     3.4     3.9
[3,]     6.0     5.8
[4,]     5.0     5.3

¡Actividad de Cinco Minutos!

Utilice los datos del archivo Data03.RData para hacer lo siguiente:

  1. Crear una matriz de dos columnas usando la función matrix que contenga los datos de los vectores edad y puntuacion. Coloque nombres adecuados a las columnas de la matriz.

  2. Crear una matriz de tres columnas usando la función cbind que contenga los datos de los vectores edad, comuna, y puntuacion. Coloque nombres adecuados a las columnas de la matriz. ¿Qué se observa en la matriz resultante?

Matemática elemental con matrices

  • Igual que con vectores, se pueden aplicar las operaciones matemáticas elementales entre matrices.
A <- matrix(c(1,0,1,1), nrow = 2)
B <- matrix(c(-2,-1,0,1), nrow = 2)
vec <- c(1,2)

1 + A
2*A
A^2

A + vec # Aplica operacion a cada columna de A
A * vec
A+B
  • Más operaciones en la Clase 08: Álgebra Lineal

Funciones por columnas o filas con matrices

  • colSums(matriz): Sumar datos por cada columna.
  • rowSums(matriz): Sumar datos por fila columna.
  • colMeans(matriz): Promediar datos por cada columna.
  • rowMeans(matriz): Promediar datos por cada fila.
  • apply: Aplicar una función cualquier por fila o columnas.

apply(matriz, fila_o_columna, funcion)

Funciones por columnas o filas con matrices

apply(matriz, fila_o_columna, funcion_a_aplicar)

A <- matrix(c(1,0,1,1,-1,2), ncol = 2) 

apply(A, 
      MARGIN = 1, # 1 = aplicar operacion por filas
      FUN = mean) # Equivalente a hacer rowMeans
[1]  1.0 -0.5  1.5
apply(A, 
      MARGIN = 2, # 2 = aplicar operacion por columnas
      FUN = sd) # Calcular desviacion estandar por columnas
[1] 0.5773503 1.5275252
apply(A, 
      MARGIN = 2, # 2 = aplicar operacion por columnas
      FUN = sd) # Calcular desviacion estandar por columnas
[1] 0.5773503 1.5275252

Acceder a elementos de matrices

  • matriz[filas, columnas]
    • Misma idea que con vectores.
  • Ejemplos:
A <- matrix(c(1,0,1,1,-1,2), ncol = 2) 

A[1,1]
A[2,1]
A[1:3, 1]
A[c(1,3), c(1,2)]
A[1,] # Primera fila
A[,2] # Segunda columna
A[-1,] # Todo menos primera fila
A[-2,-3] # Todo menos segunda fila y segunda columna

Funciones útiles para matrices

  • dim(matriz): entrega el número de filas y columnas de una matriz.
  • nrow(matriz) y ncol(matriz): lo mismo que la función anterior.
  • diag(matriz): entrega un vector con los elementos ubicados en la diagonal de la matriz.

¡Actividad Bonificada!

El archivo Clase03_notas.RData contiene una matriz con las notas de los estudiantes de cierto curso.

  1. Calcule el promedio de las evaluaciones para cada estudiante.
  2. Calcule para cada evaluación el promedio de notas.
  3. Calcule mínimo, máximo, y desviación estándar de las notas de cada evaluación.
  4. Muestre evidencia de haber realizado el resto de actividades de la clase.

Listas

  • Colección de elementos de distinta naturaleza (numérico, texto, tablas, etc.)

  • Crear lista con list()

  • Acceder a los elementos con Lista[[ elemento ]]

  • Si elementos tienen nombres, pueden ser llamados con Lista$Nombre.

3. Listas

Lista <- list(Notas = c(5.0, 5.5, 6.5, 7.0),
              Alumnos = 4,
              Nombres = c("H", "A", "R", "T"))
  • Acceder a elementos de la lista:
Lista$Nota
[1] 5.0 5.5 6.5 7.0
Lista[[2]]
[1] 4
Lista$Nombres
[1] "H" "A" "R" "T"

3. Listas

  • Añadir elemento a la lista:
Lista[[4]] <- c(1,1,1,0) 
Lista[[4]]
[1] 1 1 1 0
# Añadir elemento con nombre
Lista$TieneBonificacion <- c(1,1,1,1) 
Lista$TieneBonificacion
[1] 1 1 1 1
  • Se pueden combinar elementos de cualquier naturaleza.
# Añadir elemento con nombre
Lista$TablaDatos <- cars
Lista$TablaDatos
   speed dist
1      4    2
2      4   10
3      7    4
4      7   22
5      8   16
6      9   10
7     10   18
8     10   26
9     10   34
10    11   17
11    11   28
12    12   14
13    12   20
14    12   24
15    12   28
16    13   26
17    13   34
18    13   34
19    13   46
20    14   26
21    14   36
22    14   60
23    14   80
24    15   20
25    15   26
26    15   54
27    16   32
28    16   40
29    17   32
30    17   40
31    17   50
32    18   42
33    18   56
34    18   76
35    18   84
36    19   36
37    19   46
38    19   68
39    20   32
40    20   48
41    20   52
42    20   56
43    20   64
44    22   66
45    23   54
46    24   70
47    24   92
48    24   93
49    24  120
50    25   85

3. Listas

  • lapply(Lista, Funcion) para aplicar una función a los elementos de una lista.
Lista$TablaDatos <- cars # Añadiendo tabla de nombre cars a la lista

lapply(Lista, class) # Aplica funcion "class" a elementos de la lista
$Notas
[1] "numeric"

$Alumnos
[1] "numeric"

$Nombres
[1] "character"

[[4]]
[1] "numeric"

$TieneBonificacion
[1] "numeric"

$TablaDatos
[1] "data.frame"

4. Data Frames

  • Matrices que combinan columnas de distintas naturalezas.
  • Comparte sintaxis de listas para acceder a columnas.
class(mtcars) # Tabla de datos cars
[1] "data.frame"
class(ToothGrowth) # Tabla de datos ToothGrowth
[1] "data.frame"
class(iris) # Tabla de datos iris
[1] "data.frame"
head(iris) # head() imprime primeras seis filas de la tabla
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

4. Data Frames

  • Acceder a clases de cada columna con str (structure):
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 ...
  • Acceder a variables con sintaxis tabla$variable
head(iris$Sepal.Length)
[1] 5.1 4.9 4.7 4.6 5.0 5.4
head(iris$Species)
[1] setosa setosa setosa setosa setosa setosa
Levels: setosa versicolor virginica

5. Lectura de Datos

  • Archivos .RData se leen con load("archivo.RData").

  • Otros archivos: asistente de carga de datos.

5. Lectura de Datos











  • From Text (readr) para archivos .txt y .csv.

5. Lectura de Datos










Tip

Copiar código de carga y pegarlo en el script.

5. Lectura de Datos






EPG3308: Computación Estadística

Clase 04: Operaciones Lógicas y Control de Flujo

Profesor: Hernán Robledo Araya (harobledo@uc.cl)
Ayudante: Josefa Silva Muñoz (josefa.silva@alumni.uc.cl)

Primer Semestre - 2025

Operaciones Lógicas

load("DataC04.RData")
head(base)
      Comuna Edad puntuacion
1 La Florida   13       49.2
2 La Florida   14      100.0
3      Macul   13       20.0
4 La Florida   14       57.6
5 La Florida   15       93.6
6 La Florida   14       79.2
  • ¿Cómo filtramos esta tabla según los estudiantes de La Florida?
baseLaFlorida <- base[base$Comuna == "La Florida", ]
head(baseLaFlorida,3)
      Comuna Edad puntuacion
1 La Florida   13       49.2
2 La Florida   14      100.0
4 La Florida   14       57.6

Operación Lógica

base$Comuna == "La Florida"

  • Operador lógico == evalúa qué elementos de base$Comuna son iguales a La Florida.
head(base$Comuna == "La Florida")
[1]  TRUE  TRUE FALSE  TRUE  TRUE  TRUE
  • Resultado: vector de TRUE y FALSE indicando en qué se cumple la condición.

  • Un vector de TRUE y FALSE puede usarse en conjunto con [] para filtrar.

Observaciones

  • TRUE y FALSE se pueden abreviar como T y F.

  • R interpreta TRUE y FALSE como un valor 1 y 0.

TRUE*TRUE + FALSE - TRUE
[1] 0
vector_logico <- c(T, T, T, F, F)
sum(vector_logico)
[1] 3
mean(vector_logico)
[1] 0.6
  • Vector de valores 0 y 1 a TRUE y FALSE
as.logical(c(1,0,0,1,1))
[1]  TRUE FALSE FALSE  TRUE  TRUE

Operadores Lógicos más comunes de R

Operador Descripción
== Igual a. Devuelve TRUE si ambos operandos son iguales.
!= Diferente de. Devuelve TRUE si los operandos son distintos.
> Mayor que. Devuelve TRUE si el operando de la izquierda es mayor.
< Menor que. Devuelve TRUE si el operando de la izquierda es menor.
>= Devuelve TRUE si el operando de la izquierda es mayor o igual.
<= Devuelve TRUE si el operando de la izquierda es menor o igual.
& AND lógico. Devuelve TRUE si ambos operandos son TRUE en cada posición.
| OR lógico. Devuelve TRUE si al menos uno de los operandos es TRUE en cada posición.
! Negación lógica. Devuelve TRUE si el operando es FALSE, y viceversa.

Ejemplos

  • Operador == y !=
a <- 5
a == 5
[1] TRUE
a != 5
[1] FALSE
  • Operación objeto == objeto está vectorizada.
c(14, 14, 13, 13, 13, 14, 13, 13, 12, 14) == 13
 [1] FALSE FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE
Edades1 <- c(12, 14, 13); Edades2 <- c(13, 14, 15)
Edades1 == Edades2
[1] FALSE  TRUE FALSE

¡Advertencia!

A pesar de que teóricamente dos números sean iguales, ¡¡computacionalmente pueden no serlo!!

\[(\sqrt{2})^2 = 2\]

a <- sqrt(2)^2
a == 2
[1] FALSE

😱😱😱

Error de Redondeo

Casos comunes de Errores de Redondeo

  • Uso de números irracionales
sqrt(3)^3 == 3
[1] FALSE
  • Sumas o restas entre números muy grandes y muy pequeños
1e16 + 1 - 1e16 # 1e16 = 1 * 10 ^ (16)
[1] 0
  • Números con representación binaria inexacta.
0.1 + 0.2 == 0.3
[1] FALSE

¿Por qué pasa esto?

  • Ciertos números (como 0.1 o 1/3) no tienen representación exacta en código binario.
  • No se pueden registrar los infinitos números decimales de un número irracional en un computador.
options(digits = 20) # digits por defecto = 7
sqrt(2)^2
[1] 2.0000000000000004441
sqrt(3)^2
[1] 2.9999999999999995559
0.1 + 0.2
[1] 0.30000000000000004441
0.3
[1] 0.2999999999999999889

Solución

Comparar números según una tolerancia.

\[\text{Si } |a - b| < \text{Tolerancia} \quad \Rightarrow \quad a \approx b \]

tolerancia <- 1e-10 # 1 * 10^(-10) = 0.0000000001
abs(sqrt(2)^2 - 2) # |a - b|: valor absoluto entre a y b
[1] 4.440892e-16
# ¿Es a lo suficientemente similar a b?
abs(sqrt(2)^2 - 2) < tolerancia
[1] TRUE
  • Operadores >, <, >=, <=.
3 > 2       # TRUE
[1] TRUE
5 <= 5      # TRUE
[1] TRUE
7 < 1       # FALSE
[1] FALSE


Edades <- c(20, 25, 28, 28, 30, 40, 41)
Edades >= 25
[1] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE


Edades <- c(20, 25, 28, 28, 30, 40, 41)
Edades > mean(Edades) # ¿Que edades son mayores a su promedio?
[1] FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE

¿Cómo evaluar que se cumplan múltiples condiciones?

Operador &

Condicion1 & Condicion2

## Aprueba curso si PromedioLab > 5.0   Y   PromedioTarea > 4.0
PromedioLab <- 5.2;    PromedioTarea <- 3.9
(PromedioLab > 5.0) & (PromedioTarea > 4.0)
[1] FALSE


PromedioLab <- 5.7;    PromedioTarea <- 4.1
(PromedioLab > 5.0) & (PromedioTarea > 4.0)
[1] TRUE


FALSE & TRUE & TRUE & TRUE & TRUE & TRUE & TRUE & TRUE & TRUE & TRUE & TRUE & TRUE & TRUE & TRUE & TRUE & TRUE & TRUE & TRUE & TRUE & TRUE & TRUE & TRUE & TRUE & TRUE & TRUE
[1] FALSE

¿Cómo evaluar que se cumplan al menos una condición?

Operador |

Condicion1 | Condicion2

## Se exime Examen si PromedioLab > 5.5   O   PromedioTarea > 4.0
PromedioLab <- 5.2;    PromedioTarea <- 3.9
(PromedioLab > 5.5) | (PromedioTarea > 4.0)
[1] FALSE


PromedioLab <- 5.7;    PromedioTarea <- 4.1
(PromedioLab > 5.5) | (PromedioTarea > 4.0)
[1] TRUE


TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE
[1] TRUE

Negación Lógica con !

  • Suponer filtramos datos tales que

Comuna == "San Joaquin" & Edad >= 14

head(base[base$Comuna == "San Joaquin" & base$Edad >= 14,],4)
        Comuna Edad puntuacion
11 San Joaquin   14         25
15 San Joaquin   14         38
31 San Joaquin   14         50
52 San Joaquin   14         88
  • ¿Cómo filtramos por todos excepto los casos anteriores?
    • Negando la condición

!(Comuna == "San Joaquin" & Edad >= 14)

  • Operador ! invierte todos los TRUE y FALSE:
tabla <- rbind(base$Comuna == "San Joaquin", 
               !(base$Comuna == "San Joaquin"))
tabla[,1:12]
      [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9] [,10] [,11] [,12]
[1,] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE
[2,]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE


¿Qué buscan realizar estas operaciones?

14 < Edad & Edad < 16

!(14 < Edad & Edad < 16)

!(Comuna == "San Joaquin" & Comuna == "Macul")

Funciones útiles

  • which(vector_logico): entrega las posiciones en que se encuentran los TRUE.
which(c(TRUE, TRUE, FALSE, TRUE))
[1] 1 2 4
  • which.min(numeros) y which.max(numeros): da posición del menor y mayor valor, respectivamente.
which.min(c(4,3,2,1))
[1] 4
which.max(c(4,3,2,1))
[1] 1

Funciones útiles

  • Operador vec1 %in% vec2: evalúa si los elementos de vec1 se encuentran en vec2.
vec1 <- c("SJ", "SM", "Stgo", "Macul"); vec2 <- c("Stgo", "Macul")
vec1 %in% vec2
[1] FALSE FALSE  TRUE  TRUE
  • all(cond1, cond2, ...): entrega TRUE si todas las condiciones se cumplen y FALSE si no.

  • any(cond1, cond2, ...): entrega TRUE si al menos una de las condiciones se cumplen y FALSE si no.

  • all.equal(x,y): evalúa si dos objetos son idénticos o no (incluye grado de tolerancia).

Actidad de Práctica

Cargue en R la tabla del archivo pokemon.csv.

  1. Filtre la tabla según las filas que cumplan type1 == "water" usando tabla[tabla$type1 == "water,].

  2. Filtre la tabla según las filas que cumplan type1 == "fire".

  3. Filtre la tabla según las filas que cumplan type1 == "fire" y type2 == "flying".

  4. Filtre la tabla según las filas que cumplan type1 == "fire" o type1 == "water".

Control de Flujo

  • Considere la siguiente situación:
    • Si un estudiante viene de la comuna de San Joaquín, recibirá una prueba de 20 preguntas.
    • Si un estudiante viene de otra comuna, recibirá una prueba de 30 preguntas.
  • Queremos una función que de el número de preguntas según la comuna.

NPreguntas <- function(comuna){
  # Si comuna es "San Joaquin", entonces
       nitems <- 20
       return(nitems)
  
  # Si comuna NO es "San Joaquin", entonces
       nitems <- 30
       return(nitems)
}

Control de Flujo: if-else

if(condicion a evaluar){ 

  # Código evaluado si se cumple condición
  
}else{

  # Código evaluado si NO se cumple condición
  
}

Control de Flujo: if-else

NPreguntas <- function(comuna){
  if(comuna == "San Joaquin"){
    nitem <- 20
    return(nitem)
  }else{
    nitem <- 30
    return(nitem)
  }
}

NPreguntas("San Joaquin")
[1] 20
NPreguntas("San Miguel")
[1] 30
NPreguntas("Comuna que no es San Joaquin")
[1] 30

Ejemplo: calculadora de notas según exigencia.

\[ \text{Nota} = \begin{cases} 1 + 3\frac{p}{Ex\cdot p_{max}}, & \text{si } p < Ex\cdot p_{max}, \\ 4 + 3\frac{p - Ex \cdot p_{max}}{p_{max}(1 - Ex)}, & \text{si } p \geq Ex\cdot p_{max}. \end{cases} \]

NotaEPG3308 <- function(p, pMax, Ex){
  if(p < Ex * pMax){
    Nota <- 1 + 3*p/(Ex*pMax)
    return( round(Nota,1) )
  }else{ # En caso contrario, p >= Ex * pMax
    Nota <- 4 + 3*(p - Ex*pMax)/(pMax*(1- Ex))
    return( round(Nota,1) )
  }
}
NotaEPG3308(p = 15, pMax = 30, Ex = 0.5)
[1] 4
NotaEPG3308(p = 15, pMax = 30, Ex = 0.65)
[1] 3.3

Observaciones

  • Dentro de la condición del if puede venir cualquier operación lógica de interés.

if(comuna == "A" & edad > 50 & ptje == 10 & ...)

  • Si se desean ejecutar más de dos casos usar else if():
if(condicion1){
  
}else if(condicion2){
  
}else if(condicion3){
  
}else{
  ...
}

Bucles for

  • Permiten recorrer cada elemento de un vector y realizar una acción con cada uno de ellos.

    • Realizar procedimientos repetitivos.
  • Sintaxis:

for(elemento in vector){ # Para cada elemento en el vector:
  # Usar "elemento" para ejecutar (o no) algo. 
}

Ejemplos

  • Imprimir cada elemento de un vector:
Alumnos <- c("H", "A", "R", "B", "J", "F")
for(a in Alumnos){ # Para cada elemento de Alumnos
  print(a)
}
  • Aplicar operación matemática a cada elemento:
Secuencia <- 1:10
for(potencia in Secuencia){ 
  print(pi^potencia)
}
  • Lo más común es usar vector de índices:
indices <- 1:nrow(base)
for(i in indices){
  print(base$Edad[i])
  
  Sys.sleep(1) # Añade un segundo de tiempo entre iteraciones
}
  • Notación simplificada:
for(i in 1:10){
  print(base[i,])
}
  • Usar for para ir rellenando variables:
vector <- c() # Vector vacío
for(i in 1:20){
  vector[i] <- exp(i) # número de euler elevado a i = 2.718^i
}

Importante

Usar for cuando no haya una función vectorizada en R que haga lo mismo, o cuando necesite hacer muchos cálculos dentro de cada iteración.

Cálculos vectorizados son siempre más rápidos

  • Sumar con for vs sumar con función sum:
vector <- 1:10
suma <- 0
for(i in 1:length(vector)) suma <- suma + vector[i]

sum(vector)
[1] 55

Aplicación combinando if-else y for

Calcular nota de alumnos donde la exigencia cambia según comuna:

  • San Joaquín: 50% exigencia

  • Macul: 60% exigencia

  • La Florida: 65% exigencia

Solución:

Notas <- c()
for(i in 1:nrow(base)){
  if(base$Comuna[i] == "San Joaquin"){
    Notas[i] <- NotaEPG3308(p = base$puntuacion[i],
                            pMax = 100,
                            Ex = 0.50)
  }else if(base$Comuna[i] == "Macul"){
        Notas[i] <- NotaEPG3308(p = base$puntuacion[i],
                            pMax = 100,
                            Ex = 0.60)
  }else{
        Notas[i] <- NotaEPG3308(p = base$puntuacion[i],
                            pMax = 100,
                            Ex = 0.65)
  }
}

Bucle while

  • Estructura que ejecuta un bloque de código de forma repetitiva mientras una condición sea verdadera.
while(condicion){ # Mientras se cumpla la condición ejecutar:

  # Código
  
}
  • Antes de iniciar cada iteración, se reevalúa la condición.

  • Dentro del código debe ocurrir algo que modifique el estado de la condición.

Ejemplos:

  • Sumar números hasta que la suma sea mayor a 100.
suma <- 0
n <- 1 # Contador
while (suma <= 100) {
  suma <- suma + n
  n <- n + 1
}
print(n)
[1] 15
  • Validar la respueta de un usuario:
respuesta <- ""
while (respuesta != "sí") {
  respuesta <- readline(prompt = "¿Quieres continuar? (escribe 'sí'): ")
}
cat("¡Gracias por confirmar!\n")

¡Actividad Bonificada!

Resuelva cada caso utilizando procedimientos vectorizados y utilizando control de flujo (if-else y/o for)

  1. Construya una función que reciba un vector de notas e imprima un mensaje indicando si alguien obtuvo una nota 7.0 o no.

  2. Usando el archivo Clase03_notas.R y las notas calculadas previamente, escriba un código que recorra el vector de notas e imprima un mensaje para cada una, según estos casos:

  • Si Nota < 4.0 \(\rightarrow\) “No se exime de examen”.
  • Si Nota está entre 4.0 y 6.0 \(\rightarrow\) “Posible eximición examen”.
  • Si Nota > 6.0 4.0 \(\rightarrow\) “Eximido de examen”.






EPG3308: Computación Estadística

Clase 05: Herramientas Gráficas

Profesor: Hernán Robledo Araya (harobledo@uc.cl)
Ayudante: Josefa Silva Muñoz (josefa.silva@alumni.uc.cl)

Primer Semestre - 2025

Gráficos en R Base

Análisis de Estadísticas descriptivas:


Concentraciones de Tratamientos Biológicos bajo 4 Experimentos

Experimento Media Desv. estándar Mínimo Máximo
Exp 1 0.20 0.40 0.00 1.00
Exp 2 0.40 0.05 0.10 0.70
Exp 3 0.60 0.08 0.20 1.00
Exp 4 0.80 0.25 0.30 1.00


¿Qué podemos decir de estos resultados?

¿Por qué usar graficos para visualizar información?

Cómo NO graficarán los alumnos de este curso:

🤨🤨🤨

Cómo sí graficarán los alumnos de este curso:

🧐🧐😇😇

Consideraciones

  • Dedicar tiempo a la confección de gráficos.

  • Presentar gráficos en base a una historia que se desea contar.

    • ¿Qué quiero decir con este gráfico?
  • No todo gráfico es interesante de ver.

  • No sobrecargar los gráficos.

  • Reflexionar: ¿de cuántas maneras puedo presentar los mismos resultados?

  • R puede no ser la mejor herramienta para hacer un gráfico.

Veremos:

  1. Histogramas
  2. Gráficos de Densidad
  3. Gráficos de Dispersión
  4. Gráficos de Línea
  5. Diagrama de Caja
  6. Diagrama de Torta

¿Cómo estudiamos la distribución de una variable?

Distribución de una variable numérica

Con qué forma y dónde se distribuyen los valores observados de una variable.

  • ¿Centro de los datos?
  • ¿Dispersión en torno al centro?
  • Simétricos o asimétricos en torno a un centro?
  • ¿Unimodal o multimodal?
  • ¿Datos extremos?

Histogramas

Histogramas con hist(x)

Advertencia

Imagen sensible (disculpas correspondientes)

load("Clase05_Datos.RData")
hist(datos[,1])

hist(datos[,1],
     main = "main asigna un titulo al grafico",
     xlab = "xlab modifica etiqueta del Eje X",
     ylab = "ylab modifica etiqueta del Eje Y",
     xlim = c(-4,4), # Modificar rango de eje X
     ylim = c(0,120), # Modificar rango de eje y.
     freq = TRUE, # ¿Frecuencia absoluta (TRUE) o relativa/densidad (FALSE)?
     col = "lightblue2", # Color de relleno
     border = "lightblue4", # Color de borde
     las = 1, # Etiquetas eje Y rotadas
     breaks = 15 # Numero de barras
     )

  • Superponer dos histogramas con add = TRUE.
hist(datos[,1], col = "red3", xlim = c(-5,10), main = "Superponer histogramas", xlab = "eje X", ylab = "Frecuencia Relativa")
hist(datos[,2], add = TRUE, col = "orange2")

  • En estadística suponemos que datos surgen de un modelo.

  • ¿Graficar histograma suavizado que se parezca a la teoría?

Histograma suavizado: density(x)

par(cex = 1.4) # Aumenta todo el tamaño del grafico
hist(datos[,1], main = "Densidad de Kernel con density(x)", xlab = "", ylab = "", xlim = c(-4,4), freq = F, col = "lightblue2", border = "lightblue4", las = 1, breaks = 15 )

lines(density(datos[,1]), col = "blue2",
      lwd = 2,  # Linea de ancho 2
      lty = 2   # Linea punteada
      ) 

Histograma suavizado: density(x)

  • Útiles cuando se desea simplificar el gráfico. Requiere comprender una densidad.

Gráfico de Caja: boxplot(x)

Gráfico de Caja: boxplot(x)

boxplot(datos[,1])

😱😱😱🙈🙈🙈

Gráfico de Caja: boxplot(x)

par(cex = 1.5)
boxplot(datos[,1], ylim = c(-4,4),
        main = "Titulo del Diagrama de Caja",
        horizontal = TRUE,
        col = "lightblue2",       # Relleno
        border = "lightblue4",    # Borde de la caja
        boxwex = 1.2,            # Ancho de la caja
        pch = 19); grid()
  • Diagramas de caja según categorías con sintaxis y ~ x
boxplot(Sepal.Length ~ Species, data = iris, las = 1,
        xlab = "Especie", ylab = "Largo del Sepal", col = 2:4, pch = 19)
grid()

  • Histograma, gráfico de densidad, y boxplot permiten analizar o comparar distribuciones.

  • Usaremos gráficos de dispersión para comparar relación entre dos variables:

    • ¿Peso corporal predice la presión arterial?
    • ¿A mayor cantidad de estudio, mejor rendimiento?
    • ¿Evoluciona una variable en función del tiempo?

Gráfico de Dispersión: plot(x, y)

Gráfico de Dispersión: plot(x, y)

load(file = "Clase05_Datos3.RData")
plot(y1 ~ y2, data = datos3)

🤢🤢🤢💀💀💀

par(cex = 1.2)
plot(y2 ~ y1, data = datos3,
     main = "Relacion entre variable y1 y y2", xlab = "Variable y1", ylab = "Variable y2",
     type = "p",
     col = "red3",
     pch = 19,
     las = 1
)
grid(col = rgb(0.2,0.2,0.2,0.5))

  • Gráfico de líneas con type = "l"
par(cex = 1.2)
plot(y1 ~ tiempo, data = datos3,
     main = "Serie de Tiempo", xlab = "tiempo", ylab = "Variable y1",
     type = "l",
     col = "red3",
     pch = 19,
     las = 1
)
grid(col = rgb(0.2,0.2,0.2,0.5))

Apartado técnico de gráficos en R.

  • Crear un gráfico es abrir un dispositivo gráfico.

  • Funciones de alto nivel como plot() abren el dispositivo.

  • Funciones de bajo nivel: permiten añadir elementos al dispostivo abierto. No sirven por si solas.
    • lines: graficar líneas adicionales.
    • points: graficar puntos adicionales.
    • text: imprimir texto en gráfico.
    • legend: añadir leyenda.
    • grid, axis, segments, title, polygon, etc.

Reconstruyamos el siguiente gráfico:

# Iniciar dispositivo grafico
plot(NULL, xlim = c(0,100), ylim = c(0,200), las = 1, xlab = "", ylab = "")

Apartado técnico de gráficos en R.

  • Función par() contiene la configuración global de los dispositivos gráficos.
par()[1:8] |> unlist()  # Ver ayuda para todos los parametros: ?par
   xlog    ylog     adj     ann     ask      bg     bty     cex 
"FALSE" "FALSE"   "0.5"  "TRUE" "FALSE" "white"     "o"     "1" 
  • Podemos modificar alguno de estos parámetros para que se aplique a todos los gráficos.
    • par(pch = 19): puntos rellenos en gráficos de puntos.
    • par(cex.main = 2): agrandar títulos de gráficos.
    • par(mfrow = c(filas, columnas)): dividir la ventana en una matriz para imprimir multiples gráficos.
    • ?par
  • Ejemplo de uso de par()
plot(Sepal.Length ~ Sepal.Width, data = iris)
plot(Sepal.Length ~ Petal.Length, data = iris)
plot(Sepal.Width ~ Petal.Width, data = iris)
  • Ejecutar código anterior antes y después de ejecutar

par(las = 1, bty = "n", pch = 19, mfrow = c(1,3), cex.lab = 1.2, cex.axis = 1.2)

  • Volver a configuración por defecto cerrando el dispositivo gráfico con dev.off()

Graficar funciones matemáticas: curve()

  • Graficar la función \(f(x|k,v,\dots)\) en \(a < x < b\).
    • Se evalúa en \(x\) y tiene posibles parámetros \(a\), \(b\), \(\dots\) que la modifican.
  • Sintaxis:

curve(f(x, k, v), from = a, to = b)

  • Ejemplo: distribución Normal Estándar
f <- function(x) exp(-x^2/2)/sqrt(2*pi)
curve(f(x), from = -3, to = 3, las = 1, 
main = "Distribucion Normal Estandar", lwd = 2)

  • Ejemplo: distribución Gamma\((k,v)\):
f <- function(x, k, v) v^k/gamma(k)*x^(k-1)*exp(-v*x)
curve(f(x,k = 3, v = 0.5), from = 0, to = 20, 
      las = 1, 
      main = "Distribucion Gamma", lwd = 2)

  • Ejemplo: graficar funciones que ya vienen en R
curve(exp(x), from = -3, to = 3, lwd = 2)

curve(sin(x), from = -10, to = 10, lwd = 2)

curve(dnorm(x,0,4), from = -10, to = 10, lwd = 2)

curve(pexp(x,1), from = 0, to = 10, lwd = 2)

curve(ppois(x,4), from = 0, 10)

curve(pbinom(x,size=20,prob=0.2), from = 0, 10)


  • Una herramienta gráfica más amigable es Desmos

Gráficos feos que no quiero mostrar:

  • Gráfico de barra con barplot(x)

  • Gráfico de torta con pie(x)

frutas <- c("Manzana", "Plátano", "Naranja", "Fresa", "Uva")
cantidades <- c(25, 15, 20, 10, 30)

pie(cantidades, labels = frutas,
    main = "Preferencia por tipo de fruta",
    col = rainbow(length(frutas)))

barplot(cantidades,
        names.arg = frutas,
        main = "Preferencia por tipo de fruta",
        ylab = "Cantidad de personas",
        col = "skyblue",
        border = "white")
  • Demostración real de cómo hacer un gráfico complejo:

Gráficos con ggplot2

Paquete para creación de gráficos

Enfoque declarativo para construir gráficos

Ejemplos ggplot2

Fuente de Imagen

Ejemplos ggplot2

Fuente de Imagen

Ejemplos ggplot2

Fuente de Imagen

Ejemplos ggplot2

Fuente de Imagen

  • Extensiones de ggplot2: https://exts.ggplot2.tidyverse.org/gallery/

ggplot2 es una librería (o paquete) de R

  • Librería: conjunto de funciones para objetivo particular.

    • Librería dplyr: funciones para manipular datos.
    • Librería moments: trae funciones para calcular estadísticas descriptivas
  • Instalar librería:

install.packages("NOMBRE DE LIBRERIA")
  • Cargar la librería:
library(NOMBRE DE LIBRERIA)

ggplot2

install.packages("ggplot2")
library(ggplot2)
  • Sintaxis basada en la composición de capas.

  • Se indica qué se quiere visualizar (y no cómo)

ggplot(Datos) +
  aes(Variables a Graficar) +
  geom_TipodeGrafico() +
  Adiciones_Extras_al_grafico.
  • Distintas capas son conectadas con +

Ejemplo:

library(ggplot2)

ggplot(data = mtcars) +                         # 1. Especificar datos
  aes(x = wt, y = mpg, color = factor(cyl)) +   # 2. "Mapear" variables 
  geom_point(size = 3) +                        # 3. Graficar puntos
  labs(title = "Consumo vs Peso del Vehículo",  # 4. Etiquetas
       x = "Peso (wt)", y = "Consumo (mpg)") +
  theme_minimal()                               # 5. Aplicacion de un tema

Elementos de ggplot:

  • aes(x,y): “aesthetics mappings” o atributos estéticos. Especificar cómo variables se conectan con elementos visuales (estéticas) del gráfico.
+ aes(x = Edad,       # variable Edad en eje x
      y = Ingresos,   # variable Ingresos en eje y
      color = Genero, # asignar colores segun Genero
      shape = Comuna # graficar puntos distintos segun Comuna
    )
  • geom_X(): especificar la geometría del gráfico, es decir, la forma gráfica para visualizar los datos.
geom_point()     # Gráfico de Dispersión
geom_bar()       # Gráfico de Barras
geom_histogram() # Histogramas

Ejemplos

  • Datos de la tarea:
load("ENS2017.RData")
  • Histograma de Edades
ggplot(ENS) +       # Inicializa datos
  aes(Edad) +       # Especificar variables
  geom_histogram()  # Indicar geometria (grafico)

Ejemplos

  • Gráfico de Densidad de Edades
ggplot(ENS) +       # Inicializa datos
  aes(Edad) +       # Especificar variables
  geom_density()

Ejemplos

  • Gráfico de Densidad de Edades
ggplot(ENS) +       # Inicializa datos
  aes(Edad) +       # Especificar variables
  geom_density(fill = "lightblue", color = "lightblue4", alpha = 0.5)

Ejemplos

  • Gráfico de Violín
ENS <- na.omit(ENS)
ENS <- ENS[ENS$Peso < 250 & ENS$Altura < 220 & ENS$Altura > 100 ,]

ggplot(ENS) +       
  aes(y = Peso, x = "") + 
  geom_violin()

Ejemplos

  • Gráfico de Violín
ggplot(ENS) +       
  aes(y = Peso, x = Sexo, fill = Sexo) + 
  geom_violin()

Ejemplos

  • Gráfico de Dispersión
ggplot(ENS) +
  aes(x = Peso, y = Altura) + 
  geom_point()

Ejemplos

  • Gráfico de Dispersión
ggplot(ENS) +
  aes(x = Peso, y = Altura, color = Sexo) + 
  geom_point()

Ejemplos

  • Gráfico de Caja
ggplot(ENS) +
  aes(x = Peso, y = Altura, color = Sexo) + 
  geom_boxplot(fill = "grey95")

Ejemplos

  • Gráfico de Caja
ggplot(ENS) +
  aes(x = Peso, y = Altura, color = Sexo) + 
  geom_boxplot(fill = "grey95") +
  
  coord_flip() +        # Rota coordenadas
  labs(title = "Mi primer Grafico de Caja en ggplot2",
       x = "Peso en Kg",
       y = "Altura en cm") + 
  theme_minimal()

Ejemplos

  • Gráfico de Barras
ggplot(ENS) +
  aes(x = Sexo) + 
  geom_bar(fill = "steelblue", width = 0.7)

  • Suponer deseamos cambirle los colores a este gráfico:
ggplot(ENS) +
  aes(x = Peso, y = Altura, color = Sexo) + 
  geom_point()

  • Solución: modificar la “escala” del atributo “color”
ggplot(ENS) +
  aes(x = Peso, y = Altura, color = Sexo) + 
  geom_point() +
  scale_color_manual(values = c("F" = "red", "M" = "blue"))

Escalas en ggplot2: scale_

  • Controlan cómo los valores de las variables se traducen en elementos gráficos.

scale_ElementoEstetico_Tipo()

  • Ejemplos:
scale_x_continuous()     # eje x con datos numéricos
scale_color_manual()
scale_shape_manual()
  • Ejemplo: modificar etiquetas de los ejes:
ggplot(ENS) +
  aes(x = Peso, y = Altura, color = Sexo) + 
  geom_point() +
  scale_y_continuous(breaks = seq(0,200,10)) + # Modifica numeros del eje y
  scale_x_continuous(breaks = c(40,60,80,100,120,140))
  • Ejemplo: modificar colores y tamaño de puntos:
ggplot(ENS) +
  aes(x = Peso, y = Altura, color = Sexo, shape = Sexo) + 
  geom_point() +
  scale_color_manual(values = c("F" = "red", "M" = "blue")) +
  scale_shape_manual(values = c("F" = 15, "M" = 3))






EPG3308: Computación Estadística

Clase 06: Álgebra Lineal en R

Profesor: Hernán Robledo Araya (harobledo@uc.cl)
Ayudante: Josefa Silva Muñoz (josefa.silva@alumni.uc.cl)

Primer Semestre - 2025

Álgebra Lineal en R

  • Matrices

\[ \begin{pmatrix} 3 & 17 \\ 15 & 4 \\ \end{pmatrix} \]

matrix(c(3, 15, 17, 4), nrow = 2) # Basta con indicar numero de filas
     [,1] [,2]
[1,]    3   17
[2,]   15    4

Álgebra Lineal en R

  • Vectores

\[ \begin{pmatrix} 1 \\ 0 \\ 2 \\ \end{pmatrix} \]

vector <- c(1,0,2) # Interpretado como vector columna
vector <- matrix(c(1,0,2)) # Interpretado como vector columna
dim(vector) # (3 x 1)
[1] 3 1

Suma de Matrices

\[ \begin{pmatrix} 1 & 3 \\ -1 & 2 \\ \end{pmatrix} + \begin{pmatrix} 4 & 3 \\ 3 & 5 \\ \end{pmatrix} = \begin{pmatrix} 5 & 6 \\ 2 & 7 \\ \end{pmatrix} \]

A <- matrix(c(1,-1,3,2), nrow = 2)
B <- matrix(c(4,3,3,5), nrow = 2)
A + B
     [,1] [,2]
[1,]    5    6
[2,]    2    7

Suma de Vectores

\[ \begin{pmatrix} 1 \\ 3 \\ -1 \\ \end{pmatrix} + \begin{pmatrix} 4 \\ 3 \\ 3 \\ \end{pmatrix} = \begin{pmatrix} 5 \\ 6 \\ 2 \\ \end{pmatrix} \]

a <- matrix(c(1,-1,3));   b <- matrix(c(4,3,3))
a + b
     [,1]
[1,]    5
[2,]    2
[3,]    6
a <- c(1,-1,3);   b <- c(4,3,3)
a+b
[1] 5 2 6

Transposición de matrices con t(A)

\[A = \begin{pmatrix} 1 & 3 & 4 \\ -1 & 2 & -2 \\ \end{pmatrix} \quad \Longrightarrow \quad \ A^t = \begin{pmatrix} 1 & -1 \\ 3 & 2 \\ 4 & -2 \end{pmatrix} \]

A <- matrix(c(1,-1,3,2,4,-2), ncol = 3)
t(A)
     [,1] [,2]
[1,]    1   -1
[2,]    3    2
[3,]    4   -2

Producto Matricial con %*%

\[ \begin{pmatrix} 1 & 3 \\ -1 & 2 \\ \end{pmatrix} \cdot \begin{pmatrix} 4 & 3 \\ 3 & 5 \\ \end{pmatrix} = \begin{pmatrix} 1\cdot 4 + 3\cdot 3 & 1 \cdot 3 + 3 \cdot 5 \\ -1\cdot 4 + 2 \cdot 3 & -1 \cdot 3 + 2 \cdot 5 \\ \end{pmatrix} \\ \]

\[ = \begin{pmatrix} 13 & 18 \\ 2 & 7 \\ \end{pmatrix} \]

A <- matrix(c(1,-1,3,2), nrow = 2)
B <- matrix(c(4,3,3,5), nrow = 2)
A %*% B
     [,1] [,2]
[1,]   13   18
[2,]    2    7

Solución de Sistemas Lineales

\[Ax = b\]

  • \(A \in \mathbb{R}^{n\times m}\), \(x \in \mathbb{R}^{m}\), \(b \in \mathbb{R}^{n}\)

Ejemplo:

\[ \begin{pmatrix} 2 & 3 \\ 1 & 2 \end{pmatrix} \begin{pmatrix} x_1 \\ x_2 \end{pmatrix} = \begin{pmatrix} 0 \\ 1 \\ \end{pmatrix} \]

\[A = \begin{pmatrix} 2 & 3 \\ 1 & 2 \end{pmatrix} , \quad x = \begin{pmatrix} x_1 \\ x_2 \\ \end{pmatrix}, \quad b = \begin{pmatrix} 0 \\ 1 \\ \end{pmatrix} \]

Solución de Sistemas Lineales

  • Función solve(A,b) para encontrar solución x.
A <- matrix(c(2,1,3,2), ncol = 2)
b <- c(0,1)
x <- solve(A,b)
x
[1] -3  2
  • Calcular \(x = A^{-1}b\) usando solve(A) para obtener \(A^{-1}\).
invA <- solve(A)
x <- invA %*% b
x
     [,1]
[1,]   -3
[2,]    2

Invertibilidad de Matrices

  • Una matriz no es invertible si el determinante es cero.

\[ A = \begin{pmatrix} 2 & 2 \\ 1 & 2 \end{pmatrix}, \quad \operatorname{det}(A) = 2 \quad (\text{Invertible}) \]

\[ A = \begin{pmatrix} 2 & 4 \\ 1 & 2 \end{pmatrix}, \quad \operatorname{det}(A) = 0 \quad (\text{No Invertible}) \]

A <- matrix(c(2,1,2,2), ncol = 2); det(A)
[1] 2
A <- matrix(c(2,1,4,2), ncol = 2); det(A)
[1] 0

Invertibilidad de Matrices

  • Usualmente, el determinante es un número muy cercano a cero si la matriz no es invertible.

\[\operatorname{det}(A) = \text{1e-16} = 1\cdot 10^{-16} = 0\]

  • El número de condicionamiento, \(\kappa\), de una matriz indica la estabilidad de las soluciones del sistema \(Ax = b\).
A <- matrix(c(2,1,2,2), ncol = 2)
kappa(A)
[1] 7.692308
A <-  matrix(c(2,1,4,2.00001), ncol = 2)
kappa(A)
[1] 1500003

¡Actividad Bonificada!

Verifique si las siguientes matrices \(A\) son invertibles y , en caso de serlos, resuelva el sistema lineal correspondientes al vector \(b\) indicado.

\[ A = \begin{pmatrix} 2 & 5 \\ -2 & 3 \end{pmatrix}, \qquad b = \begin{pmatrix} 0 \\ 1 \end{pmatrix} \]

\[ A = \begin{pmatrix} 1 & 0 & 2 & -1 \\ 0 & 1 & 4 & 2 \\ 0 & 0 & 1 & 3 \\ 0 & 0 & 0 & 1 \end{pmatrix}, \qquad b = \begin{pmatrix} 4 \\ 5 \\ 6 \\ 7 \end{pmatrix} \]

\[ A = \begin{pmatrix} 1 & 2 & 3 \\ 2 & 4 & 6 \\ 0 & 1 & 1 \end{pmatrix}, \qquad b = \begin{pmatrix} 1 \\ 2 \\ 1 \end{pmatrix} \]

Aplicación

Los datos airquality poseen mediciones diarias de la calidad del aire en Nueva York durante 1973, incluyendo concentración de ozono, temperatura, radiación solar y velocidad del viento.

Se busca explicar la variable Ozone en función de las otras tres variables disponibles: Solar.R, Wind y Temp.

AQ <- na.omit(airquality) # Omitir valores faltantes

Estimar un modelo de regresión lineal:

\[\text{O}_i = \beta_0 + \beta_1 \cdot \text{Solar}_i + \beta_2 \cdot \text{Wind}_i + \beta_3 \cdot \text{Temp}_i + \varepsilon_i,\]

Escrito matricialmente:

\[\textbf{O} = X\boldsymbol{\beta} + \boldsymbol{\varepsilon},\] donde

  • \(\textbf{O}\) es el vector de todos los valores observados de ozono,
  • \(X\) es la matriz de regresión del modelo de regresión lineal,
  • \(\boldsymbol{\beta}\) es el vector de cuatro parámetros a estimar,
  • \(\boldsymbol{\varepsilon}\) es el vector de errores.

Para estimar los parámetros \(\beta_i\), se resuelven las ecuaciones normales obtenidas por el método de Mínimos Cuadrados Ordinarios.

\[(X^tX) \boldsymbol{\beta} = X^t \boldsymbol{O} \quad \Longrightarrow \quad \boldsymbol{\beta} = \left(X^t X\right)^{-1} X^t \boldsymbol{O} \]

donde

\[ X = \begin{pmatrix} 1 & \text{Solar}_1 & \text{Wind}_1 & \text{Temp}_1 \\ 1 & \text{Solar}_2 & \text{Wind}_2 & \text{Temp}_2 \\ \vdots & \vdots & \vdots & \vdots \\ 1 & \text{Solar}_n & \text{Wind}_n & \text{Temp}_n \\ \end{pmatrix}, \quad \boldsymbol{O} = \begin{pmatrix} O_1 \\ O_2 \\ \vdots \\ O_n \end{pmatrix} \]






EPG3308: Computación Estadística

Clase 07: Cálculo para Estadística

Profesor: Hernán Robledo Araya (harobledo@uc.cl)
Ayudante: Josefa Silva Muñoz (josefa.silva@alumni.uc.cl)

Primer Semestre - 2025

  • Sea \(f: \mathbb{R} \to \mathbb{R}\)
    • \(f(x)\) recibe números reales y da como resultado un número real.
  • La Derivada de \(f(x)\) es una función \(f'(x)\) que represesenta la tasa de cambio instantáneo de la función \(f(x)\) en el punto \(x\).

\[f(x) = x^2 \qquad \to \qquad f'(x) = 2x \]

Ejemplo

  • Distancia recorrida por un auto al tiempo \(t\) está dada por \[f(t) = 10 + 5t\]
    • La velocidad del auto es la tasa de cambio instantánea de la distancia recorrida.
    • La velocidad es la derivada de \(f(t)\).

\[\text{Velocidad: } f'(t) = 5\] \[\text{(Velocidad constante)}\]

Notación para escribir una Derivada

\[f'(x) = \frac{d}{dx}f(x)\]

  • \(\frac{d}{dx}\) hace explícito que estamos calculando la derivada respecto a la variable \(x\).

  • Usamos \(f'(x)\) cuando la variable por la cual estamos derivando es evidente.

Obtener Derivada de una Función

  • Las Derivadas se calculan.
    • Seguir reglas dependiendo de cómo es \(f(x)\).
    • Derivar \(f(x)\) es seguir reglas dependiendo de la forma de \(f(x)\).

\[\text{Potencia}: f(x) = x^3 \quad \to \quad f'(x) = 3x^2 \]

\[\text{Exponencial}: f(x) = e^{2x} \quad \to \quad f'(x) = 2e^{2x} \]

\[\text{etc.}\]

I) Derivada de una Constante

\[f(x) = a \qquad \to \qquad \frac{d}{dx}f(x) = 0\]

II) Derivada de una constante multiplicada a una función

\[f(x) = a\cdot g(x)\]

\[\frac{d}{dx}f(x) = \frac{d}{dx}\Big( a \cdot g(x)\Big) = a \cdot \left(\frac{d}{dx} g(x)\right)\]

III) Derivada de una Potencia

\[f(x) = b\cdot x^a \qquad \to \qquad \frac{d}{dx}f(x) = b\cdot a\cdot x^{a - 1}\]

IV) Linealidad de la Derivada

\[f(x) = h(x) + g(x) \]

\[\frac{d}{dx}f(x) = \frac{d}{dx}\left(h(x) + g(x)\right) = \frac{d}{dx}h(x) + \frac{d}{dx}g(x)\]

V) Regla de la Cadena

\[f(x) = g(h(x)) \quad \to \quad \frac{d}{dx}f(x) = \frac{d}{dx} g(h(x)) \cdot \frac{d}{dx} h(x)\]

VI) Derivada del Producto

\[\frac{d}{dx} \left(f(x)\cdot g(x) \right) = \left(\frac{d}{dx} f(x)\right) g(x) + f(x) \left( \frac{d}{dx} g(x)\right) \]

VII) Derivadas importantes

\[\frac{d}{dx} e^x = e^x \qquad \frac{d}{dx} \log(x) = \frac{1}{x}\]

Problemas de Optimización

  • Sea \(f: \mathbb{R}^n \to \mathbb{R}\).

  • Se busca encontrar el valor \(x^* \in \mathbb{R}^n\) tal que \(f(x^*)\) sea un máximo o un mínimo.

Procedimiento para el caso univariado

Para una función continua y dos veces diferenciable \(f: \mathbb{R} \to \mathbb{R}\)

  1. Obtener analíticamente \(f'(x)\) y \(f''(x)\).

  2. Encontrar el valor \(x^*\) tal que \(f'(x^*) = 0\).

  3. Evaluar \(f''(x^*)\).

  • Si \(f''(x^*) > 0\), entonces \(f(x^*)\) es un mínimo.
  • Si \(f''(x^*) < 0\), entonces \(f(x^*)\) es un máximo.
  • Si \(f''(x^*) = 0\), no se puede concluir.

Soluciones computacionales aproximadas

  • Función optimize para encontrar el máximo o mínimo de una función en un intervalo.

  • Ejemplo: encontrar \(x^*\) que minimice la suma cuadrática

\[f(x) = \sum_{i = 1}^n (y_i - x)^2\]

y <- iris$Sepal.Length
f <- function(x) sum( (y - x)^2 ) ## Minimizar la suma cuadratica
Res <- optimize(f = f,
                interval = c(-100, 100),
                maximum = FALSE # Para encontrar un minimo.
)
Res$minimum    # El valor x* de f(x) donde se logra el minimo
Res$objective  # f(x) evaluado en el x* que lo minimiza

Procedimiento para el caso multivariado

Sea \(f: \mathbb{R}^n \to \mathbb{R}\) una función continua y dos veces diferenciable.

\[f(\boldsymbol{x}) = f(x_1,x_2,\dots, x_n)\]

  • Gradiente de \(f(x)\):

\[\nabla f(x) = \begin{pmatrix} \frac{\partial}{\partial x_1} f(x) \\ \vdots \\ \frac{\partial}{\partial x_n} f(x) \\ \end{pmatrix}\]

Procedimiento para el caso multivariado

Sea \(f: \mathbb{R}^n \to \mathbb{R}\) una función continua y dos veces diferenciable.

\[f(x) = f(x_1,x_2,\dots, x_n)\]

  • \(H_f(x)\) Matriz Hessiana de \(f(x)\)

\[H_f(x) = \begin{pmatrix} \frac{\partial^2 f}{\partial x_1^2} & \frac{\partial^2 f}{\partial x_1 \partial x_2} & \cdots & \frac{\partial^2 f}{\partial x_1 \partial x_n} \\ \frac{\partial^2 f}{\partial x_2 \partial x_1} & \frac{\partial^2 f}{\partial x_2^2} & \cdots & \frac{\partial^2 f}{\partial x_2 \partial x_n} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial^2 f}{\partial x_n \partial x_1} & \frac{\partial^2 f}{\partial x_n \partial x_2} & \cdots & \frac{\partial^2 f}{\partial x_n^2} \\ \end{pmatrix}\]

Procedimiento para el caso multivariado

Para una función continua y dos veces diferenciable
\(f: \mathbb{R}^n \to \mathbb{R}\):

  1. Obtener analíticamente:

    • El gradiente: \(\nabla f(x)\)
    • La matriz Hessiana: \(H_f(x) = \nabla^2 f(x)\)
  2. Encontrar \(x^*\) tal que \(\nabla f(x^*) = 0\)

  3. Evaluar la matriz Hessiana en \(x^*\):

    • Si \(H_f(x^*)\) es definida positiva, entonces \(f(x^*)\) es un mínimo local
    • Si \(H_f(x^*)\) es definida negativa, entonces \(f(x^*)\) es un máximo local
    • Si \(H_f(x^*)\) es indefinida, entonces \(x^*\) es un punto de silla
    • Si no se puede determinar la definitud, no se puede concluir.

Soluciones computacionales aproximadas

  • Función optim para hallar mínimo (por defecto) o máximo de función multivariada.

  • Ejemplo: encontrar \(\beta = (\beta_0, \beta_1)\) que minimice

\[f(\beta) = \sum_{i = 1}^n (y_i - (\beta_0 + \beta_1x_i))^2\]

  • Problema de Mínimos Cuadrados: encontrar la recta \(\beta_0 + \beta_1 x\) que minimice la distancia a los puntos \((x_i, y_i)\).

optim(par, fn, gr, method, hessian, control)

  • par: valores iniciales.
  • fn: función a maximizar o minimizar.
  • gr: función que contiene al vector gradiente de la función.
  • method: método de optimización a usar.
  • hessian: valor lógico indicando si devolver matriz Hessiana aproximada \(H_f(x)\).
  • control: lista de argumentos adicionales para controlar el proceso. control = list(fnscale = -1) permite que optim maximice en vez de minimizar.

Importante: el primer argumento de las funciones fn y gr deben ser un vector que represente a \(x\) en \(f(x)\).

Problema de Mínimos Cuadrados

\[f(\beta) = \sum_{i = 1}^n (y_i - (\beta_0 + \beta_1x_i))^2\]

fn <- function(beta){ # beta es un vector.
  b0 <- beta[1]
  b1 <- beta[2]
  sum((y - (b0 + b1*x))^2)
}

\[\nabla f(\beta) = \begin{pmatrix} -2 \sum_{i = 1}^n (y_i - (\beta_0 + \beta_1 x_i )) \\ -2 \sum_{i = 1}^n x_i(y_i - (\beta_0 + \beta_1 x_i )) \end{pmatrix} \]

gr <- function(beta) { # beta es un vector
  b0 <- beta[1]
  b1 <- beta[2]
  c(-2 * sum(y - (b0 + b1 * x)), 
    -2 * sum(x * (y - (b0 + b1 * x)) ))
}
R <- optim(par = c(0,0), # valor inicial
      fn = fn, # funcion a optimizar
      gr, # gradiente
      method = "Nelder-Mead", # metodo 
      hessian = TRUE # opcional
)
  • R$par: valor \(x^*\) donde se maximiza \(f(x)\)
R$par
[1] 10.44291  4.89590
  • R$value: valor \(f(x^*)\)
R$value
[1] 361.082
  • R$convergence: si se logró convergencia del método. 0 es convergencia exitosa.
R$convergence
[1] 0
  • R$hessian: matriz Hessiana \(H_f(x)\).
R$hessian
           [,1]      [,2]
[1,] 100.000000  3.440355
[2,]   3.440355 84.127412

Otro ejemplo: \(f(x) = (x_1 - 2)^2 + (x_2 + 3)^2\)

  • Es posible omitir el argumento gr para que R internamente aproxime el vector gradiente.
Funcion <- function(x) { 
  x1 <- x[1]  # -> variable x
  x2 <- x[2]  # -> variable y
  (x1 - 2)^2 + (x2 + 3)^2
}

Res <- optim(c(0, 0), 
             Funcion
)


Res$par
[1]  1.999823 -3.000005

Integración

\[\int_a^b f(x)dx\]

Integración

  • \(\int_a^b f(x)dx\) es un número que representa el área bajo la curva en el intervalo \((a,b)\).

  • Aplicado en estadística para calcular probabilidades de variables aleatorias continuas.

  • Si \(f(x)\) es una función de densidad (normal, gamma, etc),

\[\operatorname{Pr}(a < X < b) = \int_{a}^b f(x)dx\]

\[\operatorname{Pr}(a < X < b) = \int_{a}^b f(x)dx\]

Calcular Integrales

  • Analíticamente:

\[F(x) = \int f(x)dx \quad \to \quad F(b) - F(a) = \int_a^b f(x)dx\]

Calcular Integrales

  • Métodos de Cuadratura

\[\int_a^b f(x)dx \approx \sum_{i = 1}^n \omega_i f(x_i)\]

Calcular Integrales

  • Métodos de Cuadratura: integrate(f, lower, upper)

    • f: función a calcular la integral.
    • lower y upper: límites inferior y superior para calcular la integral.

\[\texttt{integrate} = \int_{\texttt{lower}}^{\texttt{upper}} f(x)dx\] * Es posible especificar lower = -Inf y upper = Inf.

Ejemplos

\[f(x) = \frac{1}{\sqrt{2\pi}} e^{-\frac{1}{2}x^2} \quad \to \quad \int_{-\infty}^{\infty}f(x)dx\]

f <- function(x) (1/sqrt(2*pi))*exp(-x^2/2)
integrate(f,lower = -Inf, upper = Inf)
1 with absolute error < 9.4e-05

\[f(x|\lambda) = \lambda e^{-\lambda x} \quad \to \quad \int_{0}^{\infty}f(x)dx\]

f <- function(x, lambda) lambda*exp(-x*lambda)
integrate(f,lower = 0, upper = Inf, lambda = 2)
1 with absolute error < 5e-07

Ejemplos

  • Calcular \(\mathbb{E}(X)\) para la distribución Gamma\((k,v)\).

\[f(x) = \frac{k^v}{\Gamma(k)}x^{k-1}e^{-v x} \quad \to \quad \mathbb{E}(X) = \int_0^{\infty} x f(x)dx\]

xfx <- function(x, k, v) x * (  (v^k/gamma(k)) *(x^(k-1))*exp(-v*x) )
integrate(xfx, lower = 0, upper = Inf, k = 4, v = 5)
0.8 with absolute error < 2.2e-08

Ejemplos

  • Calcular \(\operatorname{Var}(X)\) donde \(\mathbb{E}(X) = k/v\).

\[\operatorname{Var}(X) = \mathbb{E}((X - k/v)^2) = \int_{0}^{\infty} (x - k/v)^2 f(x)dx\]

varf <- function(x, k, v) (x - 0.8)^2 * (  (v^k/gamma(k)) *(x^(k-1))*exp(-v*x) )
integrate(varf, lower = 0, upper = Inf, k = 4, v = 5)
0.16 with absolute error < 6.4e-06

Actividad Bonificada

Calcule la probabilidad de que una variable aleatoria que sigue una distribución normal de media 9 y varianza 1 sea menor a 10, \(\operatorname{Pr}(X < 10)\).

\[\operatorname{Pr}(X < 10) = \int_{-\infty}^{10} \frac{1}{\sqrt{2\pi}}e^{-\frac{1}{2}(x-9)^2} dx\]

Calcular Integrales: Método de Montecarlo.

  • Sea \(X \sim\) Uniforme(0,1). Entonces, \[\int_{0}^1 f(x)dx = \mathbb{E}(f(X))\]

  • Los promedios muestrales, \(\bar{x}\), aproximan la esperanza \(\mathbb{E}(X)\).

\[\text{Si } n\to \infty \quad \Longrightarrow \quad \bar{x} \to \mathbb{E}(X)\] * El promedio de \(f(x_1), \dots, f(x_n)\) aproximan \(\mathbb{E}(f(X))\).

Calcular Integrales: Método de Montecarlo.

  • Así, si \(x_1,\dots,x_n\) son valores simulados a partir de una distribución Uniforme(0,1), entonces

\[\int_0^1 f(x)dx \approx \frac{1}{n}\sum_{i = 1}^n f(x_i),\]

Calcular Integrales: Método de Montecarlo.

\[\int_{0}^{1}\frac{1}{\sqrt{2\pi}} e^{-\frac{1}{2}x^2}dx\]

  • Cálculo con Cuadratura:
f <- function(x) (1/sqrt(2*pi))*exp(-x^2/2)
integrate(f,lower = 0, upper = 1)
0.3413447 with absolute error < 3.8e-15
  • Cálculo con Integración de Montecarlo:
  1. Simular \(x_1,\dots, x_n \sim\) Uniforme(0,1)

  2. Evaluar \(f(x_1), \dots, f(x_n)\).

  3. Aproximar la integral con \(\frac{1}{n}\sum_{i = 1}^n f(x_i)\).

f <- function(x) (1/sqrt(2*pi))*exp(-x^2/2)

# 1. Simular valores uniforme:
x <- runif(n = 10000)

# 2. Evaluar cada valor:
fx <- f(x)

# 3. Aproximar la integral
mean(fx) 
[1] 0.3418789
  • El método es sencillo pero de lenta convergencia.

  • Para una integral en \((a,b)\), se puede usar cualquier distribución de probabilidad que tenga soporte en \((a,b)\).

  • Suponga \(X \sim g(x)\) donde \(g(x) > 0\) para todo \(x\).

\[I = \int_{a}^b f(x)dx = \int_{a}^b \frac{f(x)}{g(x)}g(x)dx\]

  • Para una muestra \(x_1, \dots, x_n\), aproximamos \(I\):

\[\hat{I} = \frac{1}{n}\sum_{i = 1}^n \frac{f(x_i)}{g(x_i)}\].

\[\int_{0}^{1}\frac{1}{\sqrt{2\pi}} e^{-\frac{1}{2}x^2}dx\]

  • Usemos una variable aleatoria Beta(2,2) (que tiene soporte en (0,1)) para aproximar la integral.
f <- function(x) (1/sqrt(2*pi))*exp(-x^2/2)

# Función de muestreo: Beta(2, 2)
g <- function(x) dbeta(x, 2, 2)

# Simular valores desde Beta(2, 2)
set.seed(123)
n <- 10000
x <- rbeta(n, 2, 2)

## Estimacion de la integral:
mean(f(x) / g(x))
[1] 0.3483796






EPG3308: Computación Estadística

Clase 08: tidyverse y otras librerías

Profesor: Hernán Robledo Araya (harobledo@uc.cl)
Ayudante: Josefa Silva Muñoz (josefa.silva@alumni.uc.cl)

Primer Semestre - 2025

Colección de paquetes de R diseñados para Ciencia de Datos

dplyr: nueva sintaxis y herramientas para manipulación de datos.

tibble: Mejoras los data.frame para dar más legibilidad.

readr: Importación de Datos de forma rápida y eficiente.

ggplot2: Creación gráficos complejos a partir de una nueva gramática.

forcats: Facilita la manipulación de factores, como reordenar, agrupar y recodificar niveles.

tidyr: Incluye funciones para organizar y estructurar datos.

stringr: Manipulación de cadenas de texto con funciones consistentes como str_detect(), str_replace().

purrr: Programación funcional sobre listas y vectores usando funciones como map(), walk(), reduce().

Pipes: %>%

mean(x)          -         x %>% mean()

  • Procesar una tabla sin pipes:
tabla <- data.frame(Titanic)
tabla <- tabla[,c("Class", "Sex", "Age", "Survived", "Freq")]
tabla <- tabla[order(tabla$Freq),]
tabla <- tabla[tabla$Age == "Child",]
names(tabla) <- c("Clase", "Sexo", "Edad", "Sobrevivio", "Frecuencia")
  • Procesar una tabla con pipes (y dplyr):
tabla <- Titanic %>%
  data.frame() %>% 
  select(Class, Sex, Age, Survived, Freq) %>% 
  arrange(Freq) %>% 
  filter(Age == "Child") %>% 
  rename("Clase" = "Class", "Sexo" = "Sex", "Edad" = "Age", "Sobrevivio" = "Survived", "Frecuencia" = "Freq")

select() para seleccionar o deseleccionar variables.


Titanic %>% data.frame() %>% 
  select(Class, Sex) %>% head(3)
  Class  Sex
1   1st Male
2   2nd Male
3   3rd Male


Titanic %>% data.frame() %>% 
  select(-Age, -Survived, -Freq) %>% head(3)
  Class  Sex
1   1st Male
2   2nd Male
3   3rd Male

arrange() para ordenar las filas de una tabla .


Titanic %>% data.frame() %>% 
  arrange(Freq, Sex) %>% head(3)
  Class  Sex   Age Survived Freq
1   1st Male Child       No    0
2   2nd Male Child       No    0
3  Crew Male Child       No    0


Titanic %>% data.frame() %>% 
  arrange(Freq, desc(Sex)) %>% head(3)
  Class    Sex   Age Survived Freq
1   1st Female Child       No    0
2   2nd Female Child       No    0
3  Crew Female Child       No    0

filter() para una tabla de datos según algún criterio.

Titanic %>% data.frame() %>% 
  filter(Class == "1st") %>% head(3)
  Class    Sex   Age Survived Freq
1   1st   Male Child       No    0
2   1st Female Child       No    0
3   1st   Male Adult       No  118


Titanic %>% data.frame() %>% 
  filter(Sex == "Male" & Freq  > 0)  %>% head(3)
  Class  Sex   Age Survived Freq
1   3rd Male Child       No   35
2   1st Male Adult       No  118
3   2nd Male Adult       No  154
  • En dplyr no hace falta escribir Titanic$Sex para referirnos a la variable.

mutate() para crear nuevas variables o modificar variables existentes en una tabla.


mtcars %>%
  mutate(mpg = mpg * 1.6)  # Modificar variable


Crear varias variables a la vez:

mtcars %>%
  mutate(peso_kg = wt * 1000 * 0.453592,
         eficiencia = mpg / wt,
         nuevavar = NA)

summarise() o summarize() para calcular resumenes estadísticos.

mtcars %>%
  summarise(
    media_mpg = mean(mpg),
    mediana_mpg = median(mpg),
    desv_mpg = sd(mpg),
    n = n()
  )
  media_mpg mediana_mpg desv_mpg  n
1  20.09062        19.2 6.026948 32


mtcars %>%
  summarise(
    prop_manual = mean(am == 1),
    autos_livianos = sum(wt < 2.5)
  )
  prop_manual autos_livianos
1     0.40625              8

group_by para realizar cálculos agrupados.

  • Calcular promedio de mpg para cada categoría de cyl.
mtcars %>%
  group_by(cyl) %>%
  summarise(media_mpg = mean(mpg))
# A tibble: 3 × 2
    cyl media_mpg
  <dbl>     <dbl>
1     4      26.7
2     6      19.7
3     8      15.1
mtcars %>%
  group_by(cyl) %>%
  summarise(prop_manual = mean(am == 1))
# A tibble: 3 × 2
    cyl prop_manual
  <dbl>       <dbl>
1     4       0.727
2     6       0.429
3     8       0.143

Cruces de Tablas

Fuente de Imagen

Cruces de Tablas

Cuatro tipos de cruces de tablas:

  1. Left Join - Cruce Izquierdo
  2. Right Join - Cruce Derecho
  3. Inner Join - Cruce Interno
  4. Outer/Full Join - Cruce Completo

Cruces de Tablas

Fuente de Imagen

Cruces de Tablas

Cruces de Tablas

Cruces de Tablas

Cruces de Tablas

Cruces de Tablas

Cruces de Tablas

# Tablas base
Tab1 <- tibble(
  ID = c(1, 2, 4, 5),
  X = c("%", "%", "%", "%")
)

Tab2 <- tibble(
  ID = c(1, 3, 4, 6),
  Y = c("%", "%", "%", "%")
)

Tab1 %>% left_join(Tab2, by = "ID")

Tab1 %>% right_join(Tab2, by = "ID")

Tab1 %>% inner_join(Tab2, by = "ID")

Tab1 %>% full_join(Tab2, by = "ID")

Actividad

Considere la base de datos starwars del paquete dplyr.

  1. Seleccione las columnas name, species, height, mass, gender.

  2. Filtre por los personajes humanos que miden más de 180 cm.

  3. Ordene los personajes por peso (mass) de mayor a menor.

  4. Añada una nueva columna a la tabla que corresponda al IMC (masa/(altura en cm)^2).

Actividad

  1. Agrupando por especie, calcule el número de personajes, la altura promedio, y el peso promedio. mass

  2. Considere ahora la tabla flights y airlines que contienen información sobre todos los vuelos que salieron desde Nueva York en 2013. Obtenga una nueva tabla cuya primera columna corresponda al nombre completo de la aerolínea, la segunda indique el número total de vuelos realizados por dicha aerolínea, la tercera muestre el tiempo promedio en el aire de estos vuelos (air_time), y la cuarta indique la distancia promedio entre aeropuertos (distance).

Librerías útiles fuera de tidyverse:

  • data.table: versión rápida y eficiente de data.frame, ideal para filtrar, agrupar y transformar grandes conjuntos de datos.

  • parallel: permite ejecutar tareas en varios núcleos del procesador para acelerar operaciones intensivas.

  • lubridate: simplifica el manejo de fechas y horas, permitiendo extraer componentes y realizar cálculos fácilmente.

data.table

  • Es una versión optimizada de data.frame.
  • Pensada para trabajar con grandes volúmenes de datos de forma rápida y eficiente.
    • Evita copiar datos innecesariamente.
    • Procedimientos optimizados para tablas enormes.
  • Sintaxis especial: DT[i, j, by]
    • i: filas a seleccionar (filtro)
    • j: columnas a seleccionar o calcular.
    • by: agrupamiento.

data.table

library(data.table)
DT <- as.data.table(mtcars)

# Filtrar filas
DT[mpg > 25]

# Seleccionar columnas
DT[, .(mpg, hp)]

# Agregar columnas nuevas
DT[, peso_kg := wt * 1000 * 0.453592]

# Agrupación y resumen
DT[, .(media_hp = mean(hp)), by = cyl]

parallel

  • Ejecutar código en varios núcleos del procesador.

  • Acelerar tareas intensivas como simulaciones, cálculos repetitivos o procesamiento de grandes volúmenes de datos.

  • Funciona creando procesos hijos (workers) que ejecutan tareas en paralelo.

  • Importante: cada proceso es una sesión de R abierta. Controlar la RAM.

parallel

Funciones principales

  • detectCores(): identifica cuántos núcleos tiene tu equipo.
  • makeCluster(): crea un clúster de procesos.
  • parLapply(): aplica funciones en paralelo sobre un clúster.

parallel

library(parallel)

# Número de núcleos disponibles
nucleos <- detectCores()

# Crear un clúster con 4 núcleos
cl <- makeCluster(4)

# Función a aplicar
cuadrado <- function(x) x^2

# Aplicar en paralelo sobre 1:10
parLapply(cl, 1:10, cuadrado)

# Cerrar el clúster
stopCluster(cl)

lubridate

  • Librería para trabajar con fechas y horas en R de manera simple y legible.

  • Permite:

    • Parsear fechas en texto: ymd(), mdy(), dmy(), etc.
    • Extraer componentes: year(), month(), day(), hour(), etc.
    • Hacer operaciones: sumar días, calcular diferencias, redondear tiempos.
  • Hace el código más claro que trabajar con as.Date() o POSIXct manualmente.

lubridate

library(lubridate)

# Crear una fecha desde texto
fecha <- ymd("2023-10-01")

# Extraer componentes
year(fecha)      # 2023
month(fecha)     # 10
wday(fecha, label = TRUE)  # "Sun"

# Sumar días
fecha + days(5)  # "2023-10-06"

# Fechas desde texto con distintos formatos
dmy("12-04-2023")  # 2023-04-12
mdy("04-12-2023")  # 2023-04-12

Próxima clase:






EPG3308: Computación Estadística

Clase 09: Shiny

Profesor: Hernán Robledo Araya (harobledo@uc.cl)
Ayudante: Josefa Silva Muñoz (josefa.silva@alumni.uc.cl)

Primer Semestre - 2025

  • Paquete para construir aplicaciones web interactivas.
  • Ideal para:
    • Visualización de datos
    • Dashboards
    • Herramientas docentes

¿Por qué usar Shiny?

  • Facilita la interacción con estadística sin necesidad de programar.
  • Se integra directamente con R y RStudio.
  • Permite compartir fácilmente aplicaciones vía:
    • https://www.shinyapps.io
    • Servidores propios

Aplicaciones de Shiny

  • Visualización de datos en tiempo real

  • Formularios interactivos

  • Simulaciones estadísticas

  • Herramientas de enseñanza

  • Ejemplos en la Galería de Posit:

https://shiny.posit.co/gallery/

Estructura de una Shiny App


Estructura de una Shiny App

Ejemplo: Grafica Histograma


Estructura de una Shiny App

library(shiny)

ui <- TipoDePagina(
  ## Se controla que elementos verá el usuario y con cuales
  ## podrá interactuar.
)

server <- function(input ,output){
  # Es el cerebro de la aplicacion.
  # Aqui se hacen todos los cálculos de acuerdo a los inputs recibidos. 
  
}

# Inicializacion de la App
shinyApp(ui = ui, server = server)

UI: Interfaz de Usuario

  • ui <- fluidPage(): página que se adopta al tamaño de la pantalla.
  • ui <- navbarPage(): página con pestañas para múltiples secciones.
  • ui <- dashboard(): interfaz tipo dashboard.

UI: Interfaz de Usuario

library(shiny)
ui <- fluidPage(  # Tipo de Pagina: Pagina Fluida
  sidebarLayout(  # Estructura Interna: Barra Lateral y Panel Principal
    sidebarPanel( # Barra Lateral
      # Todo lo que vaya en la barra lateral
    ),
    
    mainPanel(    # Panel Principal
      # Todo lo que vaya en el panel principal
    )
  )
)

server <- function(input, output) {} # Server vacio

shinyApp(ui,server)

UI: Interfaz de Usuario

library(shiny)
ui <- navbarPage("Mi App",
  tabPanel("Inicio"),
  tabPanel("Análisis")
)


server <- function(input, output) {} # Server vacio

shinyApp(ui,server)

Menús de Interacción del Usuario

  • numericInput(): cuadro para ingresar un número.
  • textInput(): cuadro para ingresar texto.
  • selectInput(): menú para selección múltiple.
  • sliderInput(): barra para seleccionar un número de un rango.
  • dateInput(): cuadro para ingresar una fecha.
  • fileInput(): menú para adjuntar un archivo.

Menús de Interacción del Usuario

library(shiny)
ui <- fluidPage(
  sidebarLayout(  
    sidebarPanel( 
      numericInput(inputId = "inp1", label = "Ingrese Valor", value = 5, min = 1, max = 10),
      
      textInput(inputId = "inp2", label = "Ingrese Texto"),
      
      selectInput(inputId = "inp3", label = "Seleccione opción.",choices = c("A", "B", "C"), multiple = FALSE),
      
      sliderInput(inputId = "inp4", label = "Seleccione un número",min = 1, max = 10, value = 5)
    ),
    
    mainPanel(    
    )
  )
)


server <- function(input, output) {} # Server vacio

shinyApp(ui,server)

server

  • server trae cálculos que se ejecutan al iniciar la app.

  • Los datos generados en UI llegan al server a través de la lista input.

    • Cada xxxxxInput tiene un inputId que define objeto.
numericInput(inputId = "numero", ...)
textInput(inputId = "texto", ...)

server <- function(input, output){
  input$numero # para acceder a input de numericInput
  input$texto # para acceder a input de textInput
}

server

  • Guardar en output elementos a imprimir en UI.
    • Como input, output también se comporta como una lista
server <- function(input, output){
  output$ImprNum <- paste0("El numero seleccionado es ", input$numero)
}
  • Especificar en UI cómo imprimir output.
ui <- fluidPage(
  
  textOutput(outputId = "ImprNum")
  
)

server

  • Los valores generados por xxxxxInput son denominados Valores Reactivos.

    • Valores Reactivos: almacenan un valor que puede cambiar en el tiempo.
  • Llamadas de input$Objeto en server deben estar dentro de Entorno Reactivo.

output$ImprNum <- reactive({   <<------
  paste0("El numero seleccionado es ", input$numero)
})

Código completo:

library(shiny)
ui <- fluidPage(
  ### Inputs:
  numericInput(inputId = "Numero", label = "Ingrese un número", value = 1)
  
  ### Outputs:
  textOutput(outputId = "ImprNum")
)


server <- function(input, output){
  output$ImprNum <- reactive({
    paste0("El numero seleccionado es ", input$Numero)
  })
}

shinyApp(ui, server)

Entornos Reactivos

  • reactive(): encapsula código que depende de input y devuelve un resultado reactivo.
    • Sólo se ejecuta cuando es necesario.
    • No permite generar efectos visibles en UI.
Numero <- reactive({
    input$Numero
})

Entornos Reactivos

  • observe(): observador que permite generar efectos visibles en UI.
    • Se ejecuta cuando cambia alguna de sus dependencias.
    • No devuelve valor como reactive().
observe({
  print(input$nombre)
})

Entornos Reactivos

  • observeEvent(): observador que se ejecuta cuando ocurre un evento específico.
    • Útil para reaccionar a clics en botones.
observeEvent(input$boton, {
  showNotification("¡Botón presionado!")
})

Entornos Reactivos

  • eventReactive(): similar a reactive() pero sólo se actualiza cuando ocurre un evento específico.
    • Devuelve un objeto reactivo.
resultado <- eventReactive(input$boton, {
  input$nombre
})

Visualización de Outputs

  • Imprimir una tabla y un gráfico en el UI.
  • Funciones renderXxxx para enviar de server a UI.
    • renderTable() y renderPlot()
server <- function(input, output){
  output$Tabla <- renderTable({
    head(iris)
  })
  
  output$Grafico <- renderPlot({
    hist(iris$Sepal.Length)
  })
}
  • renderTable y renderPlot son reactivos.

Visualización de Outputs

  • En UI debe configurarse cómo imprimir Grafico y Tabla.
ui <- fluidPage(
  
  tableOutput(outputId = "Tabla") # Nombre de objeto creado en server (output$Tabla)
  plotOutput(outputId = "Grafico") # Nombre de objeto creado en server (output$Grafico)
  
)

Código completo (incorpora botón para imprimir resultados):

library(shiny)

ui <- fluidPage(
  # Input
  actionButton(inputId = "PresionaBoton",
               label = "¿Mostrar Tabla y Gráfico?"),
  
  # Output
  tableOutput(outputId = "Tabla"),   # Nombre de objeto en output
  plotOutput(outputId = "Grafico")   # Nombre de objeto en output
)

server <- function(input, output) {
  observeEvent(input$PresionaBoton, { # Si se presiona boton se imprimen resultados
    output$Tabla <- renderTable({
      head(iris)  
    })
    output$Grafico <- renderPlot({
      hist(iris$Sepal.Length)
    })
  })
}
shinyApp(ui, server)

Visto hasta ahora:

  1. Estructura de Shiny App: UI + server.

  2. Distintos tipos de UI.

  3. Menús de Interacción - xxxxInput()

  4. Uso de input y generación de output en server.

  • Valores y Entornos Reactivos.
  1. Visualización de output en UI:
  • renderTable y renderPlot en server.
  • tableOutput y plotOutput en UI.

Actividad 1

Sin ejecutar la app, identifiquemos cómo esta interactua con usuario, qué inputs genera, cómo los procesa, qué outputs genera, y cuales imprime.

library(shiny)
ui <- bootstrapPage(
  
  selectInput(inputId = "n_barras",
              label = "Número de barras en el histograma (aproximado):",
              choices = c(10, 20, 35, 50),
              selected = 20),
  
  checkboxInput(inputId = "mostrar_obs",
                label = strong("Mostrar observaciones individuales"),
                value = FALSE),
  
  checkboxInput(inputId = "mostrar_densidad",
                label = strong("Mostrar estimación de densidad"),
                value = FALSE),
  
  plotOutput(outputId = "grafico_principal", height = "300px"),
  
  conditionalPanel(condition = "input.mostrar_densidad == true",
                   sliderInput(inputId = "ajuste_bw",
                               label = "Ajuste de ancho de banda:",
                               min = 0.2, max = 2, value = 1, step = 0.2)
  )
)

server <- function(input, output) {
  
  output$grafico_principal <- renderPlot({
    
    hist(faithful$eruptions,
         probability = TRUE,
         breaks = as.numeric(input$n_bins),
         xlab = "Duración (minutos)",
         main = "Duración de erupciones del géiser")
    
    if (input$mostrar_obs) {
      rug(faithful$eruptions)
    }
    
    if (input$mostrar_densidad) {
      dens <- density(faithful$eruptions,
                      adjust = input$ajuste_bw)
      lines(dens, col = "blue")
    }
    
  })
}


shinyApp(ui, server)

Actividad 2

Considere los datos iris sin la columna species. Diseñe una aplicación que haga lo siguiente:

  1. Usando selectInput permita al usuario seleccionar una variable.

  2. Usando selectInput permita al usuario seleccionar una segunda variable.

  3. Con las dos variables seleccionadas anteriormente, imprimir un gráfico de dispersión. Ayuda: acceda a las variables usando tabla[[input$variable1]].

  4. Usando actionButton, permitir al usuario decidir si desea imprimir las primeras doce filas de una tabla generada con las dos variables seleccionadas anteriormente.