Comment puis-je générer des séries temporelles binaires telles que:
- La probabilité moyenne d'observer 1 est spécifiée (disons 5%);
- Probabilité conditionnelle d'observer 1 au temps étant donné la valeur à t - 1 (disons 30% si t - 1 valeur était 1)?
Comment puis-je générer des séries temporelles binaires telles que:
Utilisez une chaîne de Markov à deux états.
Si les états sont appelés 0 et 1, alors la chaîne peut être représentée par une matrice 2x2 donnant les probabilités de transition entre les états, où P i j est la probabilité de passer de l'état i à l'état j . Dans cette matrice, chaque ligne doit totaliser 1,0.
D'après l'énoncé 2, nous avons , et la conservation simple dit alors P 10 = 0,7 .
À partir de l'énoncé 1, vous voulez que la probabilité à long terme (également appelée équilibre ou état stationnaire) soit . Cela signifie que P 1 = 0,05 = 0,3 P 1 + P 01 ( 1 - P 1 ) La résolution donne P 01 = 0,0368421 et une matrice de transition P = ( 0,963158 0,0368421 0,7 0,3 )
(Vous pouvez vérifier l'exactitude de votre matrice de transtion en la portant à une puissance élevée - dans ce cas, 14 fait le travail - chaque ligne du résultat donne les probabilités identiques en régime permanent)
Maintenant, dans votre programme de nombres aléatoires, commencez par choisir au hasard l'état 0 ou 1; cela sélectionne la ligne de que vous utilisez. Utilisez ensuite un nombre aléatoire uniforme pour déterminer l'état suivant. Crachez ce nombre, rincez, répétez si nécessaire.
J'ai pris une fissure au codage de la réponse de @Mike Anderson dans R. Je ne pouvais pas comprendre comment le faire en utilisant sapply, alors j'ai utilisé une boucle. J'ai légèrement changé les probs pour obtenir un résultat plus intéressant, et j'ai utilisé 'A' et 'B' pour représenter les états. Laissez-moi savoir ce que vous pensez.
/ edit: En réponse au commentaire de Paul, voici une formulation plus élégante
J'ai écrit le code original alors que j'apprenais juste le R, alors coupez-moi un peu. ;-)
Voici comment vous pourriez estimer la matrice de transition, compte tenu de la série:
L'ordre est inversé par rapport à ma matrice de transition d'origine, mais il obtient les bonnes probabilités.
la source
for
boucle serait un peu plus propre ici, vous connaissez la duréeSeries
, alors utilisez-lafor(i in 2:length(Series))
. Cela élimine le besoin dei = i + 1
. Aussi, pourquoi d'abord échantillonnerA
, puis convertir en0,1
? Vous pouvez directement goûter les0
«et1
».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);
pour permettre une autocorrélation arbitraire et prédéfinie du décalage 1Voici une réponse basée sur le
markovchain
package qui peut être généralisé à des structures de dépendance plus complexes.Cela vous donne:
la source
J'ai perdu la trace du document où cette approche a été décrite, mais voici.
Décomposer la matrice de transition en
L'une des caractéristiques utiles de cette décomposition est qu'elle se généralise assez facilement à la classe des modèles de Markov corrélés dans les problèmes de dimension supérieure.
la source