Resúmen sim digital 1er corte.
Qué es una simúlación.
Técnica numérica para conducir experimentos, que comprenden relaciones matemáticas
y lógicas, necesarias para describir el comportamiento de un sistema en el tiempo.
Sistema
TENDENCIAS SIMULACION
Gen numeros aleatorios
Simulacion montecarlo
Metodo para estimar el valor de una cantidad desconocida usando los principios de
estadistica inferencial:
Dado que es una dist uniforme, esta integral entre 0 y 1, es lo mismo que decir la media
para una generacion de numeros aleatorios con dist uniforme.
Generacion numeros aleatorios.
Alg para metodo multiplicativo congruencial
1. Definir funcion <- function(semilla, a, m, n)
2. Crear vector para guardar numeros generados
3. Asignar semilla inicial numeros[1] <- primer valor (semilla)
4. Ciclo for que usa la ecuacion para generar numeros
5. Return de esos numeros generados
6. Parametros de la ecuacion, semilla, a, m,n
7. Numeros_generados <- funcion(parametros)
8. Print(numeros_generados)
Alg para metodo de generadores congruenciales lineal
1. Definir funcion <- function(semilla, a, c,m, n)
2. Crear vector para guardar numeros generados
3. Asignar semilla inicial numeros[1] <- primer valor (semilla)
4. Ciclo for que usa la ecuacion para generar numeros
5. Return de esos numeros generados
6. Parametros de la ecuacion, semilla, a, m,n
7. Numeros_generados <- funcion(parametros)
8. Print(numeros_generados)
Si se desea tener los numeros normalizados (entre 0 y 1), se dividen los numeros
generados entre m
Para encontrar el periodo del generador para X_o semillas, (con n mayor a 16 para que
haya un periodo)
(mismos 8 pasos anteriores, solo que en vez de semilla inicial, se crea un vector de
semillas donde van a estar las X_0 semillas)
9. Ciclo for para recorrer el vector semillas (semilla in semillas)
10. Crear vector que guarde los numeros generados por la funcion que genera los
numeros pseudoaleatorios dados parametros (semilla, a,m,n)
11. Imprimir la semilla que genera esos numeros y los numeros generados por esa
semilla
12. Otro for dentro del for anterior para encontrar el periodo (donde se repite el valor
inicial)
13. Break
APLICACIONES GENERACION DE NUMEROS PSEUDOALEATORIOS
Integración Monte carlo
Hacer el cambio de variable en los limites de integración para que quedé entre 0 y 1, que
son los limites en los cuales el generador de numeros aleatorios nos va a dar una dist
uniforme
( 𝑥−𝑎)
𝑦 = ( 𝑏−𝑎)
Para el metodo Monte carlo
1. Generar puntos aleatorios y_i en el intervalo [0,1] (con runif)
2. Evaluar la función h(y_i) en esos puntos
3. Calcular el promedio de esos valores de h(y_i) y usarlos como estimación de la
integral.
Alg. Dependiendo de la función que sea dada para integrar (con limites de integración
entre a y b)
Parametros y,a,b
1. Asignar a una variable la funcion dada (x), g <- funcion(x) { return(funcion)}
2. Asignar la funcion h con el cambio de variable como dice la ecuación, donde “g” es
la variable con la funcion asignada del punto anterior
.h <- funcion(parametros) {return(h(y) como en la formula)}
3. Hacer la integracion metodo monte carlo (al haber hecho ya el cambio de variable
del punto anterior, se evalua esta funcion en los numeros generados
aleatoriamente, con limites 0,1)
Montecarlo <-funcion(g,a,b,N)
4. Generar # aleatorios con el runif(N),
5. Evaluar la funcion evaluada en esos puntos aleatorios con los limites de
integracion, hY<-(parametros, #aleatorios,a,b)
6. Calcular el promedio de los valores de hy (aprovechando que ahora es una funcion
descrita con valores aleatorios de dist uniforme) prome <- mean(hy)
7. Integral de montecarlo es igual a esa media, return(mean(hy))
8. Asignar los parametros, a<-0, b...., N <- #puntos aleatorios
9. Calcular integral, integral <- montecarlo(g,a,b,N)
10. Mostrar resultado Cat(“estimacion:”, integral,”\n”)
Recordatorio( la funcion que nos den entre a y b, es g(x), la funcion transformada con el
cambio de variable es h(y), runif genera los # aleatorios entre 0 y 1, “mean” es el promedio
de h(y))
Entre mas grande sea el valor de N, mejor será la estimación.
Similar a la integracion entre a y b, se busca hacer un cambio de variable que asemeje el 0
y el infinito de la funcion g(x) dada
1. Generar puntos aleatorios y_i entre [0,1]
2. Evaluar función h(y_i) en esos puntos
3. Calcular promedio valores h(y_i), estimacino de integral montecarlo
Alg int montecarlo entre 0 y infinito
1. Asignar a una variable g la funcion que sea dada, que recibe como parametro la
variable x que tenga esa funcion .g <- funcion(x) { return(funciondada(x))}
2. Crear funcion h con el cambio de variable para el h(y),donde como en la formula de
cambio de variable, en terminos de x, luego retorna la funcion g del
punto anterior con parametro X, que ahora depende de Y, y se completa el h(y)
como en la formula
3. Crear funcion monte_carlo <-function(con parametros la funcion dada y de entrada
los N # generados aleatoriamente)
4. Generar numeros aleatorios con runif
5. Evalua la funcion hy con esos numeros aleatorios, que recibe como parametros,
(los # generados aleatorios y la funcion con cambio de variable)
6. Promedio de los valores de hy, promedio <- mean(hy), return(mean(hy))
7. Asignar un valor para N, para los puntos generados
8. Resultado <- monte_carlo(parametros g,N)
9. Cat(“resultado”, resultado)
Recordatorios(funcion g es la funcion que nos den, funcionh(y) es la funcion con el cambio
de variable, runif genera # aleatorios, “sapply”h(y)<-sapply(y,h) evalua la funcion h(y) en
cada punto aleatorio y_i, mean calcula la media de h(y)) entre mas grande N mejor la
estimación de montecarlo
Test estadísticos de uniformidad e independencia
Util para datos <30, maxima dif entre 2 distribuciones, corresponde al estadistico D, si el
valor de la dif maxima entre dos distribuciones supera un valor critico de la tabla, se
rechaza la hipotesis nula.
1. Organizar los datos en una tabla
R(i) D+ D-
R(n)
2. Para cada R(i) calcular D + y D-
3. Luego buscar el valor mas grande de todos entre D+ y D-
4. Buscar en la tabla el valor critico D_alfa para el valor de significancia requerido
5. Si el valor D < D_alfa no se detecto diferencia entre la dist de R1...Rn y la dist
uniforme.
(al tratarse de una CDF, la probabilidad acumulada del 100% se reparte de forma uniforme
entre le numero de datos, esa es la idea del test, ver que tan cerca se encuentra estra dist
de numeros a la distribucion uniforme)
Codigo util para KS en R
Función “[Link]” que realiza el test de komogorov-smirnov
Muestra <- c(0,2,3,4,.....)
Resultado <- [Link](muestra, “punif”, 0,1)
Util para N>30, no solo evalua uniformidad, evalua cualquier dist de prob, comparando de
nuevo con la dist uniforme.
Es para N intervalos iguales, en los cuales se reparte la CDF, se cuentan los valores
Obtenidos, y los esperados, con N intervalos, se cuentan los valores obtenidos en ese
intervalo, y se resta con los valores esperados.
Entre mas bajo sea chi, mas cerca a un caso ideal, entre mas alto, algún valor del intervalo
recibe mas contribuciones.
Se define intervalo, anota la dist, se hacen las operaciones y se obtiene el valor chi, con el
que se va a comparar con el de la tabla.
Se compara para grados de libertad n-1
Codigo util en R para chi cuadrado, calvular valor chi para un alfa determinado
Qchisq(alfa, df=grados de libertad (n-1) , [Link] = FALSE)
Forma de identificar independencia entre los datos entre si
Se define un inicio i, y un salto L, y un M que es el entero mas grande tal que i+(M+1)L<_ N
(con N siendo los numeros en la secuencia)
1. Se hace la operacion de p_il y de o_pil
2. Se divide P_il entre O_pil, y se compara con el valor Z (qnorm), de una dist normal,
si este valor es mayor al del valor Z hay una correlacion positiva
3. La idea es acercarse a 0 lo mas posible, para acercarse a falta de independencia
entre los datos
Codigo util para valor Z en dist normal, valor de Z para cierto alfa, pa comparar
Qnorm(alfa, mean=0, sd=1, [Link] = FALSE)
CODIGOS de Rstudio
En la seccion inf derecha de Rstudio, se pude usar la pestaña help para tener
documentacion acerca de funciones de Rstudio.
X <- runif(n) # n valores generados de forma aleatoria dist uniforme
Sqrt(operacion) raiz cuadrada de lo que tenga adentro
Sum(sumatoria)
Cat(“mensaje”, argumento de ese texto o resultado, “otro resultado”, otro_resultado,
“\n”) #para imprimir un resultado
Mcg (minimos cuadrados generalizados)
Hist(histograma)
D <- [Link](x = arg, y = arg), crea una tabla de data con los argumentos
Plot (D), plotea lo que le de argumentos en X y Y)
#calcular una probabilidad estimada
Probabilidad <- coincidencias / num_simulaciones
#funcion piso, o floor, para operaciones discretas
F <- floor(runif(N)*+-/ etc, operacion, o nada)
#operaciones con length, el largo de un vector, para buscar coincidencias, o dividir una
sumatoria de una muestra entre el numero total de datos de dicha muestra
X <- Sum(muestra)/length(muestra)
Length(algo) != length(otro algo)
TUTORIAL R MARKDOWN DEL PROFESOR
title: "Tutorial R - Rmarkdown" author: "David Romo B., PhD" output: html_notebook
Esto es un enlace: R Markdown
Notebooks en R - R markdown
Subsección 1
Descripción sencilla del tutorial. Para agregar un bloque de código se puede utilizar
Ctrl+Alt+I:
plot(cars)
print('Hola mundo')
Puedo incluir ecuaciones utilizando la misma sintaxis de latex:
$$P(x<0)= \int_{-\inf}^{0} p(x)$$ donde $p(x)$ corresponde a la función de densidad de
probabilidad.
Por otro lado, el valor esperado de una variable aletoria discreta sería:
$$E[x] = \sum_{i=1}^k x_i*p(x_i)$$
pi_user = 3.14159
El valor de $\pi$ es r pi. Y el de pi_user es r pi_user
Nota 1: Esta es una nota Nota 2: Esta es una nota cursiva Nota 3: Esta es una nota tachada
Estructuras de control
Las estructuras de control permiten modificar el flujo de ejecución de un programa
dependiendo de las condiciones asociadas a variables o a la evaluación de expresiones.
Condicionales
Las estructuras condicionales permiten ejecutar diferentes bloques de código
dependiendo de determinadas condiciones:
x=10
#Edad de la persona
if (x>18) {
print("La persona es mayor de edad")
} else if (x==18){
print("La persona recién cumplió 18")
} else {
print("La persona es menor de edad")
}
Otro ejemplo:
r=5
if(r%%3==0){
print('El numero es divisible entre 3')
}else if(r%%2==0){
print('El número es par')
}else{
print('El numero no es divisible ni entre 2 ni entre 3')
}
También es posible asignar diferentes valores con la instrucción switch
x = "lugar"
y = switch(x, edad = 5, lugar="montaña", altura="1.75 cm")
print(y)
Estructuras repetitivas
Dentro de las estructucturas repetitivas podemos encontrar un par de estructuras que se
encuentran en una gran cantidad de lenguajes de programación: while y for.
y = 12
contador=0
while (y < 20) {
y = y + 1
contador = contador + 1
}
print(contador)
lugares= c("Floridablanca 16", "Piedecuesta 14", "Bucaramanga 14",
"Girón 7")
nodelugar = 0
for (x in lugares) {
t=nchar(x)
nodelugar = nodelugar + 1
print(paste("El lugar numero ", nodelugar, " tiene ", t,
"caracteres"))
}
La instrucción for también se puede ejecutar en una secuencia de números:
for(k in 1:10){
print(k)
}
Finalmente, se puede utilizar la estructura repeat para facilitar la construcción de bucles.
Se puede utilizar también la estructura next y break. Next continua directamente con la
siguiente iteración en el bucle, break finaliza la repetición de forma inmediata:
i=0
repeat{
i=i+1
if(i%%2==0)
next
print(i)
if(i==11)
break
}
Vectores
Una de las estructuras de datos básicas en el lenguaje R son los vectores. Esta estructura,
en esencia, contiene elementos de un único tipo. Estas son particularmente útiles para la
agrupación de elementos.
La manera más simple de crear un vector es usando el constructor c(). El constructor c()
se refiere a la combinación (combine) de elementos que genera un vector. Esto puede ser
usado para unir vectores, y así mismo, agregar elementos a un vector. De esta manera,
podemos agregar o combinar vectores con el fin de realizar diferentes tratamientos de
datos.
a <- c(10,15,20)
b <- c(12,14)
d <- c(a,b)
print(d)
print(a[1])
Se puede eliminar elementos usando el indizado con números negativos
c = d[-2]
print(d)
print(c)
También es posible generar secuencias de números con el operador :; alternativamente
es posible utilizar la función seq()
f <- 2:5
g <- seq(from=1,to=10,by=0.1)
print(f)
print(g)
Puedo utilizar indexación lógica para acceder a algunos de los elementos de un vector:
vector_idx <- 10:50
print(vector_idx%%2==1)
print(vector_idx[vector_idx%%2==1])
Listas y matrices
Listas
Las listas, son similares a los vectores, pero se pueden tener elementos de diferentes
tipos de dato. Para crear una lista, se puede utilizar la instrucción list().
x <- list() # De esta manera podemos crear una lista vacía
print(x)
y <- list(1, TRUE, "Fizz", 3.1) # Y así podemos crear una lista con
datos de cualquier tipo
print(y)
En R, los elementos de una lista pueden tener nombres asociados:
x <- list("Edades" = c(15, 17, 13), "Alturas" = c(1.68, 1.75, 1.40)) #
Creamos una lista dando nombre a cada uno de los elementos
print(x)
y <- list(c(15, 17, 13), c(1.68, 1.75, 1.40)) # O podemos crear la
lista
names(y) <- c("Grados", "Metros") # Y luego añadir los nombres
print(y)
Para acceder a un elemento de una lista con nombre, puedo utilizar el operador $:
x <- list("Años" = c(2001, 2004, 2008), "Bisiesto" = c(FALSE, TRUE,
TRUE)) # Tenemos esta lista
print(x$Año) # Y usando x$[Nombre] podemos acceder a los datos
correspondientes
print(x[2]) # puedo utilizar también los indices numéricos
Matrices
En R las matrices son vectores de 2 dimensiones. La creación de matrices puede hacerse
con el constructor matrix():
x <- matrix(1:4, nrow = 2, dimnames = list(c("X", "Y"), c("Cantidad",
"Altura")))
print(x) # Pasando una lista al parametro dimnames, con los nombres de
las filas y luego las columnas
En una matriz es posible acceder a los datos usando indices numéricos:
x <- matrix(1:9, nrow = 3, dimnames = list(c("X", "Y", "Z"),
c("Cantidad", "Altura", "Temperatura")))
print(x[1, ]) # Podemos acceder a la primera fila de la matrix
print(x[, 2]) # A la segunda columna
print(x[1:2, ]) # De la fila 1 a la 2
print(x[, 2:3]) # De la columna 2 a la 3
print(x[2, 1]) # O al elemento que está en la segunda fila y la
primera columna
Dataframes
Utilizaremos el dataframe cars que se encuentra disponible en R:
df1= cars
tail(df1)
summary(df1)
distancia = df1[,2]
print(distancia)
Para construir un dataframe a partir de un archivo csv, se puede utilizar la instrucción
[Link]. Ejemplo:
df <- [Link]('[Link]', header = T)
Funciones en R
Para definir funciones utilizo la siguiente sintaxis:
suma_3 <- function(n=10){
return(n+3)
}
suma_3()
Las funciones en R como en cualquier otro lenguaje son de suma importancia para evitar
la redundancia en el código y fomentar la reutilización de este. En R las funciones se
definen de la siguiente forma:
suma_bizarra <- function(x, y=2){
if(y%%2==0)
out <- x+y
else
out <- x
return(list(out, y))
}
suma_bizarra(10,6)
Visualización
t=seq(0,2*pi,pi/16)
f=sin(t)
plot(t,f)
boxplot(cars)
Pantallazos del mismo tutorial de R markdown del profesor.