gpt4 book ai didi

马尔可夫链的R模拟

转载 作者:行者123 更新时间:2023-12-04 10:26:17 24 4
gpt4 key购买 nike

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 等于毕业。等等。这是数据1。

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

最佳答案

这是一个基本的 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 , IE。,
    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]
    })

    然后你就可以追踪 n来自 110通过使用
    markov(x,seq(10))

    关于马尔可夫链的R模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60624175/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com