因此,对于像您这样的两个状态矩阵,这将用于生成 1 和 0 的随机序列,包括n
总数和p
1。它还会给你概率:
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
andm2
也必须是整数,这意味着对只有三种可能性(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 个的约束。那会让事情变得更加困难。