使用markovchain包计算观察序列的概率

时间:2019-04-10 11:24:56

标签: r markov-chains

让我们使用this question中的数据集:

dat<-data.frame(replicate(20,sample(c("A", "B", "C","D"), size = 100, replace=TRUE)))

然后我们可以构建转换矩阵和马尔可夫链:

# Build transition matrix
trans.matrix <- function(X, prob=T)
{
  tt <- table( c(X[,-ncol(X)]), c(X[,-1]) )
  if(prob) tt <- tt / rowSums(tt)
  tt
}
trans.mat <- trans.matrix(as.matrix(dat))
attributes(trans.mat)$class <- 'matrix'

# Build markovchain
library(markovchain)
chain <- new('markovchain', transitionMatrix = trans.mat)

如果我现在遇到一个新序列,那么假设AAABCAD可以计算出给定该马尔可夫链的观测该序列的概率吗?

1 个答案:

答案 0 :(得分:3)

我无法在markovchain中看到与此完全相同的功能,但是也可以轻松地手动完成。但是有一个警告:过渡矩阵不提供观察第一个A的可能性,这需要您提供。设为0.25,就好像所有四个状态都一样一样(在您的示例中是这样)。

然后可以使用

获得观察到的链中的过渡
cbind(head(obs, -1), obs[-1])
#      [,1] [,2]
# [1,] "A"  "A" 
# [2,] "A"  "A" 
# [3,] "A"  "B" 
# [4,] "B"  "C" 
# [5,] "C"  "A" 
# [6,] "A"  "D" 

那么每个过渡的概率就是

trans.mat[cbind(head(obs, -1), obs[-1])]
# [1] 0.2268722 0.2268722 0.2268722 0.2926316 0.2791165 0.2665198

,最终答案是0.25 *(上述向量的乘积):

0.25 * prod(trans.mat[cbind(head(obs, -1), obs[-1])])
# [1] 6.355069e-05

为进行比较,我们可以通过生成许多长度为7的链来估计这种可能性:

dat <- replicate(2000000, paste(sample(c("A", "B", "C", "D"), size = 7, replace = TRUE), collapse = ""))
mean(dat == "AAABCAD")
# [1] 6.55e-05

看起来足够近了!