¿Cómo puedo generar series de tiempo binarias tales que:
- Se especifica la probabilidad promedio de observar 1 (digamos 5%);
- ¿Probabilidad condicional de observar 1 en el tiempo dado el valor en (digamos 30% si el valor de era 1)?
fuente
¿Cómo puedo generar series de tiempo binarias tales que:
Use una cadena de Markov de dos estados.
Si los estados se llaman 0 y 1, entonces la cadena se puede representar mediante una matriz 2x2 que proporciona las probabilidades de transición entre estados, donde es la probabilidad de pasar del estado al estado . En esta matriz, cada fila debe sumar 1.0.
De la declaración 2, tenemos , y la conservación simple luego dice .
De la declaración 1, desea que la probabilidad a largo plazo (también llamada equilibrio o estado estacionario) sea . Esto dice P 1 = 0.05 = 0.3 P 1 + P 01 ( 1 - P 1 ) Resolver da P 01 = 0.0368421 y una matriz de transición P = ( 0.963158 0.0368421 0.7 0.3 )
(Puede verificar la corrección de su matriz de transición elevándola a una alta potencia, en este caso 14 hace el trabajo, cada fila del resultado da las mismas probabilidades de estado estacionario)
Ahora en su programa de números aleatorios, comience eligiendo aleatoriamente el estado 0 o 1; esto selecciona qué fila de estás usando. Luego use un número aleatorio uniforme para determinar el siguiente estado. Escupir ese número, enjuagar, repetir según sea necesario.
Intenté codificar la respuesta de @Mike Anderson en R. No pude entender cómo hacerlo usando sapply, así que usé un bucle. Cambié los problemas ligeramente para obtener un resultado más interesante, y usé 'A' y 'B' para representar los estados. Déjame saber lo que piensas.
/ edit: En respuesta al comentario de Paul, aquí hay una formulación más elegante
Escribí el código original cuando estaba aprendiendo R, así que no me preocupe. ;-)
Aquí le mostramos cómo calcularía la matriz de transición, dada la serie:
El orden se intercambia con mi matriz de transición original, pero obtiene las probabilidades correctas.
fuente
for
bucle sería un poco más limpio aquí, ya sabes la duraciónSeries
, así que solo úsalofor(i in 2:length(Series))
. Esto elimina la necesidad dei = i + 1
. Además, ¿por qué primero muestrearA
y luego convertir a0,1
? Puede probar directamente0
'sy1
' s.createAutocorBinSeries = function(n=100,mean=0.5,corr=0) { p01=corr*(1-mean)/mean createSeries(n,matrix(c(1-p01,p01,corr,1-corr),nrow=2,byrow=T)) };createAutocorBinSeries(n=100,mean=0.5,corr=0.9);createAutocorBinSeries(n=100,mean=0.5,corr=0.1);
para permitir una autocorrelación arbitraria y predeterminada del retraso 1Aquí hay una respuesta basada en el
markovchain
paquete que puede generalizarse a estructuras de dependencia más complejas.Esto te da:
fuente
He perdido la noción del documento donde se describió este enfoque, pero aquí va.
Descomponer la matriz de transición en
Una de las características útiles de esta descomposición es que se generaliza bastante directamente a la clase de modelos de Markov correlacionados en problemas dimensionales superiores.
fuente