Понимание исходного кода цепочки Маркова в R - PullRequest
0 голосов
/ 09 мая 2019

Следующий исходный код взят из книги. Комментарии написаны мной для лучшего понимания кода.

#==================================================================
# markov(init,mat,n,states) = Simulates n steps of a Markov chain 
#------------------------------------------------------------------
# init = initial distribution 
# mat = transition matrix 
# labels = a character vector of states used as label of data-frame; 
#           default is 1, .... k
#-------------------------------------------------------------------
markov <- function(init,mat,n,labels) 
{ 
    if (missing(labels)) # check if 'labels' argument is missing
    {
        labels <- 1:length(init) # obtain the length of init-vecor, and number them accordingly.
    }

    simlist <- numeric(n+1) # create an empty vector of 0's
    states <- 1:length(init)# ???? use the length of initial distribution to generate states.
    simlist[1] <- sample(states,1,prob=init) # sample function returns a random permutation of a vector.
                        # select one value from the 'states' based on 'init' probabilities.

    for (i in 2:(n+1))
    { 
        simlist[i] <- sample(states, 1, prob = mat[simlist[i-1],]) # simlist is a vector.
                                                    # so, it is selecting all the columns 
                                                    # of a specific row from 'mat'
    }

    labels[simlist]
}
#==================================================================

У меня есть несколько недоразумений относительно этого исходного кода.

Почему states <- 1:length(init) используется для генерации состояний? Что если состояния похожи на S = {- 1, 0, 1, 2, ...} ?

1 Ответ

1 голос
/ 09 мая 2019

Названия штатов на самом деле не должны иметь никакого статистического значения, если они разные.Поэтому, имитируя переходы между состояниями, совершенно нормально выбрать states <- 1:length(init) или любые другие имена для них.В конечном счете, однако, для практических целей мы часто имеем в виду некоторые метки, такие как -1, 0, ..., n, как в вашем примере.Вы можете указать эти имена в качестве параметра labels, а затем labels[simlist] будет переименовывать 1:length(init) в labels, элемент за элементом.Т.е., если изначально у нас было c(1, 2, 3), а вы указали labels как c(5, 10, 12), то результат будет в терминах последнего вектора.Например,

(states <- sample(1:3, 10, replace = TRUE))
# [1] 1 3 3 2 2 1 2 1 3 3
labels <- c(5, 10, 12)
labels[states]
# [1]  5 12 12 10 10  5 10  5 12 12
...