我正在尝试使用 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”包的解决方案。
如果您只是想知道如何从给定的转换矩阵生成样本,您可以尝试下面的代码
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