Обчисліть матрицю переходу (Маркова) в R


29

Чи є спосіб у R (вбудована функція) обчислити матрицю переходу ланцюга Маркова з набору спостережень?

Наприклад, взявши набір даних, як описано нижче, та обчислити матрицю переходу першого порядку?

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

Що ця матриця повинна представляти? Один запуск ланцюга Маркова для кожного ряду (або стовпця)? Або ...?
кардинал

Це 100 зразків послідовностей станів (20 з них).
B_Miner

Ви шукаєте оцінки ймовірності чи просто рахуєте?
кардинал

Оцінки ймовірності. Використовуючи спостережувані послідовності, що є матрицею ймовірності переходу (4x4 у цьому прикладі).
B_Miner

Відповіді:


33

Мені не одразу відомо про "вбудовану" функцію (наприклад, в baseабо подібну), але ми можемо це зробити дуже просто та ефективно за пару рядків коду.

Ось функція, яка приймає матрицю (а не кадр даних) як вхідний дані і створює оцінені ймовірності переходу або рахує переходи ( prob=FALSE), або, за замовчуванням ( prob=TRUE).

# 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
}

Якщо вам потрібно зателефонувати на кадр даних, ви завжди можете це зробити

trans.matrix(as.matrix(dat))

Якщо ви шукаєте якийсь сторонній пакет, то Rseek або пошуковий сайт R можуть надавати додаткові ресурси.


1
+1 Є також кілька пакетів R, в тому числі HMMі RHMMщо може бути корисним.
Уейн

@Wayne: (+1) Я виявив, що різні пакети HMM в минулому Rбули дуже вибагливими, особливо коли мова йде про підгонку, і я ніколи не знайшов жодного, який мені справді сподобався або довіряв. Можливо, зараз ситуація краща. Я б подумав, що вони отримають таке право. Якщо ви знаєте таке рішення, будь ласка, подайте його як відповідь; Я був би радий проголосувати за це!
кардинал

1
Я намагався, але без успіху. Ця проблема не стосується прихованих станів, і знайдені нами пакети не мають жодних функцій утиліти, які б виконували щось менше, ніж повномасштабний HMM. (Як бічне зауваження, datкадр даних, який ОП наводить як приклад, містить стовпці даних. Чи хочуть вони матрицю переходу на стовпець або загальну матрицю переходу чи ми можемо просто перетворити матрицю у вектор?)
Уейн

@Wayne: (+1) Ви піднімаєте хорошу точку. Я припускав, що кожен ряд є незалежним пробігом ланцюга Маркова, і тому ми шукаємо оцінки ймовірності переходу з цих ланцюгів, які працюють паралельно. Але навіть якби це був ланцюжок, який, скажімо, загорнутий з одного кінця ряду вниз до початку наступного, оцінки все-таки були б досить близькими завдяки структурі Маркова.
кардинал

1
@B_Miner: Так, до тих пір, поки ви обгрунтовано можете припустити, що кожен клієнт поводиться незалежно від усіх інших. Такі моделі та багато розширень відносно поширені при аналізі поведінки користувачів, наприклад, при повторних відвідуваннях веб-сайту тощо.
кардинал

25

Я щойно завантажив новий пакет R markovchain, заснований на стилі програмування S4. Поряд з різними методами обробки об'єктів S4 markovchain, він містить функцію для підключення ланцюга Маркова з послідовності станів. Подивіться на:

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)

Це може допомогти.


Дуже приємний пакет! Чи будете ви підтримувати Марківські ланцюги вищого порядку?
Уейн

Мене попросять ланцюжок Маркова вищого порядку, а інший хлопець пише якийсь код. Якщо ви хочете взяти участь у розробці коду, надішліть електронний лист на адресу mantainer, і ми можемо обговорити ...
Giorgio Spedicato

Привіт, яка різниця між markovchainFit та функцією, розміщеною вище? Чи дають вони однакові результати? Спасибі
ааааа

1
markovchainFit
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.