R中的Markov链不离开初始状态

R中的Markov链不离开初始状态,r,markov-chains,R,Markov Chains,我的马尔可夫链模拟不会离开初始状态1。4x4过渡矩阵具有吸收态0和3 同样的代码适用于没有吸收态的3x3跃迁矩阵。怎么了 我的代码中的绘图:。希望这是一个有效的例子: # 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)

我的马尔可夫链模拟不会离开初始状态1。4x4过渡矩阵具有吸收态0和3

同样的代码适用于没有吸收态的3x3跃迁矩阵。怎么了

我的代码中的绘图:。希望这是一个有效的例子:

# 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)
#建立马尔可夫转移矩阵)

Pc欢迎来到SO!很好的努力,但我发现你错了两件事:

chain[j] <- sample(1:4, size = 1, prob=matrix[chain[length(chain)] + 1, ])

+1为好的第一篇文章,好的可复制的例子

我认为这种混乱是因为您为过渡矩阵创建了角色索引,但没有按预期使用它们。使用
1
作为i索引将给出第一行。使用“1”将给出第二行。这将使用状态的字符向量,并使用字符值作为Pc矩阵的行索引。更好的方法是在函数内部使用tmat,而不是一个名称
矩阵
,因为它也是一个函数名:

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)

markovSimulation感谢您的解决方案和好话。在发帖之前,我肚子里有很多仙人掌。我真诚地希望提出一些值得回答的问题:)关于索引:我想从1开始的R索引和从0开始的状态的组合很容易使我的爬行动物工作记忆最大化。我仍然对
矩阵[chain[j-1]+1]
感到困惑,呵呵,别担心,你已经走上了正轨。希望它现在运行良好!Yh我建议最初将状态索引为1:4,除非你有理由不这样做……该行只选择矩阵中与当前状态链[j-1]相对应的行,并且由于状态索引从0开始,你需要添加1以将其与矩阵行的索引对齐。我了解你关于选择索引状态的观点,但在这种情况下,我必须使状态为0:3。对索引机制的理解也开始渗透进来。谢谢你,简!如果你在一个吸引人的状态下开始一个模拟,这是完全可以预料到的。我想我明白我就是这么做的,谢谢!谢谢你的努力。我尝试运行您的代码修改,但无法使其正常工作。我相信那是因为我缺乏理解。我同意州名称是混乱的根源,我将停止将矩阵命名为矩阵:)我刚刚检查了代码。很好用。通过矩阵中的边缘字符值进行索引是R语言的一个表现性特征。
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)