如何生成随机自动相关的二进制时间序列数据?


15

如何生成二进制时间序列,例如:

  1. 指定观察的平均概率为1(例如5%);
  2. 给定t 1的值,在时间观察1的条件概率(如果t 1的值为1,则为30%)?tt1t1

Answers:


17

使用二状态马尔可夫链。

如果状态被称为0和1,则链可以由2x2矩阵表示,给出状态之间的转移概率,其中P i j是从状态i迁移到状态j的概率。在此矩阵中,每一行的总和应为1.0。PPijij

根据陈述2,我们得到,然后简单守恒说P 10 = 0.7P11=0.3P10=0.7

根据陈述1,您希望长期概率(也称为平衡或稳态)为。这表示P 1 = 0.05 = 0.3 P 1 + P 011 - P 1 求解得出P 01 = 0.0368421和转换矩阵P = 0.963158 0.0368421 0.7 0.3P1=0.05

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

(您可以通过将转换矩阵提高到较高的幂来检查转换矩阵的正确性(在本例中为14)—结果的每一行都给出相同的稳态概率)

P


有趣的解决方案!您可能在R中有一些示例代码吗?安东尼吗?
user333 2011年

@Mike您可以注册您的帐户吗?您是一个活跃的用户,我们必须一遍又一遍地手动将其合并。这个过程很容易。只需访问stats.stackexchange.com/login

谢谢。给定数据,如何估算马尔可夫链(转换矩阵)?有R函数吗?
2011年

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

与我原来的转换矩阵交换了订单,但是得到了正确的概率。


大!我会尽快发怒...看起来足够好....
2011年

可以做逆运算吗?给定系列估计矩阵?
2011年

Pr(Xt=i|Xt1=j)

+1,但我也有一些意见:for在这里,循环会更干净一些,您知道的长度Series,因此只需使用即可for(i in 2:length(Series))。这消除了对的需要i = i + 1。另外,为什么要先采样A,然后转换为0,1?您可以直接采样01
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个-pŤ[1个001个]+pŤ[p0p01个-p01个-p0]=1个-pŤ一世+pŤË

从直觉上讲,这对应于某种可能性 1个-pŤ 系统保持相同的状态,并且有一个概率 pŤ 状态会随机化,其中随机化意味着根据下一个状态的均衡分布进行独立绘制(p0 是处于第一状态的平衡概率)。

请注意,根据您指定的数据,您需要解决 pŤ 从指定的 Ť11 通过 Ť11=1个-pŤ+pŤ1个-p0

这种分解的有用功能之一是,它可以直接将其归纳为高维问题中的相关马尔可夫模型。


如果有人看过发展这种表现的论文,请告诉我。
戴夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.