R中的马尔可夫链没有离开初始状态

时间:2016-10-29 16:21:46

标签: r markov-chains

我的马尔可夫链模拟不会离开初始状态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)

2 个答案:

答案 0 :(得分:1)

欢迎来到SO!努力,但我发现你有两件事是错的:

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)