R library for discrete Markov chain simulation

后端 未结 3 375
死守一世寂寞
死守一世寂寞 2020-12-05 12:11

I am looking for something like the \'msm\' package, but for discrete Markov chains. For example, if I had a transition matrix defined as such

Pi <- matrix         


        
相关标签:
3条回答
  • 2020-12-05 12:42

    You can now use the markovchain package available in CRAN. The user manual. is pretty good and has several examples.

    0 讨论(0)
  • 2020-12-05 12:47

    A while back I wrote a set of functions for simulation and estimation of Discrete Markov Chain probability matrices: http://www.feferraz.net/files/lista/DTMC.R.

    Relevant code for what you're asking:

    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
    
    0 讨论(0)
  • 2020-12-05 12:55

    Argh, you found the solution whilst I was writing it up for you. Here's a simple example that I came up with:

    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();
    

    Note that your probability transition matrix doesn't sum to 1 in each row, which it should do. My example has a slightly altered probability transition matrix which adheres to this rule.

    0 讨论(0)
提交回复
热议问题