Библиотека R для дискретного моделирования цепей Маркова
Я ищу что-то вроде пакета "msm", но для дискретных цепей Маркова. Например, если бы у меня была матрица перехода, определенная как таковая
Pi <- matrix(c(1/3,1/3,1/3,
0,2/3,1/6,
2/3,0,1/2))
Для состояний A, B, C. Как я могу смоделировать цепь Маркова в соответствии с этой матрицей перехода?
Спасибо,
3 ответа:
Некоторое время назад я написал набор функций для моделирования и оценки дискретных матриц вероятностей Марковских цепей: 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
Argh , вы нашли решение, пока я писал его для вас. Вот простой пример, который я придумал:
Обратите внимание, что ваша матрица вероятностных переходов не суммируется до 1 в каждой строке, что и должно быть сделано. Мой пример имеет слегка измененную матрицу вероятностных переходов, которая придерживается этого правила.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();