马尔可夫链以前的州

时间:2016-06-29 13:32:49

标签: r markov-chains markov

我在马尔可夫链中模拟了1000个步骤,共有6个不同的状态(0-5),我们从状态5开始。通过条形图我们可以看到我们在多少次每个州。

然而,我想知道的是我们前往状态5的次数是多少次,当时它刚刚从状态1开始。因为我们在状态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)

感谢您抽出时间回答我的问题。

2 个答案:

答案 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)

答案 1 :(得分: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