【问题标题】:Markov Chain previous states马尔可夫链先前状态
【发布时间】:2016-06-29 13:32:48
【问题描述】:

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

但是,我想知道我们有多少次进入状态 5,而之前的步骤是从状态 1 开始的。由于我们总共有 26 次处于状态 1,所以答案最多是 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)

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

【问题讨论】:

    标签: r markov-chains markov


    【解决方案1】:

    你的代码没有为我运行,但这里有一个例子可以满足你的要求:

    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)
    

    【讨论】:

    【解决方案2】:

    在基础R中也有另一种方式:

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

    非常容易理解,无需了解dplyr

    解释:

    函数diff() 计算向量元素之间的差异。如果您的结果从状态 1 变为状态 5,则两个元素之间的差值为 +4。因此,您正在搜索差异为 +4 的元素。使用which,您可以获得diff(results) == 4 的索引号。使用length,您可以计算索引。所以你得到了从 1 到 5 的变化数。请注意,你没有得到从 5 到 1 的变化,因为结果是 -4。

    问候,
    J_F

    【讨论】:

    • 你好,length(which(diff(results) == 4)) 只是为了确定,这是我们在状态 1 之后直接进入状态 5 之前的次数吗?你能解释一下代码吗?例如为什么是 == 4?
    猜你喜欢
    • 2017-03-18
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    相关资源
    最近更新 更多