我想知道是否存在一种算法来模拟具有特定数量的状态出现的离散马尔可夫链,知道转移矩阵方式。
例如,如何在R中模拟长度为n的马尔可夫链,其中p个出现(p 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')
答案 0 :(得分:0)
因此,对于像你这样的两个状态矩阵,这可以生成1和0的随机序列,总共n
个和p
个。它还会给你概率:
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
是必要的。由于m1
和m2
也必须是整数,这意味着对(m1,m2)
只有三种可能性:(2,3)
,(4,6)
,{{1 }}。 (6,9)
是不可能的,因为这意味着超过19次过渡。
同样,为了限制(8,12)
,a==0.3
:(n1,n2)
只有一种可能性。因此,(3,7)
。这意味着n1+n2==10
。但是,m1+m2==9
的唯一可能性是m1+m2
。这就是为什么没有符合您标准的字符串。
此外,我们甚至没有进入下一个必须有12个约束的约束。这会让事情变得更加困难。