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

时间:2019-04-24 10:40:02

标签: r statistics probability markov-chains

  

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

     

enter image description here

     

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

     
      
  1. 模拟马尔可夫链的5个步骤(即模拟 X 0 X 1 >,..., X 5 )。重复模拟100   次。使用模拟结果来解决以下问题。

         
        
    • 估计 P(X 1 = 1 | X 0 = 1)。将您的结果与确切的可能性进行比较。
    •   
  2.   

我的解决方案:

# returns Xn 
func2 <- function(alpha1, mat1, n1) 
{
  xn <- alpha1 %*% matrixpower(mat1, n1+1)

  return (xn)
}

alpha <- c(0.5, 0.5)
mat <- matrix(c(0.5, 0.5, 0, 1), nrow=2, ncol=2)
n <- 10


for (variable in 1:100) 
{
   print(func2(alpha, mat, n))
}

如果我运行此代码一次或100次(如问题陈述中所述)有什么区别?

如何从这里找到条件概率?

1 个答案:

答案 0 :(得分:2)

让我们

alpha <- c(1, 1) / 2
mat <- matrix(c(1 / 2, 0, 1 / 2, 1), nrow = 2, ncol = 2) # Different than yours

是初始分布和过渡矩阵。您的func2仅找到第n步分布,这是不需要的,并且不模拟任何东西。相反,我们可以使用

chainSim <- function(alpha, mat, n) {
  out <- numeric(n)
  out[1] <- sample(1:2, 1, prob = alpha)
  for(i in 2:n)
    out[i] <- sample(1:2, 1, prob = mat[out[i - 1], ])
  out
}

其中out[1]仅使用初始分布生成,然后对于后续项,我们使用过渡矩阵。

那么我们有

set.seed(1)
# Doing once
chainSim(alpha, mat, 1 + 5)
# [1] 2 2 2 2 2 2

以便链从2开始并由于指定的转移概率而卡在那里。

做100遍

# Doing 100 times
sim <- replicate(chainSim(alpha, mat, 1 + 5), n = 100)
rowMeans(sim - 1)
# [1] 0.52 0.78 0.87 0.94 0.99 1.00

最后一行显示了我们进入状态2而不是状态1的频率。这给出了一个(众多)原因,为什么100次重复的信息更丰富:我们陷入状态2时仅进行一次模拟,而重复我们进行了100次探索更多的可能路径。

然后可以找到条件概率

mean(sim[2, sim[1, ] == 1] == 1)
# [1] 0.4583333

真实概率为0.5(由转换矩阵的左上角给出)。