计算R中的转移矩阵(Markov)


29

R(内置函数)中是否有一种方法可以根据一组观测值计算马尔可夫链的转移矩阵?

例如,采用如下数据集并计算一阶转换矩阵?

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

这个矩阵应该代表什么?每行(或每列)都需要运行一次马尔可夫链吗?要么...?
红衣主教

这是100个状态序列样本(其中20个样本)。
B_Miner

您是在寻找概率估计还是仅是计数?
主教

概率估计。使用观察到的序列,过渡概率矩阵是多少(在此示例中为4x4)。
B_Miner

Answers:


33

我不是立即意识到“内置”功能(例如in base或类似的功能),但是我们可以通过几行代码非常轻松有效地做到这一点。

这是一个函数,它将矩阵(不是数据帧)作为输入,并生成转换计数(prob=FALSE)或默认情况下prob=TRUE)产生估计的转换概率。

# Function to calculate first-order Markov transition matrix.
# Each *row* corresponds to a single run of the Markov chain
trans.matrix <- function(X, prob=T)
{
    tt <- table( c(X[,-ncol(X)]), c(X[,-1]) )
    if(prob) tt <- tt / rowSums(tt)
    tt
}

如果您需要在数据框上调用它,则可以随时执行

trans.matrix(as.matrix(dat))

如果您正在寻找某些第三方软件包,则RseekR搜索站点可能会提供其他资源。


1
+1还有一些R软件包,其中包括HMMRHMM可能会有所帮助。
韦恩

@Wayne:(+1),我已经找到了各种可用的HMM包R非常挑剔的,在过去,特别是当它涉及到装修,我从来没有发现一个我真的很喜欢和信赖。也许现在情况好些了。我想他们会做对的。如果您知道这样的解决方案,请作为答案提交。我很乐意投票!
红衣主教

1
我尝试过,但没有成功。这个问题不涉及隐藏状态,我发现的程序包没有任何实用工具功能,除了成熟的HMM以外,其他功能都没有。(作为一个旁注,datOP作为示例提供的数据帧具有数据列,是否需要每列一个转换矩阵,还是一个整体转换矩阵,还是我们可以将其转换为向量?)
Wayne

@韦恩:(+1)你提出了一个好观点。我假设每一行都是马尔可夫链的独立运行,因此我们正在从这些平行运行的链寻求过渡概率估计。但是,即使这是一条从一行的末端到下一行的末端缠绕的链,由于马尔可夫结构,估计值仍将非常接近。
主教

1
@B_Miner:是的,只要您可以合理地假设每个客户的行为独立于所有其他客户,就可以。此类模型和许多扩展在分析用户行为(例如,反复访问网站等)时相对常见
主教

25

我刚刚markovchain基于S4编程风格上传了一个新的R包。除了处理S4 markovchain对象的各种方法外,它还包含一个函数,用于根据状态序列拟合Markov链。看一下:

library(markovchain) 
sequence <- c("a", "b", "a", "a", "a", "a", "b", "a", "b", "a", 
              "b", "a", "a", "b", "b", "b", "a")
mcFit <- markovchainFit(data=sequence)

这可能会有所帮助。


一个非常好的包装!您会支持高阶马尔可夫链吗?
韦恩

我被要求提供更高阶的马尔可夫链,而另一个人正在编写一些代码。如果您希望参与代码开发,请发送电子邮件至维护者地址,我们可以讨论...
Giorgio Spedicato 2014年

嗨,markovchainFit和上面发布的函数有什么区别?它们产生相同的结果吗?谢谢
aaaaa

1
一种[RķØvCH一种一世ñF一世Ť
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.