简体   繁体   English

用于离散马尔可夫链仿真的 R 库

[英]R library for discrete Markov chain simulation

I am looking for something like the 'msm' package, but for discrete Markov chains.我正在寻找类似 'msm' 包的东西,但用于离散马尔可夫链。 For example, if I had a transition matrix defined as such例如,如果我有一个这样定义的转换矩阵

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

for states A,B,C.对于状态 A、B、C。 How can I simulate a Markov chain according to that transition matrix?如何根据该转移矩阵模拟马尔可夫链?

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 .不久前,我编写了一组用于模拟和估计离散马尔可夫链概率矩阵的函数: 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

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.请注意,您的概率转换矩阵在每行中的总和不会为 1,这是应该的。 My example has a slightly altered probability transition matrix which adheres to this rule.我的例子有一个稍微改变的概率转移矩阵,它符合这个规则。

You can now use the markovchain package available in CRAN.现在,您可以用markovchain在CRAN可用的软件包。 The user manual .用户手册 is pretty good and has several examples.很不错,有几个例子。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM