2016-04-07 12 views
1

Я следующий код для цепи Маркова:Имитировать цепную тракту Маркова 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? Заранее благодарю за любой совет.

ответ

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)) 
} 
+0

Мне нравится добавления интересной вещь о 'мин (что())' метод, который я совсем как-то, что он выдает предупреждение, если что моделирование не всегда поражало 7, что происходит. некоторые (я имитировал, сколько раз это происходит в 1000 повторений исходного вызова 'replicate()', и получил в среднем 13,9 на 1000.) – JDB

+0

Да, 'min' вернет' Inf', если условие никогда не выполняется. Вам нужно увеличить 'n.sim', чтобы гарантировать, что cha в (почти) всегда достигает 7. Я пытался с 'n.sim = 300', и каждая цепочка достигла 7 из 10 000 симуляций. – eipi10

+0

Большое спасибо @ eipi10 и @JDB! Теперь я понимаю, что использование циклов и 'replicate()' намного лучше. Вот как я решил проблему, чтобы избежать «Inf» при вычислении средних шагов: 'y <-replicate (1000, min (which (simulation.mc (1, P, 100) == 7))); y2 <-y [is.finate (y)]; среднее (y2) ' – Maruska

0

Похоже, вы пытаетесь создать фрейм данных 100 х 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) 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^