1

我有以下马尔可夫链代码:

simulation.mc=function(i0,P,n.sim){
S=1:nrow(P)
X=rep(0,n.sim)
X[1]=i0
for (n in 2:n.sim){
    X[n]=sample(x=S,size=1,prob=P[X[n-1],])
    }
return(X)
}

P=matrix(
c(
    0,1/2,0,1/2,0,0,0,
    1/2,0,1/2,0,0,0,0,
    0,1,0,0,0,0,0,
    1/3,0,0,0,1/3,1/3,0,
    0,0,0,1,0,0,0,
    0,0,0,1/2,0,0,1/2,
    0,0,0,0,0,0,1
),nrow=7,byrow=T);P

X=simulation.mc(1,P,100)


T=min(which(X==7))

我必须计算达到状态 7 之前的平均步数。

我知道我需要运行至少 1000 个路径样本,计算每个样本中的步数,然后计算平均值(尽管有些路径不会达到 7 状态)。

我这样做了,但仍然无法正常工作:

n.sim=100
X[i]=rep(0,n.sim)
 for (i in 1:100)
 { X[i]=simulation.mc(1,P,100)
 }

为什么这不起作用?如何在循环中包含循环以包含计算 os 步数的函数?提前感谢您的任何建议。

4

2 回答 2

1

您可以使用replicate而不是循环:

replicate(1000, min(which(simulation.mc(1,P,100)==7)))

@JDB 提供了一种使用循环的选项。这里还有几个:

# To save each entire chain in a list
n.sim=100
X = list()
for (i in 1:1000) { 
  X[[i]] = simulation.mc(1,P,n.sim)
}

# To save just the number of steps to get to 7
n.sim=100
X = rep(NA, 1000)  
for (i in 1:1000) { 
  X[i] = min(which(simulation.mc(1,P,n.sim)==7))
}
于 2016-04-07T17:48:03.537 回答
0

似乎您正在尝试创建一个 100 x 100 数据框,但您正在调用一个已经创建的向量。

这就是为什么你的电话X[i]=rep(0,n.sim)不起作用的原因。(我在想你可能是指X[1]=rep(0,n.sim),因为你只i在循环中定义。你不能像填充 data.frame 一样填充向量的列...

尝试:

X <- data.frame(matrix(nrow=100, ncol=100))
for (i in 1:100)
   { X[i]=simulation.mc(1,P,100)
}
于 2016-04-07T17:51:19.997 回答