2010-05-02 34 views
8

Tôi đang tìm một thứ giống như gói 'msm', nhưng đối với chuỗi Markov rời rạc. Ví dụ: nếu tôi có ma trận chuyển đổi được xác định làThư viện R cho mô phỏng chuỗi Markov rời rạc

Pi <- matrix(c(1/3,1/3,1/3, 
0,2/3,1/6, 
2/3,0,1/2)) 

cho các bang A, B, C. Làm thế nào tôi có thể mô phỏng một chuỗi Markov theo ma trận chuyển tiếp đó?

Cảm ơn,

+2

NVM: Tìm thấy câu trả lời http://books.google.com/books?id=AALhk_mt7SYC&lpg=PA116&dq=r%20markov%20chain&pg=PA119#v=onepage&q=r%20markov%20chain&f=false – stevejb

Trả lời

8

Một khi trở lại tôi đã viết một tập hợp các chức năng để mô phỏng và ước tính các ma trận xác suất chuỗi Markov rời rạc: http://www.feferraz.net/files/lista/DTMC.R.

mã có liên quan cho những gì bạn đang hỏi:

simula <- function(trans,N) { 
     transita <- function(char,trans) { 
       sample(colnames(trans),1,prob=trans[char,]) 
     } 

sim <- character(N) 
sim[1] <- sample(colnames(trans),1) 
for (i in 2:N) { 
    sim[i] <- transita(sim[i-1],trans) 
} 

sim 
} 

#example 
#Obs: works for N >= 2 only. For higher order matrices just define an 
#appropriate mattrans 
mattrans <- matrix(c(0.97,0.03,0.01,0.99),ncol=2,byrow=TRUE) 
colnames(mattrans) <- c('0','1') 
row.names(mattrans) <- c('0','1') 
instancia <- simula(mattrans,255) # simulates 255 steps in the process 
6

Argh, bạn tìm thấy giải pháp trong khi tôi đang viết nó lên cho bạn. Dưới đây là một ví dụ đơn giản mà tôi đã đưa ra:

run = function() 
{ 
    # The probability transition matrix 
    trans = matrix(c(1/3,1/3,1/3, 
       0,2/3,1/3, 
       2/3,0,1/3), ncol=3, byrow=TRUE); 

    # The state that we're starting in 
    state = ceiling(3 * runif(1, 0, 1)); 
    cat("Starting state:", state, "\n"); 

    # Make twenty steps through the markov chain 
    for (i in 1:20) 
    { 
     p = 0; 
     u = runif(1, 0, 1); 

     cat("> Dist:", paste(round(c(trans[state,]), 2)), "\n"); 
     cat("> Prob:", u, "\n"); 

     newState = state; 
     for (j in 1:ncol(trans)) 
     { 
      p = p + trans[state, j]; 
      if (p >= u) 
      { 
       newState = j; 
       break; 
      } 
     } 

     cat("*", state, "->", newState, "\n"); 
     state = newState; 
    } 
} 

run(); 

Lưu ý rằng ma trận chuyển đổi xác suất của bạn không cộng lại thành 1 trong mỗi hàng. Ví dụ của tôi có ma trận chuyển đổi xác suất hơi thay đổi tuân thủ quy tắc này.

+0

Cám ơn câu trả lời. Mã của bạn rất dễ đọc. Tôi rất trân trọng điều này. – stevejb

+2

Mã có thể đọc được? Theo kinh nghiệm của tôi, khái niệm này đã hoàn toàn bị mất trên hầu hết những người sử dụng 'R'. Hy vọng nó giúp! – icio

+4

Để tạo một số nguyên ngẫu nhiên từ 1 đến 3, tôi nghĩ rằng 'mẫu (1: 3, 1)' dễ hơn một chút so với 'trần (3 * runif (1, 0, 1))'. Ngoài ra, với vòng lặp trong cùng, bạn có thể sử dụng 'newState <- sample (1: ncol (trans), 1, prob = trans [state,])'. Điều đó cho thấy rõ ràng hơn những gì đang xảy ra. Và sau đó bạn thậm chí sẽ không phải bình thường hóa các hàng. –

5

Bây giờ bạn có thể sử dụng markovchain gói sẵn trong cran. Người dùng manual. là khá tốt và có một số ví dụ.

Các vấn đề liên quan