2016-10-29 5 views
2

Моей цепи Маркова моделирований не оставит исходное состояние 1. Матрица 4x4 перехода имеет состояние ПОГЛОЩАТЕЛЬНЫЕ 0 и 3.цепи Марков в R не выходя из начального состояния

Тот же самый код работает для 3x3 матрицы перехода без поглощения состояния. Что не так?

Участок с моего кода: Plot of Markov chain simulation. И, надеюсь, рабочий пример:

# Building Markov transition matrix) 
Pc <- matrix(c(1, 0.05, 0, 0, 0, 0.85, 0.05, 0, 0, 0.1, 0.65, 0, 0, 0, 0.3, 1), 
      nrow = 4, ncol = 4) 
rownames(Pc) <- c(0,1,2,3) 
colnames(Pc) <- c(0,1,2,3) 

#Simulating Markov chain 
markovSimulation <- function(matrix, length, initialState) { 
    chain <- array(0,c(length,1)) 
    chain[1] <- initialState 
    for (j in 2:length){ 
     chain[j] <- sample(1:4, size = 1, prob=matrix[chain[length(chain)] + 1, ]) 
    }#for loop 
    return(chain) 
}#markovSimulation 

# Calling simulator and plotting result 
simulatedChain <- markovSimulation(Pc, 10, 1) 
plot(simulatedChain) 
+0

Это вполне ожидаемо, если начать моделирование в поглощающее состояние. –

+0

Думаю, я понимаю, что я сделал именно это, спасибо! –

ответ

1

добро пожаловать в SO! Хорошая попытка, но я вижу, у вас есть две вещи неправильно:

chain[j] <- sample(1:4, size = 1, prob=matrix[chain[length(chain)] + 1, ]) 

вы должны попробовать из c(0,1,2,3) как вы индексировать состояния от 0. и вероятности должны зависеть от предыдущего состояния, так prob=matrix[chain[j-1]+1].

Тогда я получаю разумные результаты, как это:

> markovSimulation(Pc,10,1) 
     [,1] 
[1,] 1 
[2,] 1 
[3,] 2 
[4,] 3 
[5,] 3 
[6,] 3 
[7,] 3 
[8,] 3 
[9,] 3 
[10,] 3 

+1 за хороший первый пост, хороший воспроизводимый пример!

+0

спасибо за решение и добрые слова. Перед публикацией у меня был значительный кактус в животе. Я искренне хочу представить вопросы, которые заслуживают ответа :) –

+0

относительно индексации: я думаю, комбинация индексации R, начинающаяся с 1, и состояние, начинающееся с 0, легко выводит мою рабочую память рептилия. Я все еще озадачен 'matrix [chain [j - 1] + 1]' –

+1

Хе-хе, не волнуйся, ты на большой трассе. Надеюсь, он хорошо работает сейчас! –

1

Я видел замешательство из-за того, что вы создали символьные индексы для вашей матрицы перехода, а затем не использовали их по назначению. Использование 1 в качестве i-индекса даст первую строку. Использование «1» даст вторую строку. Это использует символьный вектор состояний и использует значение символа в качестве индекса строки в вашей матрице Pc. Лучше использовать TMAT внутри функции, а не имя matrix так, что также является именем функции:

markovSimulation <- function(tmat, length, initialState) { 
    chain <- array(0,c(length,1)) 
    chain[1] <- initialState 
    for (j in 2:length){ 
     chain[j] <- sample(0:3, size = 1, prob=tmat[ chain[j-1], ]) 
    }#for loop 
    return(chain) 
}#markovSimulation 

# Calling simulator and plotting result 
simulatedChain <- markovSimulation(Pc, 100, "1") 
plot(simulatedChain) 
+0

Спасибо за ваши усилия. Я попытался выполнить ваши модификации кода, но не смог заставить их работать. Я уверен, что это связано с моим недостатком понимания. Я соглашаюсь на имена состояний как источник путаницы, и я остановлю матрицы имен как матрицу :) –

+1

Я просто проверил код. Он работает нормально. Индексирование по символьным значениям для маргиналов в матрицах является выразительной особенностью языка R. –