Simulando variables aleatorias en SAS José Alberto Bonilla Vera Copyright © 2014, SAS Institute Inc. All rights reserved. Simulación Existen muchos problemas reales para los cuales es muy caro, muy difícil o inconveniente modelar exactamente el fenómeno Simulación (en este contexto) significa generar números pseudoaleatorios con características afines a una verdadera distribución aleatoria Es extremadamente útil (y utilizado) y las bases son sencillas • Apuestas, modelos estadísticos, pronósticos, criptografía, generación de datos de prueba, inteligencia artificial, videojuegos… Permite obtener un conocimiento integral de los diferentes escenarios posibles Copyright © 2014, SAS Institute Inc. All rights reserved. Generador de números (pseudo)aleatorios Es un dispositivo o programa computacional que genera números que parecen ser aleatorios • Tienen características afines a la “verdadera” aleatoriedad Varios tipos • Objetos comunes (monedas, dados, pirinolas etc.) • Dispositivos físicos (medición de ruido ambiental, decaimiento radiactivo, etc.) • Generador pseudoaleatorio de software (en adelante, PRNG) • Otros − Copyright © 2014, SAS Institute Inc. All rights reserved. PRNG Es un programa de software que toma como entrada una semilla y genera una secuencia de números que parecen ser aleatorios (pero no lo son) • De hecho, la secuencia es completamente determinística dada la semilla − Esto de hecho es bueno para simulación estadística, no bueno para criptografía Semilla: valor inicial. Dada la semilla, la secuencia siempre es la misma. Periodo: longitud de una determinada secuencia antes de repetirse. 0.4123,0.5155,0.9514,0.9615,0.1124,0.9595,0.5812,0.4145,0.8777… 1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,0,… ¿Cómo evaluar si un PRNG es “suficientemente aleatorio”? • Baterías de pruebas estadísticas basadas en propiedades de la distribución uniforme − DIEHARD, TestU01, … − Propiedades derivadas (paradoja de cumpleaños, repeticiones, Copyright © 2014, SAS Institute Inc. All rights reserved. PRNG (cont.) El primer PRNG se atribuye a John von Neumann (método de dígitos intermedios de cuadrados) • Toma un número de n dígitos • Elévalo al cuadrado • Toma los n dígitos intermedios • Repite el proceso El generador de Von Neumann es muy malo (¿qué pasa si comienzas con 0000?) Copyright © 2014, SAS Institute Inc. All rights reserved. PRNG (cont.) Después, vinieron los generadores congruenciales lineales • 𝑋𝑛+1 = 𝑎𝑋𝑛 + 𝑐 mod 𝑚 (parámetros < 𝑚) • Altamente dependientes de la elección de parámetros • El periodo de un GCL es a lo más, 𝑚; hay formas de elegir los parámetros para que el periodo sea maximal • Todavía muy usados (e.g. java.util.random) • El saber la semilla identifica el estado del generador • Hay buenos y malos (java.util.Random vs RANDU)Buenos para aplicaciones simples, pero no tanto para simulaciones Montecarlo ni para aplicaciones criptográficas − Por ejemplo, el Teorema de Marsaglia asevera que los puntos generados por un GCL de módulo 𝑚 en un espacio de 𝑛 dimensiones caen en a lo más 𝑛! 𝑚 serial) • RANXXX… en SAS es un generador congruencial lineal Copyright © 2014, SAS Institute Inc. All rights reserved. 1 𝑛 hiperplanos (correlación PRNG (cont.) Después, vinieron otros más sofisticados como Mersenne Twister • El más utilizado hoy en día • Periodo muy largo (219937 − 1) • El saber la semilla no identifica el estado del generador (tiene un vector de estados de 624 posiciones) • Excelentes propiedades, pasa las baterías de pruebas como Diehard • No apto para aplicaciones criptográficas Existen varios PRNG que son criptográficamente seguros (CSPRNG) • Idealmente, basado en hardware o procesos impredecibles • Deben pasar las pruebas estadísticas de aleatoriedad • Pero también debe ser imposible predecir números siguientes o anteriores incluso si se conoce información del estado actual • Por ejemplo Fortuna Copyright © 2014, SAS Institute Inc. All rights reserved. PRNG en SAS Existen dos principales conjuntos de funciones en SAS para PRNG: • RANUNI / RANNOR / … − GCL con periodo < 231 – ¡No es tan grande como parece! • RAND (o CALL RANDGEN en IML) − Mersenne Twister Los GCL RANUNI/RANNOR etc. no pasan tantas pruebas de aleatoriedad como RAND RAND tiene mejor manejo de valores de parámetros que se acercan a producir distribuciones degeneradas La sintaxis es mucho más sencilla y uniforme Consecuentemente, usen RAND / CALL RANDGEN siempre • Y sus funciones de probabilidad acumulada y cuantiles asociadas (CDF y QUANTILE) El resto de la presentación está enfocado a RAND (en paso DATA). Copyright © 2014, SAS Institute Inc. All rights reserved. Estableciendo la semilla Usar CALL STREAMINIT al inicio del paso DATA • Si el parámetro es no positivo, la semilla se inicializa con el reloj de la computadora • Si no, se inicializa con ese dato Si se llama RAND antes de CALL STREAMINIT, esa llamada hace referencia al generador sembrado con el reloj de la computadora Únicamente se honra una llamada a CALL STREAMINIT por paso DATA • Mersenne Twister no se puede “reinicializar” a la mitad con otro llamado de CALL STREAMINIT. Cada paso DATA es una instancia diferente del PRNG El valor de la semilla se guarda en la variable macro SYSRANDOM después de cada ejecución de paso DATA Copyright © 2014, SAS Institute Inc. All rights reserved. Simulando una variable aleatoria uniforme continua La sintaxis es: • x = RAND("UNIFORM"); Si se ha establecido la semilla en una línea anterior del paso DATA, se genera el siguiente número pseudoaleatorio de la secuencia definida por la semilla Si no se ha especificado semilla en ese paso DATA, entonces se genera utilizando el reloj de la computadora Compárese con la sintaxis del generador antiguo: • x = RANUNI(0); Copyright © 2014, SAS Institute Inc. All rights reserved. Simulando directamente con RAND Distribución Bernoulli Beta Sintaxis RAND("BERNOULLI",p); RAND("BETA",a,b); Parámetros p – Probabilidad de éxito [0,1] a, b – Parámetros de forma [0, ) Binomial Binomial Negativa RAND("BINOMIAL",p,n); RAND("NEGBINOMIAL",k,p); p – Probabilidad de éxito [0,1]; n – Número de ensayos Bernoulli {1,2,…} k – Número de éxitos deseados Bernoulli {1,2,…}; p – Probabilidad de éxito [0,1] Cauchy Erlang Exponencial RAND("CAUCHY"); RAND("ERLANG",k); RAND("EXPONENTIAL"); N/A k – Parámetro de forma {1,2,…} N/A F Gama Geométrica RAND("F",n,d); RAND("GAMMA",a); RAND("GEOMETRIC",p); Lognormal Normal Poisson n – Grados de libertad del numerador {1,2,…}; d – Grados de libertad del denominador {1,2,…} a – Parámetro de forma [0, ) p – Probabilidad de éxito [0,1] RAND("HYPERGEOMETRIC",N,R,n); N – Tamaño de población {1,2,…}; R – Número de objetos de interés en la población {0,1,…,N}; n – Tamaño de muestra {1,2,…,N} RAND("CHISQUARE",df); df – Número de grados de libertad (0, ) RAND("LOGNORMAL"); N/A RAND("NORMAL",m,s); m – Media (real); s – Desviación estándar (0, ) RAND("POISSON",m); m – Razón promedio de ocurrencia de eventos T (de Student) Tabular Triangular RAND("T",df); RAND("TABLE",p1,p2,…); RAND("TRIANGLE",h); df – Número de grados de libertad (0, ) p1, p2, … - Probabilidades de ocurrencia de cada valor 1,2,… h – Abcisa en donde se localiza el vértice superior del triángulo [0,1 Uniforme Continua Weibull RAND("UNIFORM"); RAND("WEIBULL",a,b); N/A a – Parámetro de forma (0, ); b – Parámetro de escala (0, ) Hipergeométrica Ji Cuadrada Copyright © 2014, SAS Institute Inc. All rights reserved. Simulando vía transformación Identificar transformación teórica Generar variable aleatoria base Realizar transformación teórica en las pseudoaleatorias generadas Ejemplos • Generar una uniforme en 𝑎, 𝑏 mediante 𝑏 − 𝑎 𝑈 + 𝑎 • Si 𝑋 es una variable aleatoria estándar, entonces 𝑌 = 𝜃 + 𝜎𝑋 es una variable aleatoria con localización 𝜃 y parámetro de escala 𝜎 − El parámetro de escala es el recíproco del parámetro de tasa/razón • Generar una lognormal usando 𝑌 = 𝑒 𝑋 donde 𝑋~𝑁 𝜇, 𝜎 2 • Generar una Pareto usando 𝑌 = 𝑚 𝑒 𝑋 donde 𝑋~𝐸𝑥𝑝 𝜆 Copyright © 2014, SAS Institute Inc. All rights reserved. Simulando mediante otros métodos Método de la distribución inversa • Si 𝑋~𝐹 𝑥 y u~𝑈 0,1 entonces 𝑣 = 𝐹 −1 𝑢 ~𝐹 𝑥 • Por lo tanto: − Simular un número pseudoaleatorio uniforme continuo − Aplicar la inversa de la distribución acumulada a dicho número – Directamente (forma cerrada de la inversa) – Mediante métodos numéricos (por ejemplo la inversa de la normal) • Ejemplo: Muestrear de la distribución empírica Método de aceptación-rechazo • Encontrar una función t 𝑥 cota superior de la densidad deseada 𝑓 𝑥 • Generar uniformes y aceptarlas si 𝑢𝑡 𝑥 ≤ 𝑓 𝑥 • Mientras mejor ajusta la función, la probabilidad de rechazo es más baja Muchos otros métodos (Metropolis-Hastings, variables antitéticas…) Copyright © 2014, SAS Institute Inc. All rights reserved. Simulando de conjuntos finitos CALL RANPERM permite generar permutaciones de (valores de) n variables SAS CALL RANPERK genera permutaciones de tamaño k en un conjunto de n CALL ALLPERM permite iterar sobre todas las permutaciones de un conjunto n PROC SURVEYSELECT permite muestrear de un dataset Copyright © 2014, SAS Institute Inc. All rights reserved. Simulando distribuciones de estadísticas (Monte Carlo) Simular una muestra de una distribución de interés y computar alguna estadística muestral Repetir este proceso muchas veces Analizar la distribución de las estadísticas muestrales y generar inferencia sobre la misma • Error estándar = desviación estándar de la distribución de la estadística • Se pueden computar descriptivos, intervalos de confianza, etc. Poder responder preguntas del estilo ¿cuál es la probabilidad de que la estadística esté en cierto rango? Copyright © 2014, SAS Institute Inc. All rights reserved. Funciones asociadas para las distribuciones estadísticas CDF computa el valor de la distribución acumulada de interés SDF computa el valor de la función de supervivencia PDF computa el valor de la función de masa o densidad de interés QUANTILE computa el percentil de la distribución deseada (función inversa de la distribución) Copyright © 2014, SAS Institute Inc. All rights reserved. ¿Cómo revisar si la simulación es adecuada? Revisar momentos muestrales vs momentos poblacionales Revisar la distribución empírica vs la distribución teórica Revisar el histograma empírico vs la densidad/función de masa teórica Realizar pruebas de bondad de ajuste Copyright © 2014, SAS Institute Inc. All rights reserved. Tips de eficiencia Identificar la muestra con un ID para poder usar procesamiento BY para procesar los estadísticos por muestra en Monte Carlo (usando PROC) Desactivar notas y salidas innecesarias en el log (opciones de debug, etc.) Exportar log a disco Preferir procesamiento BY a ciclos de macros en este contexto (para Monte Carlo) Usar IML para estudios más complejos o intensivos de simulación • IML permite simular muchas variables aleatorias con mejor performance que DATA y puede trabajar en memoria (RAM) • IML facilita enormemente simular de distribuciones multivariadas • IML soporta vectorización (trabajo de operaciones en memoria aplicadas a matrices o vectores) • IML soporta distribuciones adicionales • El trabajo con matrices hace que IML pueda generar simulaciones Monte Carlo más fácilmente Copyright © 2014, SAS Institute Inc. All rights reserved. Workshop 1. Elegir aleatoriamente el número de créditos hipotecarios en un Banco con alguna distribución de probabilidad adecuada (considerar al menos 1,000 créditos) 2. Modelar el saldo inicial de los créditos con alguna distribución de probabilidad adecuada y justificar la elección. 3. Modelar el número de pagos vencidos mediante una distribución tabular con probabilidades elegidas. 4. Simular el portafolio en el momento 𝑡0 en un dataset de SAS, generando un ID del crédito, el saldo y el número de pagos vencidos. 5. Generar datasets para el portafolio en los periodos 𝑡1 − 𝑡12 mediante la aplicación de las siguientes funciones (eligiendo b,f,h probabilidades de regreso, avance y permanencia de pago vencido respectivamente y 𝛽, 𝛾 son variables aleatorias Gama con parámetros adecuados) • 𝑝𝑣𝑡+1 Copyright © 2014, SAS Institute Inc. All rights reserved. max(0, 𝑝𝑣𝑡 − 1), 𝑐𝑜𝑛 𝑝𝑟𝑜𝑏𝑎𝑏𝑖𝑙𝑖𝑑𝑎𝑑 𝑏 𝑝𝑣𝑡 + 1, 𝑐𝑜𝑛 𝑝𝑟𝑜𝑏𝑎𝑏𝑖𝑙𝑖𝑑𝑎𝑑 𝑓 = 𝑝𝑣𝑡 , 𝑐𝑜𝑛 𝑝𝑟𝑜𝑏𝑎𝑏𝑖𝑙𝑖𝑑𝑎𝑑 ℎ 𝑆𝑡+1 𝛽𝑆𝑡 , 𝑐𝑜𝑛 𝑝𝑟𝑜𝑏𝑎𝑏𝑖𝑙𝑖𝑑𝑎𝑑 𝑏 = 𝛾𝑆𝑡 , 𝑐𝑜𝑛 𝑝𝑟𝑜𝑏𝑎𝑏𝑖𝑙𝑖𝑑𝑎𝑑 𝑓 𝑆𝑡 , 𝑐𝑜𝑛 𝑝𝑟𝑜𝑏𝑎𝑏𝑖𝑙𝑖𝑑𝑎𝑑 ℎ Workshop 6. Calcular la probabilidad de incumplimiento y el saldo total incumplido de los créditos vigentes en 𝑡0 que están vencidos en 𝑡12 . Utilice la definición de “vencido” de CNBV (4+ pagos vencidos). 7. Repetir el ejercicio 1,000 veces, generando los valores del punto 6 en cada iteración. 8. Utilizar un método Monte Carlo para computar la media y la desviación estándar de la probabilidad de incumplimiento y del saldo total incumplido. Para las simulaciones, utilizar una semilla aleatoria predeterminada almacenada en una variable macro. Copyright © 2014, SAS Institute Inc. All rights reserved. Lectura recomendada Ross, S. (2012) Simulation. Academic Press, 328 pp. Wicklin, R. (2013) Simulating Data With SAS. SAS Institute, 364 pp. Wicklin, R. The DO Loop. En http://blogs.sas.com/content/iml/author/rickwicklin/, consultado el 21 de agosto de 2014 Bonilla, J (2004) Valuación de Proyectos de Inversión en Ambientes de Incertidumbre. ITAM, 161 pp. Copyright © 2014, SAS Institute Inc. All rights reserved.