让我们使用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
可以计算出给定该马尔可夫链的观测该序列的概率吗?
答案 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
看起来足够近了!