Я следующий код для цепи Маркова:Имитировать цепную тракту Маркова 1000 раз
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? Заранее благодарю за любой совет.
Мне нравится добавления интересной вещь о 'мин (что())' метод, который я совсем как-то, что он выдает предупреждение, если что моделирование не всегда поражало 7, что происходит. некоторые (я имитировал, сколько раз это происходит в 1000 повторений исходного вызова 'replicate()', и получил в среднем 13,9 на 1000.) – JDB
Да, 'min' вернет' Inf', если условие никогда не выполняется. Вам нужно увеличить 'n.sim', чтобы гарантировать, что cha в (почти) всегда достигает 7. Я пытался с 'n.sim = 300', и каждая цепочка достигла 7 из 10 000 симуляций. – eipi10
Большое спасибо @ eipi10 и @JDB! Теперь я понимаю, что использование циклов и 'replicate()' намного лучше. Вот как я решил проблему, чтобы избежать «Inf» при вычислении средних шагов: 'y <-replicate (1000, min (which (simulation.mc (1, P, 100) == 7))); y2 <-y [is.finate (y)]; среднее (y2) ' – Maruska