【问题标题】:R Simulation Of Markov Chain马尔可夫链的R模拟
【发布时间】:2020-03-10 18:54:26
【问题描述】:
data1=data.frame("group"=c(1,2,3,4,5),
"t11"=c(0.01,0.32,0.25,0.37,0.11),
"t12"=c(0.48,0.45,0.61,0.29,0.23),
    "t13"=c(0.51,0.23,0.14,0.3,0.67),
    "t22"=c(0.13,0.91,0.41,0.69,0.42),
    "t23"=c(0.87,0.09,0.59,0.31,0.58))
set.seed(1)
    data2=data.frame("student"=c(1:20),
    "group"=c(sample(1:5,rep=T,20)))

我试图估计学生如何通过年级进行过渡。这是一个样本数据,其中 t11 = 留在年级,t12 = 前进一个年级,t13 等于毕业。等等。这是data1。

我看到了一些非常复杂的包来模拟这种概率矩阵的结果——我想知道是否有更简单的方法可以使用 data2 作为学生主体来模拟这 10 次步骤并使用 data1 进行转换?

【问题讨论】:

    标签: r simulation markov-chains markov


    【解决方案1】:

    这是一个基本的 R 解决方案。

    • 首先,您可以为转换矩阵定义函数markov,即,
    markov <- function(x, n) {
      m <- matrix(0,nrow = 3,ncol = 3)
      m[lower.tri(m,diag = TRUE)] <- c(unlist(x),1)
      r<-(u<-Reduce(`%*%`,replicate(n,m,simplify = FALSE)))[lower.tri(u,diag = TRUE)][-5]
    }
    
    • 然后,您可以将结果概率附加到data1,产生data1_10step,并将data1_10stepdata2 合并
    data1_10step <- data1
    data1_10step[-1]<-t(apply(data1[-1], 1, markov,10))
    data2out <- merge(data2,data1_10step)
    

    这样

    > data2out
       group student          t11          t12       t13          t22 t23
    1      1       1 1.000000e-20 5.514340e-09 1.0000000 1.378585e-09   1
    2      1      10 1.000000e-20 5.514340e-09 1.0000000 1.378585e-09   1
    3      1       3 1.000000e-20 5.514340e-09 1.0000000 1.378585e-09   1
    4      1      18 1.000000e-20 5.514340e-09 1.0000000 1.378585e-09   1
    5      1      15 1.000000e-20 5.514340e-09 1.0000000 1.378585e-09   1
    6      1      19 1.000000e-20 5.514340e-09 1.0000000 1.378585e-09   1
    7      2       4 1.125900e-05 2.970037e-01 0.7029850 3.894161e-01   1
    8      2      13 1.125900e-05 2.970037e-01 0.7029850 3.894161e-01   1
    9      2      14 1.125900e-05 2.970037e-01 0.7029850 3.894161e-01   1
    10     2       7 1.125900e-05 2.970037e-01 0.7029850 3.894161e-01   1
    11     3       9 9.536743e-07 5.081030e-04 0.9994909 1.342266e-04   1
    12     3       6 9.536743e-07 5.081030e-04 0.9994909 1.342266e-04   1
    13     3       8 9.536743e-07 5.081030e-04 0.9994909 1.342266e-04   1
    14     4       2 4.808584e-05 2.212506e-02 0.9778269 2.446194e-02   1
    15     5      12 1.000000e-10 1.227639e-04 0.9998772 1.708020e-04   1
    16     5       5 1.000000e-10 1.227639e-04 0.9998772 1.708020e-04   1
    17     5      16 1.000000e-10 1.227639e-04 0.9998772 1.708020e-04   1
    18     5      17 1.000000e-10 1.227639e-04 0.9998772 1.708020e-04   1
    19     5      20 1.000000e-10 1.227639e-04 0.9998772 1.708020e-04   1
    20     5      11 1.000000e-10 1.227639e-04 0.9998772 1.708020e-04   1
    

    编辑

    如果追踪markov的过程,可以向量化markov,即,

    markov <- Vectorize(function(x, n) {
      m <- matrix(0,nrow = 3,ncol = 3)
      m[lower.tri(m,diag = TRUE)] <- c(unlist(x),1)
      r<-(u<-Reduce(`%*%`,replicate(n,m,simplify = FALSE)))[lower.tri(u,diag = TRUE)][-5]
    })
    

    然后您可以使用

    1 跟踪 n10
    markov(x,seq(10))
    

    【讨论】:

    • 非常感谢,这真的很棒。我想知道您是否可以进行快速聊天我尝试这样做但我没有声誉
    • @bvowe 您可以将 cmets 留在我的聊天答案下
    • 如何跟踪 10 个模拟步骤中的每个步骤的状态?
    • @bvowe 你可以使用vectorize 而非markov。查看我的更新
    • 如果问这个问题不妥,我深表歉意,但您可以就一个非常简短的项目进行咨询——我们可以资助您的时间。
    猜你喜欢
    • 1970-01-01
    • 2019-09-13
    • 2019-09-14
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    • 2023-03-30
    相关资源
    最近更新 更多