Simulando variables aleatorias en SAS - sasCommunity · −GCL con periodo < 231 –¡No es tan...

21
Copyright © 2014, SAS Institute Inc. All rights reserved. Simulando variables aleatorias en SAS José Alberto Bonilla Vera

Transcript of Simulando variables aleatorias en SAS - sasCommunity · −GCL con periodo < 231 –¡No es tan...

Copyright © 2014, SAS Institute Inc. All rights reserved.

Simulando variables aleatorias en SASJosé 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 𝑛!𝑚1

𝑛 hiperplanos (correlación serial)

• RANXXX… en SAS es un generador congruencial lineal

Copyright © 2014, SAS Institute Inc. All rights reserved.

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 Sintaxis Parámetros

Bernoulli RAND("BERNOULLI",p); p – Probabilidad de éxito [0,1]

Beta RAND("BETA",a,b); a, b – Parámetros de forma [0, )

Binomial RAND("BINOMIAL",p,n); p – Probabilidad de éxito [0,1]; n – Número de ensayos Bernoulli {1,2,…}

Binomial Negativa RAND("NEGBINOMIAL",k,p); k – Número de éxitos deseados Bernoulli {1,2,…}; p – Probabilidad de éxito [0,1]

Cauchy RAND("CAUCHY"); N/A

Erlang RAND("ERLANG",k); k – Parámetro de forma {1,2,…}

Exponencial RAND("EXPONENTIAL"); N/A

F RAND("F",n,d); n – Grados de libertad del numerador {1,2,…}; d – Grados de libertad del denominador {1,2,…}

Gama RAND("GAMMA",a); a – Parámetro de forma [0, )

Geométrica RAND("GEOMETRIC",p); p – Probabilidad de éxito [0,1]

Hipergeométrica 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}

Ji Cuadrada RAND("CHISQUARE",df); df – Número de grados de libertad (0, )

Lognormal RAND("LOGNORMAL"); N/A

Normal RAND("NORMAL",m,s); m – Media (real); s – Desviación estándar (0, )

Poisson RAND("POISSON",m); m – Razón promedio de ocurrencia de eventos

T (de Student) RAND("T",df); df – Número de grados de libertad (0, )

Tabular RAND("TABLE",p1,p2,…); p1, p2, … - Probabilidades de ocurrencia de cada valor 1,2,…

Triangular RAND("TRIANGLE",h); h – Abcisa en donde se localiza el vértice superior del triángulo [0,1

Uniforme Continua RAND("UNIFORM"); N/A

Weibull RAND("WEIBULL",a,b); a – Parámetro de forma (0, ); b – Parámetro de escala (0, )

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 =

max(0, 𝑝𝑣𝑡 − 1), 𝑐𝑜𝑛 𝑝𝑟𝑜𝑏𝑎𝑏𝑖𝑙𝑖𝑑𝑎𝑑 𝑏𝑝𝑣𝑡 + 1, 𝑐𝑜𝑛 𝑝𝑟𝑜𝑏𝑎𝑏𝑖𝑙𝑖𝑑𝑎𝑑 𝑓𝑝𝑣𝑡, 𝑐𝑜𝑛 𝑝𝑟𝑜𝑏𝑎𝑏𝑖𝑙𝑖𝑑𝑎𝑑 ℎ

𝑆𝑡+1 =

𝛽𝑆𝑡, 𝑐𝑜𝑛 𝑝𝑟𝑜𝑏𝑎𝑏𝑖𝑙𝑖𝑑𝑎𝑑 𝑏𝛾𝑆𝑡, 𝑐𝑜𝑛 𝑝𝑟𝑜𝑏𝑎𝑏𝑖𝑙𝑖𝑑𝑎𝑑 𝑓𝑆𝑡, 𝑐𝑜𝑛 𝑝𝑟𝑜𝑏𝑎𝑏𝑖𝑙𝑖𝑑𝑎𝑑 ℎ

Copyright © 2014, SAS Institute Inc. All rights reserved.

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.