[ad_1]
Se você já visitou este blog no wordpress.com, deve ter notado uma imagem de cabeçalho semelhante a esta:
Você já se perguntou como foi gerado? A imagem mostra 100 simulações de um passeio aleatório assimétrico. Nesta postagem, irei examinar o código usado para gerar esta imagem. Todo o código também pode ser encontrado aqui.
Para
, considere uma série de variáveis aleatórias iid tal que para qualquer
,
com probabilidade
, e
com probabilidade
. (
é um parâmetro que podemos escolher.) Um passeio aleatório simplesmente rastreia a soma cumulativa dessas variáveis aleatórias, ou seja,
Na minha imagem, deixo o passeio aleatório correr até atingir um limite superior fixo ou um limite inferior fixo. Aqui está uma função R que gera uma realização deste passeio aleatório:
# returns the random walk path values as a vector # (random walk always starts at 0) # p: probability of increasing by 1 # stop if path value hits either `lower` or `upper` run lower & current(There might be more efficient ways of doing this, but since computation is relatively fast this is good enough for our purposes.)
The code below creates a list of 100 elements, each element being a simulated random walk. The probability of going up at any one step is 0.48, and we stop the random walk once we hit -50 or 50.
NWe can plot these paths along with the x-axis and the upper & lower limits:
# get length of longest path max_length
Without color, it’s hard to make much sense of the image. To introduce color, let’s create a function that picks a color for path based on (i) whether the path hit the upper or lower limit, and (ii) how long the path is when compared to the longest path in the image.
colorPickerIf a path hits the lower limit and has length 0, it will have color
ls_color / 255
, and if a path hits the lower limit and has the longest length among all our simulated paths, it will have colorll_color / 255
. There is a similar relationship for paths hitting the upper limit andus_color
andul_color
. (You can see what these colors are at a website such as this.)We can now color our black-and-white image:
plot(c(1, max_length), c(lower, upper), type = "n") for (i in 1:N) { lines(1:length(vlist[[i]]), vlist[[i]], col = colorPicker(vlist[[i]], max_length), lwd = 0.5) } abline(h = 0, lty = "dashed") abline(h = lower, lwd = 2) abline(h = upper, lwd = 2)
Pela imagem, agora é óbvio que a maioria dos caminhos atingem o limite inferior primeiro, e com bastante rapidez! Aqui está a mesma imagem, mas com diferentes opções de escala de cores:
plot(c(1, max_length), c(lower, upper), type = "n") for (i in 1:N) { lines(1:length(vlist[[i]]), vlist[[i]], col = colorPicker(vlist[[i]], max_length, ls_color = c(230, 230, 230), ll_color = c(166, 166, 166), us_color = c(255, 0, 0), ul_color = c(0, 0, 255)), lwd = 0.5) } abline(h = 0, lty = "dashed") abline(h = lower, lwd = 2) abline(h = upper, lwd = 2)
As possibilidades são infinitas!
Se você nunca viu caminhadas aleatórias antes, pode se surpreender com uma caminhada levemente tendenciosa (
ao invés de
) resulta em muitos mais caminhos atingindo o limite inferior antes do limite superior, embora os dois limites estejam à mesma distância de 0. Este é um exemplo de 100 simulações quando
:
Este é um exemplo de 100 simulações quando
:
Não é interessante como pequenos desvios na probabilidade de subir um degrau para cima (em vez de para baixo) mudam completamente a dinâmica? Acontece que existe uma forma fechada para a probabilidade de atingir um limite (em oposição a atingir o outro). Se o limite superior for
e o limite inferior é
, e
, então
Para a imagem do cabeçalho do meu blog,
,
, o que significa que a probabilidade de atingir o limite superior é de aproximadamente 0,0179: nada alto!
Relacionados
[ad_2]