답변:
2 상태 마르코프 체인을 사용하십시오.
상태 0과 1이라고하면, 체인은 2 × 2 행렬로 표현 될 수 상태 사이의 전이 확률을주고, 여기서 P I J 상태로부터 이동할 수있는 확률을 I 상태로 J . 이 행렬에서 각 행의 합계는 1.0이어야합니다.
명령문 2에서 이고 간단한 보존은 P 10 = 0.7 입니다.
명령문 1에서 장기 확률 (평형 또는 정상 상태라고도 함)이 되기를 원합니다 . 이것은 P 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 )을 나타 냅니다.
(트랜지션 매트릭스를 높은 파워로 올림으로써 정확성을 검사 할 수 있습니다 (이 경우 14 개가 작업을 수행함). 결과의 각 행은 동일한 안정 상태 확률을 제공합니다)
R에서 @Mike Anderson 답변을 코딩하는 데 어려움을 겪었습니다 .Sapply를 사용하여 수행하는 방법을 알 수 없으므로 루프를 사용했습니다. 더 흥미로운 결과를 얻기 위해 프로브를 약간 변경했으며 'A'와 'B'를 사용하여 상태를 나타 냈습니다. 당신이 무슨 생각을하는지 제게 알려주세요.
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의 의견에 따라보다 우아한 공식이 있습니다.
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))
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
순서가 원래의 전환 행렬과 교체되었지만 올바른 확률을 얻습니다.
for
루프는 약간 깨끗합니다. 길이는 알고 Series
있으므로을 사용하십시오 for(i in 2:length(Series))
. 따라서에 대한 필요가 없습니다 i = i + 1
. 또한, 왜 첫 번째 샘플 A
, 다음으로 변환 0,1
? 님 0
과 님을 직접 샘플링 할 수 있습니다 1
.
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);
미리 정의 된 임의의 지연 1 자기 상관을 허용하기 위해 새로운 함수 로 포장 할 수 있습니다
다음은 markovchain
더 복잡한 종속성 구조로 일반화 할 수있는 패키지 기반의 답변 입니다.
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)
이것은 당신에게 제공합니다 :