Como posso gerar séries temporais binárias, de modo que:
- A probabilidade média de observar 1 é especificada (digamos 5%);
- Probabilidade condicional de observar 1 no tempo dado o valor em (digamos 30% se o valor de for 1)?
Como posso gerar séries temporais binárias, de modo que:
Use uma cadeia de Markov de dois estados.
Se os estados são chamados 0 e 1, a cadeia pode ser representada por uma matriz 2x2 fornecendo as probabilidades de transição entre estados, onde P i j é a probabilidade de passar do estado i para o estado j . Nesta matriz, cada linha deve somar 1.0.
Na afirmação 2, temos , e a conservação simples diz P 10 = 0,7 .
Na afirmação 1, você deseja que a probabilidade de longo prazo (também chamada de equilíbrio ou estado estacionário) seja . Isso indica que P 1 = 0,05 = 0,3 P 1 + P 01 ( 1 - P 1 ) A solução fornece P 01 = 0,0368421 e uma matriz de transição P = ( 0,963158 0,0368421 0,7 0,3 )
(Você pode verificar se a sua matriz de transição está correta, elevando-a a uma potência alta - nesse caso, 14 faz o trabalho - cada linha do resultado fornece as mesmas probabilidades de estado estacionário)
Agora, no seu programa de números aleatórios, comece escolhendo aleatoriamente o estado 0 ou 1; isso seleciona qual linha de você está usando. Em seguida, use um número aleatório uniforme para determinar o próximo estado. Cuspa esse número, enxágue, repita conforme necessário.
Fiz uma rachadura na codificação da resposta de Mike Anderson em R. Não consegui descobrir como fazê-lo usando sapply, então usei um loop. Alterei os probs ligeiramente para obter um resultado mais interessante e usei 'A' e 'B' para representar os estados. Diz-me o que pensas.
/ edit: Em resposta ao comentário de Paulo, aqui está uma formulação mais elegante
Eu escrevi o código original quando estava aprendendo R, então me dê um pouco de folga. ;-)
Veja como você estimaria a matriz de transição, considerando a série:
A ordem é trocada em relação à minha matriz de transição original, mas obtém as probabilidades corretas.
fonte
for
loop seria um pouco mais limpo aqui, você sabe o tamanhoSeries
, então usefor(i in 2:length(Series))
. Isso elimina a necessidade dei = i + 1
. Além disso, por que primeiro exemploA
e depois converter para0,1
? Você pode provar diretamente0
's e1
' 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 arbitrária, pré-especificado lag 1 autocorrelaçãoAqui está uma resposta baseada no
markovchain
pacote que pode ser generalizado para estruturas de dependência mais complexas.Isso lhe dá:
fonte
Perdi o controle do artigo em que essa abordagem foi descrita, mas aqui vai.
Decomponha a matriz de transição em
que, intuitivamente, corresponde à ideia de que existe alguma probabilidade1 - pt que o sistema permanece no mesmo estado, e uma probabilidade pt que o estado é randomizado, onde randomizado significa fazer um sorteio independente da distribuição de equilíbrio para o próximo estado (p0 0 é a probabilidade de equilíbrio de estar no primeiro estado).
Observe que, a partir dos dados que você especificou, é necessário solucionarpt do especificado T11 através da T11= ( 1 - pt) + pt( 1 - p0 0) .
Uma das características úteis dessa decomposição é que ela generaliza diretamente para a classe de modelos de Markov correlacionados em problemas dimensionais mais altos.
fonte