R中的马尔可夫链的手动模拟(2)

时间:2019-04-25 00:14:35

标签: r simulation montecarlo markov-chains

  

考虑状态空间为 S = {1,2} 的马尔可夫链,过渡矩阵

     

enter image description here

     

和初始分布α=(1/2,1/2)

     
      
  1. 模拟马尔可夫链的5个步骤(即模拟 X 0 X 1 、。 ..., X 5 )。重复模拟100次。
  2.   

我的解决方案:

states <- c(1, 2)
alpha <- c(1, 1)/2
mat <- matrix(c(1/2, 1/2, 0, 1), nrow = 2, ncol = 2) 

nextX <- function(X, pMat)
{
    probVec <- vector()

    if(X == states[1])
    {
        probVec <- pMat[1,]
    }
    if(X==states[2])
    {
        probVec <- pMat[2,]
    }

    return(sample(states, 1, replace=TRUE, prob=probVec))
}

steps <- function(alpha1, mat1, n1)
{
    X0 <- sample(states, 1, replace=TRUE, prob=alpha1)

    if(n1 <=0)
    {
        return (X0)
    }
    else
    {
        vec <- vector(mode="numeric", length=n1)

        for (i in 1:n1) 
        {
            X <- nextX(X0, mat1)
            vec[i] <- X
        }

        return (vec)
    }
}

# steps(alpha1=alpha, mat1=mat, n1=5)

simulate <- function(alpha1, mat1, n1)
{
    for (i in 1:n1) 
    {
        vec <- steps(alpha1, mat1, 5)
        print(vec)
    }
}

simulate(alpha, mat, 100)

输出

> simulate(alpha, mat, 100)
[1] 1 2 2 2 2
[1] 2 1 2 2 2
[1] 1 1 1 1 1
[1] 1 1 1 1 1
[1] 2 2 2 2 2
[1] 2 1 1 2 2
[1] 1 1 1 1 1
[1] 2 2 1 2 2
[1] 1 1 1 1 1
[1] 2 2 1 1 2
[1] 2 2 1 2 2
[1] 1 1 1 1 1
[1] 1 1 1 1 1
[1] 1 1 2 2 2
[1] 1 1 1 1 1
[1] 2 1 2 2 2
[1] 1 1 1 1 1
[1] 1 1 1 1 1
[1] 2 1 2 1 1
[1] 1 1 1 1 1
[1] 1 1 1 1 1
[1] 1 1 1 1 1
[1] 1 1 1 1 1
[1] 1 2 1 2 2
[1] 2 2 2 1 2
[1] 1 1 1 1 1
[1] 1 1 1 1 1
[1] 1 1 1 1 1
[1] 2 1 2 2 1
[1] 1 2 2 2 2
[1] 1 1 2 2 2
[1] 1 2 2 1 2
[1] 1 1 1 1 1
[1] 2 2 1 2 2
[1] 2 2 2 1 1
[1] 1 1 1 1 1
[1] 1 1 1 1 1
[1] 1 1 1 1 1
[1] 1 1 1 2 2
[1] 1 2 1 1 2
[1] 2 2 1 1 1
[1] 1 1 1 1 1
[1] 2 2 2 2 1
[1] 1 1 1 1 1
[1] 1 1 1 1 1
[1] 1 2 2 2 2
[1] 2 1 1 2 2
[1] 1 1 1 1 1
[1] 1 2 1 2 1
[1] 1 1 1 1 1
[1] 1 1 1 1 1
[1] 2 1 2 1 2
[1] 1 1 1 1 1
[1] 1 1 1 1 1
[1] 1 1 1 1 1
[1] 1 1 1 1 1
[1] 2 1 2 1 2
[1] 1 1 1 1 1
[1] 1 1 1 1 1
[1] 2 2 1 1 2
[1] 1 1 1 1 1
[1] 1 1 1 1 1
[1] 2 2 1 1 2
[1] 1 1 1 1 1
[1] 1 2 1 1 2
[1] 1 1 1 1 1
[1] 2 1 1 2 1
[1] 1 1 1 1 1
[1] 2 1 2 2 2
[1] 1 1 1 1 1
[1] 1 1 1 1 1
[1] 1 2 2 2 2
[1] 1 1 1 1 1
[1] 2 2 2 1 2
[1] 2 2 2 1 1
[1] 1 1 2 2 2
[1] 1 1 1 1 1
[1] 2 2 2 1 2
[1] 1 1 1 1 1
[1] 2 2 1 2 2
[1] 2 2 1 2 1
[1] 1 1 1 1 1
[1] 2 2 2 2 2
[1] 1 1 1 1 1
[1] 1 2 1 2 2
[1] 1 1 1 1 1
[1] 2 1 1 2 1
[1] 2 2 2 2 1
[1] 2 2 2 2 2
[1] 1 1 1 1 1
[1] 2 2 2 1 1
[1] 2 2 2 2 2
[1] 1 1 1 1 1
[1] 1 1 1 1 1
[1] 2 1 2 2 1
[1] 2 2 1 1 1
[1] 1 1 1 1 1
[1] 2 2 1 2 2
[1] 2 1 2 2 2
[1] 1 1 1 1 1

如您所见,我在每次迭代中都得到相同的输出。

如何修复我的代码?

1 个答案:

答案 0 :(得分:1)

有两个问题:

转置矩阵

如果您检查输入的矩阵,它就是您想要的内容的转置:

android:layout_weight="0.15"

所以,改变它。

状态未链接

> mat [,1] [,2] [1,] 0.5 0 [2,] 0.5 1 函数中,返回的状态不用于启动后续状态。相反,step只会不断地被传递:

X0

老实说,您根本不需要for (i in 1:n1) { X <- nextX(X0, mat1) vec[i] <- X } 。只需将X0函数中的所有X0更改为step,它应该可以工作。