R中马氏链的手动模拟
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R中马氏链的手动模拟相关的知识,希望对你有一定的参考价值。
考虑具有状态空间S = {1,2}的转移矩阵的马尔可夫链
初始分布α=(1 / 2,1 / 2)。
- 模拟马尔可夫链的5个步骤(即模拟X0,X1,...,X5)。重复模拟100次。使用模拟结果解决以下问题。 估计P(X1 = 1 | X0 = 1)。将您的结果与确切的概率进行比较。
我的解决方案
# 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次(如问题陈述中所述),有什么区别?
如何从这里找到条件概率?
答案
让
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(由转移矩阵的左上方条目给出)。
以上是关于R中马氏链的手动模拟的主要内容,如果未能解决你的问题,请参考以下文章