Yanıtlar:
İki durumlu bir Markov zinciri kullanın.
Durumları 0, 1 olarak adlandırılır, o zaman zincir 2x2 matris ile temsil edilebilir durumlar arasındaki geçiş olasılıkları verir burada p i j durumundan hareket ait olasılığı i durumu için j . Bu matriste, her satır 1.0'a eşit olmalıdır.
İfade 2'den ve basit koruma P 10 = 0.7 diyor .
1. ifadeden, uzun vadeli olasılığın (denge veya kararlı durum olarak da bilinir) olmasını istiyorsunuz . Bu der p 1 = 0.05 = 0.3 p 1 + p 01 ( 1 - p 1 ) Çözme veren P 01 = 0,0368421 ve bir geçiş matrisi , P = ( 0,963158 0,0368421 0.7 0.3 )
(Transtion matrisinizi yüksek bir güce yükselterek doğruluğunu kontrol edebilirsiniz - bu durumda 14 işi yapar - sonucun her satırı aynı kararlı durum olasılıklarını verir)
Şimdi rastgele sayı programınızda, rasgele 0 veya 1 durumunu seçerek başlayın; bu, hangi satırını kullandığınızı seçer . Ardından bir sonraki durumu belirlemek için tek tip rastgele bir sayı kullanın. Bu numarayı tükür, durula, gerektiği kadar tekrarla.
R'deki @Mike Anderson cevabını kodlarken bir çatlak aldım. Bunu aptal kullanarak nasıl yapacağımı anlayamadım, bu yüzden bir döngü kullandım. Daha ilginç bir sonuç elde etmek için probları biraz değiştirdim ve devletleri temsil etmek için 'A' ve 'B' kullandım. Ne düşündüğü söyle.
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: Paul'un yorumuna yanıt olarak, daha zarif bir formülasyon
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))
Orijinal kodu sadece R öğrenirken yazdım, bu yüzden beni biraz gevşetin. ;-)
Seri verildiğinde geçiş matrisini nasıl tahmin edeceğiniz aşağıda açıklanmıştır:
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
Sipariş, orijinal geçiş matrisime göre değiştirildi, ancak doğru olasılıkları elde etti.
for
döngü burada biraz daha temiz olurdu, uzunluğunu biliyorsunuz Series
, bu yüzden sadece kullanın for(i in 2:length(Series))
. Bu, ihtiyacı ortadan kaldırır i = i + 1
. Ayrıca, neden ilk örnekleme A
ve daha sonra dönüştürmek 0,1
? Doğrudan örnek 0
's ve 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);
, keyfi, önceden belirlenmiş gecikme 1 otokorelasyonuna izin vermek için yeni bir işlevle
İşte markovchain
daha karmaşık bağımlılık yapılarına genelleştirilebilen pakete dayanan bir cevap .
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)
Bu size şunları sağlar:
Bu yaklaşımın anlatıldığı makaleyi kaybettim, ama işte gidiyor.
Geçiş matrisini
sezgisel olarak, bazı olasılıklar olduğu fikrine karşılık gelir. sistemin aynı durumda kalması ve bir olasılık durumun rastgele hale geldiği, burada rastgele durumun bir sonraki durum için denge dağılımından bağımsız bir çekim yapma anlamına geldiği ( birinci durumda olma olasılığıdır).
Belirttiğiniz verilerden çözmeniz gerektiğini unutmayın. belirtilen üzerinden .
Bu ayrışmanın yararlı özelliklerinden biri, yüksek boyutlu problemlerde ilişkili Markov modellerinin sınıfına oldukça basit bir şekilde genellemesidir.