Вычислить матрицу перехода (Маркова) в R

29

Есть ли способ в R (встроенная функция) вычислить матрицу переходов для цепи Маркова из набора наблюдений?

Например, взять набор данных, подобный следующему, и вычислить матрицу перехода первого порядка?

dat<-data.frame(replicate(20,sample(c("A", "B", "C","D"), size = 100, replace=TRUE)))
B_Miner
источник
Что должна представлять эта матрица? Один прогон цепочки Маркова для каждой строки (или столбца)? Или...?
кардинал
Это 100 образцов последовательностей состояний (20 из них).
B_Miner
Вы ищете оценки вероятности или просто рассчитывает?
кардинал
Вероятностные оценки. Используя наблюдаемые последовательности, какова матрица вероятности перехода (4x4 в этом примере).
B_Miner

Ответы:

33

Я не сразу осведомлен о «встроенной» функции (например, в baseили аналогичной), но мы можем сделать это очень легко и эффективно в несколько строк кода.

Вот функция, которая принимает матрицу (а не фрейм данных) в качестве входных данных и создает либо countts перехода ( 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фрейма данных, который OP дает в качестве примера, есть столбцы данных, и они хотят матрицу перехода на столбец, или общую матрицу перехода, или мы можем просто превратить матрицу в вектор?)
Уэйн
@Wayne: (+1) Вы подняли хороший вопрос. Я предположил, что каждая строка является независимым прогоном цепочки Маркова, и поэтому мы ищем оценки вероятности перехода из этих цепочек, проходящих параллельно. Но даже если бы это была цепочка, которая, скажем, была обернута от одного конца строки до начала следующего, оценки все равно были бы гораздо ближе из-за структуры Маркова.
кардинал
1
@B_Miner: Да, так и есть, если можно разумно предположить, что каждый клиент ведет себя независимо от всех остальных. Такие модели и многие расширения относительно распространены при анализе поведения пользователей, например, при повторных посещениях веб-сайта и т. Д.
кардинал
25

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

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)

Это может помочь.

Джорджо Спедикато
источник
Очень хорошая упаковка! Будете ли вы поддерживать марковские цепи высшего порядка?
Уэйн
Меня спросили о цепочке Маркова высшего порядка, и другой парень пишет какой-то код. Если вы хотите принять участие в разработке кода, отправьте электронное письмо на адрес управляющего, и мы можем обсудить ...
Джорджио Спедикато
Привет, в чем разница между markovchainFit и функцией, опубликованной выше? Они дают одинаковые результаты? Спасибо
ааааа
1
markovchainFit