簡體   English   中英

馬爾可夫鏈的R模擬

[英]R Simulation Of Markov Chain

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 ,即,

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]
})

然后您可以使用以下方法跟蹤n110

markov(x,seq(10))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM