5 votos

Simulación de paseo aleatorio con predicción "conocida"

Supongamos un paseo aleatorio que se parece un poco a esto

set.seed(420)
x=rnorm(1000)
y=rep(NA,length(x))
y[1]=x[1]
for (i in 2:length(x)) {
  y[i]=y[i-1]+x[i]*0.7
}

enter image description here

Pero no es un paseo aleatorio real como ese, y es algo que es muy difícil de predecir (piense en el clima). los primeros 700 puntos son datos reales, los otros 300 son predicciones.

Se supone que las predicciones son "verdaderas" de media deben seguir el camino indicado. Sin embargo, sospechamos que la trayectoria será mucho más variable de lo previsto, habrá subintervalos de valores más altos y/o más bajos, no deberían saltar hacia arriba o hacia abajo con demasiada fuerza.

Cómo podemos simular algunos paseos aleatorios, que oscilarán alrededor de las predicciones (teniendo una especie de media similar) pero con una variabilidad arbitraria. Sospechamos que habrá subintervalos con mayor correlación y por lo tanto aquí tardará más en volver a la media. Esto para tener una mejor idea de los posibles caminos / escenarios durante este tiempo.

0 votos

¿No sería la forma más fácil dibujar simplemente números aleatorios puntuales alrededor de sus predicciones? Si necesitas los incrementos originales, siempre puedes difundirlos. ¿Qué me falta?

0 votos

@StephanKolassa Añadir simplemente un poco de ruido aleatorio a las predicciones no es la mejor opción ya que el paseo será entonces demasiado variable, demasiado ruidoso. Debería haber cierta consistencia en la secuencia. No entiendo bien tu segundo punto.

0 votos

@StephanKolassa Supongamos que este paseo estaba asociado a la hora del día, por lo que esperamos que siga habiendo una especie de patrón, que debería estar presente también en las predicciones.

5voto

icelava Puntos 548

random_walks

Empecé por acortar su serie a 20 realizaciones, para que pudiéramos ver algo.

set.seed(420)
x=rnorm(20)
y=rep(NA,length(x))
y[1]=x[1]
for (i in 2:length(x)) y[i]=y[i-1]+x[i]*0.7

A continuación, he simulado cinco trayectorias (cada una de ellas con una longitud de seis). En primer lugar, extraigo 5 variables aleatorias normales con media 'y[15] . Then I draw another 5 normal random variables with mean y[16]`. Y así sucesivamente. Finalmente, conecto el primer conjunto, el segundo conjunto, hasta el quinto conjunto.

pred_index <- 15:20
n_sims <- 5
sd <- 0.2
sims <- sapply(y[pred_index],FUN=function(yy)rnorm(n_sims,mean=yy,sd=sd))

Esto nos da cinco trayectorias.

plot(y,type="l",lwd=2,ylim=range(c(y,sims)))
for ( jj in 1:n_sims ) lines(pred_index,sims[jj,],col="green")
lines(pred_index,y[pred_index],col="red",lwd=2)

Aquí están las simulaciones, con la última observación "real" en la primera columna:

> (foo <- cbind(y[pred_index[1]-1],sims))
          [,1]      [,2]      [,3]      [,4]      [,5]       [,6]       [,7]
[1,] -1.774497 -2.058771 -2.171860 -1.740961 -1.394201 -0.9514782 -1.6126567
[2,] -1.774497 -2.088186 -2.445334 -1.939621 -1.490676 -1.1473929 -1.5795282
[3,] -1.774497 -1.896928 -1.802883 -2.045344 -1.271107 -0.9969500 -0.9606348
[4,] -1.774497 -2.139482 -2.332128 -1.934507 -1.615830 -1.0684256 -1.1898377
[5,] -1.774497 -2.027070 -2.412320 -1.589246 -1.945217 -1.4398321 -1.1173766

Como se supone que se trata de un paseo aleatorio, podemos observar los incrementos por pasos dentro de cada simulación, simplemente tomando las diferencias sucesivas entre las columnas de esta matriz:

> sapply(1:ncol(sims),FUN=function(jj)foo[,jj+1]-foo[,jj])
           [,1]        [,2]       [,3]       [,4]      [,5]        [,6]
[1,] -0.2842738 -0.11308883  0.4308988  0.3467603 0.4427225 -0.66117845
[2,] -0.3136891 -0.35714748  0.5057129  0.4489450 0.3432831 -0.43213534
[3,] -0.1224306  0.09404472 -0.2424613  0.7742371 0.2741574  0.03631521
[4,] -0.3649842 -0.19264672  0.3976211  0.3186768 0.5474049 -0.12141211
[5,] -0.2525731 -0.38524925  0.8230736 -0.3559711 0.5053851  0.32245545

0 votos

+1 Si haces esto muchos veces, y se trazan las trayectorias individuales con un color transparente usando, digamos, gris pálido transparente (o verde pálido transparente :), entonces el gráfico resultante dará algo así como una densidad de predicciones en cada punto de tiempo, con regiones más oscuras correspondientes a una mayor densidad, y una impresión más clara de cómo se extiende la variabilidad alrededor de la predicción en el tiempo.

0 votos

Esta es una respuesta sencilla y agradable. Sin embargo, ¿no es lo mismo que generar valores aleatorios a partir de una distribución normal con media 0 y DE 0,2 y luego añadirlos a las predicciones? Al hacerlo, sólo estamos añadiendo ruido blanco a los datos, lo que no es deseable. No quiero predicciones más ruidosas, debería haber más variabilidad, pero debería tener una especie de patrón, sin demasiados saltos.

1 votos

He descubierto que si sustituyo su línea por sims=t(replicate(n_sims,arima.sim(list(ar=0.9),n=300)+y[701:‌​1000])) Obtengo una varianza y una media similares a las de tu código, pero hay un mayor patrón en las predicciones, hay cierta correlación que parece más "realista".

1voto

user164061 Puntos 281

La especificación del tipo de datos que se quiere generar es muy amplia, y hay muchas formas de simular una especie de paseos aleatorios con trayectorias que tienen tendencia a "volver a la media".

Por ejemplo, puedes cambiar tu código como:

set.seed(420)
a = 0.9
b = 0.7
n = 10^4
x=rnorm(n)
y=rep(NA,n)
y[1]=x[1]
for (i in 2:n) {
  y[i]=a*y[i-1]+b*x[i]
}

Que es un paseo aleatorio amortiguado. example

pregunta relacionada (y posiblemente duplicada): Creación de valores aleatorios autocorrelacionados en R

más tipos de paseos aleatorios similares: https://en.wikipedia.org/wiki/Autoregressive-moving-average_model

0 votos

El enlace que has puesto está relacionado con mi pregunta, ya que responde a cómo generar valores aleatorios correlacionados. Sin embargo, no he preguntado cómo modelar una serie que vuelve a la media global de la serie temporal, el modelo amortiguado. Sino cómo generar nuevas predicciones que vuelvan a la "media" de las predicciones, para generar nuevas predicciones que oscilen en torno a las predicciones - que van cambiando a lo largo del tiempo. ¿El modelo amortiguado también puede ampliarse fácilmente en este caso?

0 votos

@user2974951 ¿podría explicar un poco más lo que quiere decir con "¿Cómo podemos simular algunos paseos aleatorios, que oscilarán alrededor de las predicciones" . ¿No está buscando formas de simular paseos aleatorios de algún tipo? Tal vez podría explicar mejor su problema original (subyacente) - lo que está tratando de lograr con la solución a su pregunta.

0 votos

No quiere datos que vuelvan a la media global. Pero puede añadir el ruido simulado (paseo aleatorio) a cualquier línea de tendencia o línea de tendencia prevista para obtener un resultado final. Por ejemplo $$y (t) = \mu (t) + \epsilon (t) $$ donde $y (t)$ es la curva simulada que se compone de la "media de las predicciones $\mu (t) $ y un término de ruido $\epsilon (t) $ . Este término de ruido es el que se simula en la imagen de mi respuesta.

1voto

Aksakal Puntos 11351

Un proceso de paseo aleatorio como el que estás utilizando tiene una deriva y una varianza constantes (o nulas): $$dW_t=\xi_t,\\\xi_t\sim \mathcal N(0,\sigma^2)$$

Usted quiere "variabilidad arbitraria", es decir $\sigma^2$ no sólo cambia con el tiempo, sino que también en algunos arbitrario manera, lo que sea que quieras decir con esta palabra. Si te referías a que es estocástico, impredecible, entonces tal vez tengas que mirar varianza estocástica procesos en los que $\sigma^2_t$ es un proceso aleatorio en sí mismo. Uno de estos modelos es Modelo Heston que es popular en la fijación de precios de los derivados en las finanzas.

Hay modelos más sencillos como GARCH . En GARCH la varianza no es estocástica en el sentido de que la varianza del siguiente paso está completamente determinada por la información hasta la fecha. Sin embargo, como se obtiene constantemente nueva información, la varianza futura se actualiza en cada paso. Así que la varianza también es arbitrario aunque en un sentido más restringido en comparación con el proceso de volatilidad estocástica como Heston.

0 votos

Aksakal, aprendo mucho de tus aportaciones sobre las series temporales en CV: ¿puedes ampliar tu pregunta para dar con algunos detalles (incluso con modelos de juguete)? En particular, para la parte de la pregunta del operador "¿Cómo podemos simular algunos paseos aleatorios que oscilen en torno a las predicciones (teniendo una especie de media similar) pero con una variabilidad arbitraria?

0 votos

Tendré que investigar el modelo Heston. En cuanto a la "variabilidad arbitraria", me refería simplemente a que podemos fijar de antemano la varianza del paseo aleatorio simulado, digamos SD=2 o cualquier otro número. La pregunta no estaba realmente relacionada con un modelo GARCH o con la modelización de la heteroscedasticidad, a menos que esto también pueda resolverse con un modelo de este tipo, dadas las correlaciones en el paseo deseado.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X