2016-06-29 66 views
0

我模擬了markov鏈中的1000個步驟,總共有6個不同的狀態(0-5),我們從狀態5開始。通過條形圖,我們可以看到我們有多少次處於每種狀態。Markov Chain之前的狀態

然而,我想知道的是,當狀態1之前的那一步,我們進入狀態5的次數是多少次。因爲我們在狀態1中共有26次,所以最多的答案是26有沒有辦法看到我們在進入狀態5之前處於狀態1的次數?

spec_sim <- function(x){ 
    u <- runif(1) 
    if(x==0){ 
     if(u < 0.5){ 
     y <- 3 
     } else { 
     y <- 5 
     } 
    } else if(x==1){ 
     if(u<0.1){ 
     y <- 0 
     } else if(u < 0.1 + 0.1){ 
      y <- 1 
     } else if(u < 0.1 + 0.1 + 0.4){ 
      y <- 3 
     } else { 
     y <- 5} 

    } else if(x==2){ 
     if(u<0.2){ 
      y <- 1 
     } else if(u < 0.2 + 0.2){ 
      y <- 2 
     } else if(u < 0.2 + 0.2 + 0.3){ 
      y <- 3 
     } else { 
      y <- 5 
     } 
    } else if(x==3){ 
     if(u<0.3){ 
      y <- 2 
     } else if(u < 0.3 + 0.5){ 
      y <- 3 
     } else{ 
      y <- 5 
     } 
    } else if(x==4){ 
     if(u<0.4){ 
      y <- 3 
     } else { 
      y <- 4 
     } 
    } else if(x==5){ 
     if(u<0.4){ 
      y <- 4 
     } else { 
      y <- 5 
     } 
    } 
    return(y) 
} 

set.seed(1) 
results <- numeric(1001) 
for(i in 2:length(results)){ 
    results[i]<- spec_sim(results[i - 1]) 
} 

results <- results[-1] 

barplot(table(results), xlab="states", ylab="frequency", 
    main="1000 simuleringar av en Markovkedja") 

table(results) 

謝謝你把時間花在我的問題上。

回答

1

基地還有另外一種方式R也是:

length(which(diff(results) == 4)) 

很容易理解,沒有dplyr

解釋的知識:

功能diff()計算向量的元素之間的差異。如果結果從狀態1變爲狀態5,則兩個元素之間的差異爲+4。所以你正在尋找的元素,其中的差異是+4。使用which,您將獲得diff(results) == 4的索引編號。與length你可以指數。因此,您可以獲得從1到5的更改次數。請注意,您沒有從5更改爲1,因爲結果爲-4。

問候,
J_F

+0

你好, 長度(其中(差異(結果)== 4)) 只是爲了確保,這是我們在狀態1之前直接進入狀態5之前的次數? 你能解釋一下代碼嗎?例如,爲什麼它== 4? – PeterNiklas

+0

我編輯了我的答案並添加了一個解釋。 –

3

您的代碼並沒有爲我跑,但這裏有一個例子,做什麼你問:

library(dplyr) 
df <- data.frame(state=c(1,5,3,5,4,5,2,5,2,1,5)) 
df <- mutate(df, state_diff= state - lag(state)) 

which(df$state==5 & df$state_diff == 4) 

length(which(df$state==5 & df$state_diff == 4)) 

編輯:

現在,這應該與你的固定代碼工作:

df <- data.frame(results) 
df<- mutate(df, results_diff = results - lag(results)) 
length(which(df$results==5 & df$results_diff == 4)) 
which(df$results==5 & df$results_diff == 4) 
+0

你好,我一定是錯複製的代碼,我寫到這裏同樣馬爾可夫鏈 http://stackoverflow.com/questions/38058756/value-of-a-bar在圖中 也許它工作,如果你從那裏拿走它? – PeterNiklas

+1

我編輯它..代碼的作品。 –