考虑状态空间为 S = {1,2} 的马尔可夫链,过渡矩阵
和初始分布α=(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
如您所见,我在每次迭代中都得到相同的输出。
如何修复我的代码?
答案 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
,它应该可以工作。