'msm'パッケージのようなものを探していますが、離散マルコフ連鎖を探しています。たとえば、遷移行列がそのように定義されている場合
Pi <- matrix(c(1/3,1/3,1/3,
0,2/3,1/6,
2/3,0,1/2))
状態A、B、Cの場合。その遷移行列に従ってマルコフ連鎖をシミュレートするにはどうすればよいですか?
'msm'パッケージのようなものを探していますが、離散マルコフ連鎖を探しています。たとえば、遷移行列がそのように定義されている場合
Pi <- matrix(c(1/3,1/3,1/3,
0,2/3,1/6,
2/3,0,1/2))
状態A、B、Cの場合。その遷移行列に従ってマルコフ連鎖をシミュレートするにはどうすればよいですか?
しばらく前に、離散マルコフ連鎖確率行列のシミュレーションと推定のための一連の関数を作成しました: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
ああ、あなたは私があなたのためにそれを書いている間に解決策を見つけました。これが私が思いついた簡単な例です:
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になるわけではないことに注意してください。これは、そうする必要があります。私の例では、このルールに準拠するわずかに変更された確率遷移行列があります。
markovchain
これで、CRANで利用可能なパッケージを使用できます。ユーザーマニュアル。かなり良いですし、いくつかの例があります。