了解 R 中的马尔可夫链源代码
Understanding Markov Chain source code in R
以下源码来自一本书。注释是我为了更好地理解代码而写的。
#==================================================================
# 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,...}?
各州的名称实际上不需要具有任何统计意义,只要它们不同即可。因此,在模拟状态之间的转换时,为它们选择 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
以下源码来自一本书。注释是我为了更好地理解代码而写的。
#==================================================================
# 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,...}?
各州的名称实际上不需要具有任何统计意义,只要它们不同即可。因此,在模拟状态之间的转换时,为它们选择 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