如何使用 R 中的 n 阶马尔可夫链生成样本?

问题描述 投票:0回答:1

我正在尝试使用 R 中的马尔可夫链从 n 阶转换矩阵生成样本。我已经使用以下代码成功构造了这个 n 阶转换矩阵:

set.seed(1)

dat <- sample(c("A", "B", "C"), size = 2000, replace = TRUE) # Data

n <- 2 # Order of the transition matrix
if (n > 1) {
  from <- head(apply(embed(dat, n)[, n:1], 1, paste, collapse = ""), -1)
  to <- dat[-1:-n]
} else {
  from <- dat[-length(dat)]
  to <- dat[-1]
}

fromTo <- data.frame(cbind(from, to))
TM <- table(fromTo)
TM <- TM / rowSums(TM) # Transition matrix

但是,我在编写使用生成的转换矩阵生成样本的代码时遇到了困难,该转换矩阵适应不同的 n 值。有办法做到吗?

理想情况下,由于不同 R 版本之间的兼容性问题,我更喜欢不涉及“markovchain”包的解决方案。

r markov-chains
1个回答
0
投票

更新

如果您只是想知道如何从给定的转换矩阵生成样本,您可以尝试下面的代码

MarkovChainSampling <- function(dat, ord, preStat){
  TM <- MarkovChain(dat, ord)
  sample(colnames(TM), 1, prob = TM[preStat, ])
}

这样

> MarkovChainSampling(dat, 2, "A")
[1] "C"

> MarkovChainSampling(dat, 3, "AB")
[1] "A"

> MarkovChainSampling(dat, 4, "AAA")
[1] "C"

上一页

我认为您正在追求n阶马尔可夫链的

转移矩阵
。以下是您可能会找到一些线索的一个选项。

您可以像下面这样使用

embed

MarkovChain <- function(dat, ord) {
  d <- as.data.frame(embed(dat, ord))
  df <- with(
    d,
    data.frame(
      pre = do.call(paste, c(d[-ord], sep = "")),
      cur = d[[ord]]
    )
  )
  proportions(table(df), 1)
}

你将获得

> MarkovChain(dat, 2)
   cur
pre         A         B         C
  A 0.3377386 0.3509545 0.3113069
  B 0.3333333 0.3348281 0.3318386
  C 0.3513097 0.3174114 0.3312789

> MarkovChain(dat, 3)
    cur
pre          A         B         C
  AA 0.3347826 0.3826087 0.2826087
  AB 0.3430962 0.3263598 0.3305439
  AC 0.3396226 0.3160377 0.3443396
  BA 0.3273543 0.2959641 0.3766816
  BB 0.3392857 0.3482143 0.3125000
  BC 0.3783784 0.3063063 0.3153153
  CA 0.3524229 0.3700441 0.2775330
  CB 0.3155340 0.3300971 0.3543689
  CC 0.3348837 0.3302326 0.3348837
© www.soinside.com 2019 - 2024. All rights reserved.