【问题标题】:Calculate probability of observing sequence using markovchain package使用markovchain包计算观察序列的概率
【发布时间】:2019-08-31 20:13:15
【问题描述】:

让我们使用来自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,那么我可以在给定这个马尔可夫链的情况下计算观察到这个序列的概率吗?

【问题讨论】:

    标签: r markov-chains


    【解决方案1】:

    我在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
    

    看起来够近了!

    【讨论】:

    • 谢谢朱利叶斯!,我不能将它应用于二阶马尔可夫链,可以吗? (也许我应该在一个单独的问题中问这个)
    • @KingBoomie,逻辑将保持不变,但不,不能直接应用相同的代码。值得提出一个单独的问题,因为它以何种形式具有转换概率很重要。
    • @JuliusVainora 我发布了我的新问题:stackoverflow.com/questions/55617539/…(我必须使用另一个帐户)。正如您所指出的,转换矩阵的格式会影响新序列的评分方式,因此我在我的问题中将两者结合起来。
    猜你喜欢
    • 2010-11-04
    • 2014-07-31
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 2019-10-10
    相关资源
    最近更新 更多