R:Cómo generar una serie de desviaciones exponenciales que suman algún número

StackOverflow https://stackoverflow.com/questions/8401842

  •  28-10-2019
  •  | 
  •  

Pregunta

Estoy intentando generar una serie de tiempos de espera para una cadena de Markov donde los tiempos de espera son números distribuidos exponencialmente con una tasa igual a uno.Sin embargo, no sé el número de transiciones del proceso, sino el tiempo total empleado en el proceso.

Así por ejemplo:

t <- rexp(100,1)
tt <- cumsum(c(0,t))

t es un vector de los tiempos de espera sucesivos e independientes y tt es un vector del tiempo de transición real a partir de 0.

Nuevamente, el problema es que no sé la longitud de t (es decir,el número de transiciones), en lugar de cuánto tiempo total de espera transcurrirá (es decir,el piso de la última entrada en tt).

¿Cuál es una forma eficiente de generar esto en R?

¿Fue útil?

Solución

La entrada de Wikipedia para proceso de Poisson tiene todo lo que necesita.El número de llegadas en el intervalo tiene una distribución de Poisson, y una vez que sepa cuántas llegadas hay, los tiempos de llegada se distribuyen uniformemente dentro del intervalo.Digamos, por ejemplo, que su intervalo tiene una longitud de 15.

N <- rpois(1, lambda = 15)
arrives <- sort(runif(N, max = 15))
waits <- c(arrives[1], diff(arrives))

Aquí, arrives corresponde a su tt y waits corresponde a su t (por cierto, no es una buena idea nombrar un vector t ya que t está reservado para la función de transposición).Por supuesto, la última entrada de waits se ha truncado, pero de todos modos mencionaste que solo conocías el piso de la última entrada de tt.Si realmente lo necesita, puede reemplazarlo con un exponencial independiente (más grande que waits[N]), si lo desea.

Otros consejos

Si entendí esto bien:Quieres saber cuántas transiciones serán necesarias para llenar tu intervalo de tiempo.Dado que las transiciones son aleatorias y desconocidas, no hay forma de predecirlas para una muestra determinada.He aquí cómo encontrar la respuesta:

tfoo<-rexp(100,1)   
max(which(cumsum(tfoo)<=10))  
[1] 10  

tfoo<-rexp(100,1)   # do another trial 
max(which(cumsum(tfoo)<=10))  
[1] 14  

Ahora bien, si espera necesitar extraer una muestra enorme, p. rexp(1e10,1), entonces tal vez deberías atraer 'trozos'. Dibuje las muestras 1E9 y vea si sum(tfoo) excede su umbral de tiempo.Si es así, explore el cumsum .En caso contrario, extraiga otras 1e9 muestras, y así sucesivamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top