Библиотека R для моделирования дискретных цепей Маркова - PullRequest
8 голосов
/ 02 мая 2010

Я ищу что-то вроде пакета 'msm', но для дискретных цепей Маркова. Например, если у меня была определена матрица переходов как таковая

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

для состояний A, B, C. Как я могу смоделировать цепь Маркова в соответствии с этой матрицей перехода?

Спасибо

Ответы [ 3 ]

8 голосов
/ 28 июня 2010

Некоторое время назад я написал набор функций для моделирования и оценки вероятностных матриц дискретных цепей Маркова: 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
6 голосов
/ 02 мая 2010

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 в каждой строке, что она должна делать. Мой пример имеет слегка измененную матрицу перехода вероятности, которая придерживается этого правила.

5 голосов
/ 26 января 2016

Теперь вы можете использовать пакет markovchain, доступный в CRAN. Пользователь Руководство . довольно хорошо и имеет несколько примеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...