马尔可夫链模拟,计算极限分布

时间:2019-06-08 22:16:59

标签: r statistics simulation markov-chains

我有一个状态为S = {1,2,3,4}和概率矩阵的马尔可夫链

P =(。180,.274,.426,.120)   (.171,.368,.274,.188)   (.161,.339,.375,.125)   (.079,.355,.384,.182)

分别为第一,第二,第三,第四行。

评估为不同的幂P,限制分布为(.155,.342,.351,.155)

这是我使用仿真在R中实现此目标的方法:

f<-function(Nsim)
{

x<-numeric(Nsim)
x[1]=1 #the seed

ones<-numeric(1)
twos<-numeric(1)
thres<-numeric(1)
fours<-numeric(1)

for(i in 2:Nsim)
{
  if(x[i-1]==1)
    x[i]=sample(1:4,1,prob=c(.180,.274,.426,.120))
  if(x[i-1]==2)
    x[i]=sample(1:4,1,prob=c(.171,.368,.274,.188))
  if(x[i-1]==3)
    x[i]=sample(1:4,1,prob=c(.161,.339,.375,.125))
  if(x[i-1]==4)
    x[i]=sample(1:4,1,prob=c(.079,.355,.384,.182))

}
x

for(i in 1:Nsim)
{
  if(x[i]==1)
    ones<-ones+1
  if(x[i]==2)
    twos<-twos+1
  if(x[i]==3)
    thres<-thres+1
  else
    fours<-fours+1
}

prop1<-1/ones
prop2<-2/twos
prop3<-3/thres
prop4<-4/fours

list<-c(prop1,prop2,prop3,prop4)
return(list)
}

幸运的是,该代码未标记任何错误:),但没有返回预期的(.155,.342,.351,.155)

例如,f(1000)返回 [1] 0.006993007 0.006172840 0.008620690 0.006134969

有人可以告诉我我在做什么错吗?

2 个答案:

答案 0 :(得分:2)

您的代码中有两个错误:

  for(i in 1:Nsim)
  {
    if(x[i]==1)
      ones<-ones+1
    else if(x[i]==2) # this 'else' was missing
      twos<-twos+1
    else if(x[i]==3) # this 'else' was missing
      thres<-thres+1
    else
      fours<-fours+1
  }

  prop1<- ones/Nsim # not 1/ones
  prop2<- twos/Nsim # not 2/twos
  prop3<- thres/Nsim # not 3/thres
  prop4<- fours/Nsim # not 4/fours

答案 1 :(得分:1)

您的函数正确存储了长度为let bulk = Notification.collection.initializeUnorderedBulkOp() activity.notify.forEach( user_id => { query = { 'notification._id': activity._id, user_id, type: "replied to an idea you're subscribed to" } update = { $set: { notification: activity }, $addToSet: { user_details: user_data } } options = { setDefaultsOnInsert: true } bulk.find( query ).upsert().update( update, options ) } ) Nsim的单个马尔可夫链实现,但是x,...,prop1并不是真正的比例,...,四肢;它们似乎与整个链中的期望值更相关。您还高估了四位数,但是@StéphaneLaurent的答案也是如此。

然后,一旦确定,使用非常大的prop4的方法就可以工作了,因为从第30步开始,我们已经接近固定分布,而最初的30个值是“嘈杂的”,它们变为大Nsim可以忽略不计。

另一种方法是针对一些固定的大k集中在P k 上,这应该效率较低,但可能更直观。特别地,在这种情况下,我们模拟很多(对于要工作的大数定律)相对长(对于接近于极限分布的东西)的实现)马尔可夫链。而且,仿真可以更紧凑地编写。特别是考虑一下我的other answer的概括:

Nsim

现在,让我们模拟30000个长度为30的链,再次从状态1开始,就像您的情况一样。这样就可以了(另请参见here

chainSim <- function(alpha, mat, n) {
  out <- numeric(n)
  out[1] <- sample(1:ncol(mat), 1, prob = alpha)
  for(i in 2:n)
    out[i] <- sample(1:ncol(mat), 1, prob = mat[out[i - 1], ])
  out
}

其中

set.seed(1)
k <- 30
n <- 30000
table(replicate(chainSim(c(1, 0, 0, 0), M, k), n = n)[k, ]) / n
#         1         2         3         4 
# 0.1557333 0.3442333 0.3490333 0.1510000 

使用

M
#       [,1]  [,2]  [,3]  [,4]
# [1,] 0.180 0.274 0.426 0.120
# [2,] 0.171 0.368 0.274 0.188
# [3,] 0.161 0.339 0.375 0.125
# [4,] 0.079 0.355 0.384 0.182

通过这种方式,我们使用M <- structure(c(0.18, 0.171, 0.161, 0.079, 0.274, 0.368, 0.339, 0.355, 0.426, 0.274, 0.375, 0.384, 0.12, 0.188, 0.125, 0.182), .Dim = c(4L, 4L)) 对第k步中的状态的观察来近似平稳分布。