Ручное моделирование цепи Маркова в R (2) - PullRequest
1 голос
/ 25 апреля 2019

Рассмотрим цепочку Маркова с пространством состояний S = {1, 2} , матрица переходов

enter image description here

и начальное распределение α = (1/2, 1/2) .

  1. Имитация 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

Как вы можете видеть, Я получаю один и тот же вывод в каждой итерации.

Как я могу исправить свой код?

1 Ответ

1 голос
/ 25 апреля 2019

Есть две проблемы:

Транспонированная матрица

Если вы проверяете матрицу, которую вы вводите, это транспонирование того, что вы хотели:

> 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 на X, и это должно работать.

...