Tính ma trận chuyển tiếp (Markov) theo R


29

Có cách nào trong R (một hàm tích hợp) để tính ma trận chuyển tiếp cho Chuỗi Markov từ một tập hợp các quan sát không?

Ví dụ: lấy một tập dữ liệu như sau và tính ma trận chuyển tiếp thứ tự đầu tiên?

dat<-data.frame(replicate(20,sample(c("A", "B", "C","D"), size = 100, replace=TRUE)))

Ma trận này được cho là gì để đại diện? Một lần chạy chuỗi Markov cho mỗi hàng (hoặc cột)? Hoặc là...?
Đức hồng y

Đây là 100 mẫu trình tự trạng thái (20 trong số đó).
B_Miner

Bạn đang tìm kiếm ước tính xác suất hoặc chỉ đếm?
Đức hồng y

Ước tính xác suất. Sử dụng các chuỗi được quan sát, ma trận xác suất chuyển tiếp là gì (4 x 4 trong ví dụ này).
B_Miner

Câu trả lời:


33

Tôi không biết ngay về một hàm "tích hợp" (ví dụ, trong basehoặc tương tự), nhưng chúng ta có thể thực hiện việc này rất dễ dàng và hiệu quả trong một vài dòng mã.

Đây là một hàm lấy ma trận (không phải khung dữ liệu) làm đầu vào và tạo ra số đếm chuyển tiếp ( prob=FALSE) hoặc theo mặc định ( prob=TRUE), xác suất chuyển tiếp ước tính.

# Function to calculate first-order Markov transition matrix.
# Each *row* corresponds to a single run of the Markov chain
trans.matrix <- function(X, prob=T)
{
    tt <- table( c(X[,-ncol(X)]), c(X[,-1]) )
    if(prob) tt <- tt / rowSums(tt)
    tt
}

Nếu bạn cần gọi nó trên khung dữ liệu, bạn luôn có thể làm

trans.matrix(as.matrix(dat))

Nếu bạn đang tìm kiếm một số gói của bên thứ ba, thì Rseek hoặc trang tìm kiếm R có thể cung cấp thêm tài nguyên.


1
+1 Ngoài ra còn có một số gói R, bao gồm HMMRHMMcó thể hữu ích.
Wayne

@Wayne: (1) Tôi đã tìm thấy các gói HMM khác nhau có sẵn trong Rrất khó tính trong quá khứ, đặc biệt là khi nói đến phù hợp và tôi không bao giờ tìm thấy một tôi thực sự thích hoặc đáng tin cậy. Có lẽ tình hình bây giờ tốt hơn. Tôi sẽ tưởng tượng họ sẽ làm điều này đúng, mặc dù. Nếu bạn biết về một giải pháp như vậy, xin vui lòng gửi nó như một câu trả lời; Tôi sẽ rất vui khi bình chọn nó!
Đức hồng y

1
Tôi đã cố gắng, nhưng không thành công. Vấn đề này không liên quan đến các trạng thái ẩn và các gói tôi tìm thấy không có bất kỳ chức năng tiện ích nào có thể làm bất cứ điều gì ngoài HMM đầy đủ. (Như một lưu ý phụ, datkhung dữ liệu mà OP đưa ra làm ví dụ có các cột dữ liệu và họ có muốn ma trận chuyển tiếp trên mỗi cột hoặc ma trận chuyển tiếp tổng thể hay chúng ta có thể biến ma trận thành một vectơ không?)
Wayne

@Wayne: (+1) Bạn nêu lên một điểm tốt. Tôi đã giả định rằng mỗi hàng là một chuỗi độc lập của chuỗi Markov và vì vậy chúng tôi đang tìm kiếm các ước tính xác suất chuyển tiếp từ các chuỗi này chạy song song. Nhưng, ngay cả khi đây là một chuỗi, được nói, được bọc từ một đầu của hàng xuống đến đầu tiếp theo, các ước tính vẫn sẽ khá gần hơn do cấu trúc Markov.
Đức hồng y

1
@B_Miner: Vâng, đúng vậy, miễn là bạn có thể cho rằng mỗi khách hàng cư xử độc lập với tất cả những người khác. Các mô hình như vậy và nhiều tiện ích mở rộng tương đối phổ biến trong việc phân tích hành vi của người dùng, ví dụ: trong các lần truy cập lặp lại vào một trang web, v.v.
hồng y

25

Tôi vừa tải lên gói R mới markovchain, dựa trên phong cách lập trình S4. Cùng với các phương pháp khác nhau để xử lý các đối tượng markovchain S4, nó chứa một hàm để khớp chuỗi Markov từ một chuỗi các trạng thái. Có một cái nhìn tại:

library(markovchain) 
sequence <- c("a", "b", "a", "a", "a", "a", "b", "a", "b", "a", 
              "b", "a", "a", "b", "b", "b", "a")
mcFit <- markovchainFit(data=sequence)

Nó có thể giúp.


Một gói rất đẹp! Bạn sẽ được hỗ trợ chuỗi Markov bậc cao hơn?
Wayne

Tôi đã được yêu cầu chuỗi Markov cao hơn và một người khác đang viết một số mã. Nếu bạn muốn tham gia phát triển mã, hãy gửi email đến địa chỉ của người quản lý và chúng ta có thể thảo luận ...
Giorgio Speesato

Xin chào, sự khác biệt giữa markovchainFit và chức năng được đăng ở trên là gì? Họ có mang lại kết quả tương tự? Cảm ơn
aaaaa

1
@aaaaa, hàm sẽ nhanh hơn kể từ khi xây dựng trong Rcpp và được biên dịch trong một gói. Ngoài ra nó xử lý nhiều định dạng dữ liệu hơn. markovchainFit
Giorgio Speesato
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.