R中的马尔可夫链的手动模拟(2) [英] Manual simulation of Markov Chain in R (2)
本文介绍了R中的马尔可夫链的手动模拟(2)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
考虑状态空间为 S = {1,2} 的马尔可夫链,过渡矩阵
Consider the Markov chain with state space S = {1, 2}, transition matrix
和初始分布α=(1/2,1/2).
- 模拟马尔可夫链的5个步骤(即模拟 X 0 , X 1 、. ..., X 5 ).重复模拟100次.
我的解决方案:
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
如您所见,我在每次迭代中都得到相同的输出.
As you can see, I am getting same output in each iteration.
如何修复我的代码?
推荐答案
有两个问题:
如果您检查输入的矩阵,它就是您想要的内容的转置:
If you check the matrix you have input, it is the transpose of what you wanted:
> mat
[,1] [,2]
[1,] 0.5 0
[2,] 0.5 1
所以,改变它.
在step
函数中,不使用返回的状态来启动后续状态.取而代之的是,X0
一直不断地被传递:
In the step
function, the returned state is not used to initiate the subsequent state. Instead, X0
just keeps getting passed in repeatedly:
for (i in 1:n1)
{
X <- nextX(X0, mat1)
vec[i] <- X
}
老实说,您根本不需要X0
.只需将step
函数中的所有X0
更改为X
,它就可以工作.
Honestly, you don't need X0
at all. Just change all the X0
s in the step
function to X
and it should work.
这篇关于R中的马尔可夫链的手动模拟(2)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文