我的马尔可夫链模拟不会离开初始状态1. 4x4转换矩阵具有吸收状态0和3.
相同的代码适用于没有吸收状态的3x3转换矩阵。怎么了?
我的代码中的图:Plot of Markov chain simulation。希望是一个有效的例子:
# Building Markov transition matrix)
Pc <- matrix(c(1, 0.05, 0, 0, 0, 0.85, 0.05, 0, 0, 0.1, 0.65, 0, 0, 0, 0.3, 1),
nrow = 4, ncol = 4)
rownames(Pc) <- c(0,1,2,3)
colnames(Pc) <- c(0,1,2,3)
#Simulating Markov chain
markovSimulation <- function(matrix, length, initialState) {
chain <- array(0,c(length,1))
chain[1] <- initialState
for (j in 2:length){
chain[j] <- sample(1:4, size = 1, prob=matrix[chain[length(chain)] + 1, ])
}#for loop
return(chain)
}#markovSimulation
# Calling simulator and plotting result
simulatedChain <- markovSimulation(Pc, 10, 1)
plot(simulatedChain)
答案 0 :(得分:1)
chain[j] <- sample(1:4, size = 1, prob=matrix[chain[length(chain)] + 1, ])
您需要从c(0,1,2,3)
进行采样,因为您将状态从0索引,并且概率需要依赖于先前的状态,因此prob=matrix[chain[j-1]+1]
。
然后我得到了这样的合理结果:
> markovSimulation(Pc,10,1)
[,1]
[1,] 1
[2,] 1
[3,] 2
[4,] 3
[5,] 3
[6,] 3
[7,] 3
[8,] 3
[9,] 3
[10,] 3
+1为好的第一篇文章,良好的可重复的例子!
答案 1 :(得分:1)
我看到了混乱,因为您为转换矩阵创建了字符索引,然后没有按预期使用它们。使用1
作为i-index将给出第一行。使用&#34; 1&#34;会给第二排。它使用状态的字符向量,并使用字符值作为Pc矩阵的行索引。更好的是在函数内使用tmat而不是名称matrix
,因为它也是一个函数名:
markovSimulation <- function(tmat, length, initialState) {
chain <- array(0,c(length,1))
chain[1] <- initialState
for (j in 2:length){
chain[j] <- sample(0:3, size = 1, prob=tmat[ chain[j-1], ] )
}#for loop
return(chain)
}#markovSimulation
# Calling simulator and plotting result
simulatedChain <- markovSimulation(Pc, 100, "1")
plot(simulatedChain)