Antworten:
Verwenden Sie eine Markov-Kette mit zwei Zuständen.
Wenn die Zustände 0 und 1 heißen, kann die Kette durch eine 2 × 2-Matrix , die die Übergangswahrscheinlichkeiten zwischen Zuständen angibt, wobei die Wahrscheinlichkeit ist, von Zustand zu Zustand . In dieser Matrix sollte jede Zeile 1,0 ergeben.P i j i j
Aus Aussage 2 ergibt sich , und bei einfacher Erhaltung ergibt sich dann .P 10 = 0,7
Ab Aussage 1 soll die Langzeitwahrscheinlichkeit (auch Gleichgewicht oder Steady-State genannt) . Dies besagt Das Lösen ergibt und eine ÜbergangsmatrixP 1 = 0,05 = 0,3 P 1 + P 01 ( 1 - P 1 ) P 01 = 0,0368421 P = ( 0,963158 0,0368421 0,7 0,3 )
(Sie können die Richtigkeit Ihrer Transtionsmatrix überprüfen, indem Sie sie auf eine hohe Leistung erhöhen. In diesem Fall erledigt 14 die Aufgabe. Jede Zeile des Ergebnisses ergibt die identischen Wahrscheinlichkeiten für den stationären Zustand.)
Beginnen Sie nun in Ihrem Zufallszahlenprogramm mit der zufälligen Auswahl von Zustand 0 oder 1; Dadurch wird ausgewählt, welche Reihe von Sie verwenden. Verwenden Sie dann eine einheitliche Zufallszahl, um den nächsten Zustand zu bestimmen. Diese Nummer ausspucken, ausspülen und nach Bedarf wiederholen.
Ich habe einen Riss beim Codieren der Antwort von @Mike Anderson in R gemacht. Ich konnte nicht herausfinden, wie es mit sapply gemacht wird, also habe ich eine Schleife verwendet. Ich habe die Probs leicht verändert, um ein interessanteres Ergebnis zu erzielen, und ich habe 'A' und 'B' verwendet, um die Zustände darzustellen. Lass mich wissen was du denkst.
set.seed(1234)
TransitionMatrix <- data.frame(A=c(0.9,0.7),B=c(0.1,0.3),row.names=c('A','B'))
Series <- c('A',rep(NA,99))
i <- 2
while (i <= length(Series)) {
Series[i] <- ifelse(TransitionMatrix[Series[i-1],'A']>=runif(1),'A','B')
i <- i+1
}
Series <- ifelse(Series=='A',1,0)
> Series
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1
[38] 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[75] 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
/ edit: Als Antwort auf Pauls Kommentar hier eine elegantere Formulierung
set.seed(1234)
createSeries <- function(n, TransitionMatrix){
stopifnot(is.matrix(TransitionMatrix))
stopifnot(n>0)
Series <- c(1,rep(NA,n-1))
random <- runif(n-1)
for (i in 2:length(Series)){
Series[i] <- TransitionMatrix[Series[i-1]+1,1] >= random[i-1]
}
return(Series)
}
createSeries(100, matrix(c(0.9,0.7,0.1,0.3), ncol=2))
Ich habe den Originalcode geschrieben, als ich gerade R gelernt habe. ;-)
So würden Sie die Übergangsmatrix unter Berücksichtigung der Reihe schätzen:
Series <- createSeries(100000, matrix(c(0.9,0.7,0.1,0.3), ncol=2))
estimateTransMatrix <- function(Series){
require(quantmod)
out <- table(Lag(Series), Series)
return(out/rowSums(out))
}
estimateTransMatrix(Series)
Series
0 1
0 0.1005085 0.8994915
1 0.2994029 0.7005971
Die Reihenfolge wird gegen meine ursprüngliche Übergangsmatrix ausgetauscht, es werden jedoch die richtigen Wahrscheinlichkeiten ermittelt.
for
Schleife wäre hier etwas sauberer, man kennt die Länge von Series
, also einfach benutzen for(i in 2:length(Series))
. Dadurch entfällt die Notwendigkeit für i = i + 1
. Warum also zuerst probieren A
und dann konvertieren 0,1
? Sie könnten direkt Probe 0
‚s und 1
‘ 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);
Hier ist eine Antwort basierend auf dem markovchain
Paket, das auf komplexere Abhängigkeitsstrukturen verallgemeinert werden kann.
library(markovchain)
library(dplyr)
# define the states
states_excitation = c("steady", "excited")
# transition probability matrix
tpm_excitation = matrix(
data = c(0.2, 0.8, 0.2, 0.8),
byrow = TRUE,
nrow = 2,
dimnames = list(states_excitation, states_excitation)
)
# markovchain object
mc_excitation = new(
"markovchain",
states = states_excitation,
transitionMatrix = tpm_excitation,
name = "Excitation Transition Model"
)
# simulate
df_excitation = data_frame(
datetime = seq.POSIXt(as.POSIXct("01-01-2016 00:00:00",
format = "%d-%m-%Y %H:%M:%S",
tz = "UTC"),
as.POSIXct("01-01-2016 23:59:00",
format = "%d-%m-%Y %H:%M:%S",
tz = "UTC"), by = "min"),
excitation = rmarkovchain(n = 1440, mc_excitation))
# plot
df_excitation %>%
ggplot(aes(x = datetime, y = as.numeric(factor(excitation)))) +
geom_step(stat = "identity") +
theme_bw() +
scale_y_discrete(name = "State", breaks = c(1, 2),
labels = states_excitation)
Dies gibt Ihnen:
Ich habe den Überblick über das Papier verloren, in dem dieser Ansatz beschrieben wurde, aber hier ist es.
Zerlegen Sie die Übergangsmatrix in
Eines der nützlichen Merkmale dieser Zerlegung ist, dass sie sich ziemlich einfach auf die Klasse von korrelierten Markov-Modellen in höherdimensionalen Problemen verallgemeinert.