1

我想知道是否有一种算法可以模拟离散马尔可夫链,该链具有特定数量的状态,知道转移矩阵的方式。

例如,如何在 R 中模拟长度为 n 的马尔可夫链,其中状态“0”的 p 次出现 (p < n) 用于由以下定义的转移矩阵:

TransitionMatrix<- matrix(c(0.7, 0.3, 0.4, 0.6),byrow=TRUE, nrow=2) 


colnames(TransitionMatrix) <- c('0','1')
row.names(TransitionMatrix) <- c('0','1')
4

1 回答 1

0

因此,对于像您这样的两个状态矩阵,这将用于生成 1 和 0 的随机序列,包括n总数和p1。它还会给你概率:

sim.sequence<-function(n,p) {
  ones<-sort(sample(1:n,p,replace=FALSE))
  x<-rep(0,n)
  x[ones]<-1
  row<-as.character(x[1:(n-1)])
  col<-as.character(x[2:n])
  probs<-TransitionMatrix[cbind(row,col)]
  list(states=x,probs=probs)
}

sim.sequence(20,12)
# $states
# [1] 0 0 1 1 1 0 1 0 1 1 0 1 0 1 1 1 1 0 1 0

# $probs
# [1] 0.7 0.3 0.6 0.6 0.4 0.3 0.4 0.3 0.6 0.4 0.3 0.4 0.3 0.6 0.6 0.6
# [17] 0.4 0.3 0.4

好的,根据您的评论,我想我知道您现在想要什么。随机生成 0 和 1,然后是每个状态的转换比例。TransitionMatrix根本不使用。

所以,这将是这样做的:

sim.sequence<-function(n,p) {
  ones<-sort(sample(1:n,p,replace=FALSE))
  x<-rep(0,n)
  x[ones]<-1
  row<-as.character(x[1:(n-1)])
  col<-as.character(x[2:n])
  tab<-table(row,col)
  probs<-as.matrix(tab) / rowSums(tab)
  list(states=x,probs=probs)
}
set.seed(1)
sim.sequence(20,12)

# $states
# [1] 1 1 1 1 0 1 0 1 1 0 1 0 0 1 1 1 0 0 1 0
# 
# $probs
#    col
# row       0         1
# 0 0.2857143 0.7142857
# 1 0.5000000 0.5000000

我声称,在评论中提供的示例中,您所要求的是不可能的。

您的状态序列必须有 20 个状态,即 19 个转换。在这些转变中,只有四种可能性:

(1,1) - m1
(1,0) - m2
(0,1) - n1
(0,0) - n2

所以m1+m2+n1+n2==19,所有四个也是整数。为了克制b==0.4它是必要的m1/(m1+m2)==0.4。因为m1andm2也必须是整数,这意味着对只有三种可能性(m1,m2)(2,3), (4,6), (6,9). (8,12)是不可能的,因为这意味着超过 19 个转换。

同样,要抑制a==0.3,您只有一种可能性(n1,n2)(3,7)。因此,n1+n2==10。这意味着m1+m2==9. 但是,唯一的可能性m1+m2(5,10,15)。这就是为什么不会有任何字符串符合您的标准。

此外,我们甚至还没有进入下一个必须正好有 12 个的约束。那会让事情变得更加困难。

于 2014-01-28T19:36:18.690 回答