【问题标题】:R library for discrete Markov chain simulation用于离散马尔可夫链仿真的 R 库
【发布时间】:2010-05-02 18:23:39
【问题描述】:

我正在寻找类似“msm”包的东西,但要寻找离散马尔可夫链。例如,如果我有一个这样定义的转换矩阵

Pi <- matrix(c(1/3,1/3,1/3,
0,2/3,1/6,
2/3,0,1/2))

对于状态 A、B、C。如何根据该转移矩阵模拟马尔可夫链?

【问题讨论】:

标签: r markov-chains


【解决方案1】:

不久前,我编写了一组用于模拟和估计离散马尔可夫链概率矩阵的函数:http://www.feferraz.net/files/lista/DTMC.R

你所问的相关代码:

simula <- function(trans,N) {
        transita <- function(char,trans) {
                sample(colnames(trans),1,prob=trans[char,])
        }

 sim <- character(N)
 sim[1] <- sample(colnames(trans),1)
 for (i in 2:N) {
  sim[i] <- transita(sim[i-1],trans)
 }

 sim
}

#example
#Obs: works for N >= 2 only. For higher order matrices just define an
#appropriate mattrans
mattrans <- matrix(c(0.97,0.03,0.01,0.99),ncol=2,byrow=TRUE)
colnames(mattrans) <- c('0','1')
row.names(mattrans) <- c('0','1')
instancia <- simula(mattrans,255) # simulates 255 steps in the process

【讨论】:

    【解决方案2】:

    Argh,您在我为您编写解决方案时找到了解决方案。这是我想出的一个简单示例:

    run = function()
    {
        # The probability transition matrix
        trans = matrix(c(1/3,1/3,1/3,
                    0,2/3,1/3,
                    2/3,0,1/3), ncol=3, byrow=TRUE);
    
        # The state that we're starting in
        state = ceiling(3 * runif(1, 0, 1));
        cat("Starting state:", state, "\n");
    
        # Make twenty steps through the markov chain
        for (i in 1:20)
        {
            p = 0;
            u = runif(1, 0, 1);
    
            cat("> Dist:", paste(round(c(trans[state,]), 2)), "\n");
            cat("> Prob:", u, "\n");
    
            newState = state;
            for (j in 1:ncol(trans))
            {
                p = p + trans[state, j];
                if (p >= u)
                {
                    newState = j;
                    break;
                }
            }
    
            cat("*", state, "->", newState, "\n");
            state = newState;
        }
    }
    
    run();
    

    请注意,您的概率转移矩阵在每一行中的总和不会为 1,它应该这样做。我的例子有一个稍微改变的概率转移矩阵,它遵守这个规则。

    【讨论】:

    • 感谢您的回答。你的代码可读性很强。我真的很感激。
    • 可读代码?根据我的经验,大多数使用R 的人已经完全忘记了这个概念。希望对您有所帮助!
    • 要生成一个从 1 到 3 的随机整数,我认为sample(1:3, 1)ceiling(3 * runif(1, 0, 1)) 更容易理解。此外,对于最里面的 for 循环,您可以简单地使用 newState &lt;- sample(1:ncol(trans), 1, prob=trans[state,])。这更清楚地表明了正在发生的事情。然后您甚至不必对行进行规范化。
    【解决方案3】:

    您现在可以使用 CRAN 中提供的 markovchain 包。用户manual。很好,有几个例子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-15
      • 1970-01-01
      • 1970-01-01
      • 2017-03-12
      • 1970-01-01
      • 2015-11-10
      • 2017-05-15
      相关资源
      最近更新 更多