무작위 자동 상관 이진 시계열 데이터를 생성하는 방법?


15

이진 시계열을 어떻게 생성 할 수 있습니까?

  1. 1을 관찰 할 수있는 평균 확률이 지정됩니다 (예 : 5 %).
  2. 의 값이 주어지면 시간 에서 1을 관측 할 수있는 조건부 확률 ( 값이 1 인 경우 30 % )?t 1 t 1tt1t1

답변:


17

2 상태 마르코프 체인을 사용하십시오.

상태 0과 1이라고하면, 체인은 2 × 2 행렬로 표현 될 수 상태 사이의 전이 확률을주고, 여기서 P I J 상태로부터 이동할 수있는 확률을 I 상태로 J . 이 행렬에서 각 행의 합계는 1.0이어야합니다.나는제이나는제이

명령문 2에서 이고 간단한 보존은 P 10 = 0.7 입니다.11=0.310=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 )을 나타 냅니다.1=0.05

P1=0.05=0.3P1+P01(1P1)
P01=0.0368421
=(0.9631580.03684210.70.3)

(트랜지션 매트릭스를 높은 파워로 올림으로써 정확성을 검사 할 수 있습니다 (이 경우 14 개가 작업을 수행함). 결과의 각 행은 동일한 안정 상태 확률을 제공합니다)


재미있는 해결책! R에 샘플 코드가 있습니까? 안톤?
user333

@ 마이크 계정을 등록 할 수 있습니까? 당신은 꽤 활동적인 사용자이며 우리는 그것을 수동으로 반복해서 병합해야합니다. 과정은 매우 쉽습니다. stats.stackexchange.com/login을

감사. 데이터가 주어진 Markov 체인 (전환 행렬)을 어떻게 추정 할 수 있습니까? 그렇게하는 R 기능이 있습니까?
user333

6

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

순서가 원래의 전환 행렬과 교체되었지만 올바른 확률을 얻습니다.


큰! 나는 가능한 한 빨리 ... 충분히 좋아 보인다 ....
user333

반대로 할 수 있습니까? 시리즈가 행렬을 추정하면?
user333

아르 자형(엑스=나는|엑스1=제이)

+1이지만 의견도 있습니다. for루프는 약간 깨끗합니다. 길이는 알고 Series있으므로을 사용하십시오 for(i in 2:length(Series)). 따라서에 대한 필요가 없습니다 i = i + 1. 또한, 왜 첫 번째 샘플 A, 다음으로 변환 0,1? 님 0과 님을 직접 샘플링 할 수 있습니다 1.
Paul Hiemstra

2
좀 더 일반적으로 당신은 그것을 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 자기 상관을 허용하기 위해 새로운 함수 로 포장 할 수 있습니다
Tom Wenseleers

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)

이것은 당신에게 제공합니다 :

여기에 이미지 설명을 입력하십시오


0

이 접근법이 설명 된 논문을 잃어 버렸습니다. 그러나 여기에갑니다.

전이 행렬을

=(1)[1001]+[00(10)(10)]=(1)나는+이자형

10

지정한 데이터 를 풀어야합니다.1111=(1)+(10)

이 분해의 유용한 특징 중 하나는 더 높은 차원의 문제에서 상관 된 Markov 모델의 클래스로 매우 간단하게 일반화된다는 것입니다.


이 표현을 발전시키는 논문을 본 사람이 있으면 알려주십시오.
Dave
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.