Диаграмма модели Маркова непосредственно из данных (пакет makovchain или deemod?)

Я хочу прочитать кучу факторных данных и создать из них матрицу перехода, которую я могу хорошо визуализировать. Я нашел очень приятный пакет под названием «heemod», который вместе с «диаграммой» делает достойную работу.

Для моего первого быстрого и грязного подхода я запустил фрагмент кода Python, чтобы добраться до матрицы, а затем использовал этот фрагмент кода R для рисования графика. Обратите внимание, что вероятности перехода исходят из этого нераскрытого и менее важного кода Python, но вы также можете просто предположить, что я вычислил их на бумаге.

library('heemod')
library('diagram')
mat_dim <- define_transition(
  state_names = c('State_A', 'State_B', 'State_C'),
  .18, .73, .09, 
  .22, .0, .78,
  .58, .08, .33);
plot(mat_dim)

Однако я хотел бы интегрировать все в R и сгенерировать матрицу перехода и график в R и напрямую из данных последовательности.

Это то, что у меня есть до сих пор:

library(markovchain)
library('heemod')
library('diagram')

# the data --- this is normally read from a file
data = c(1,2,1,1,1,2,3,1,3,1,2,3,1,2,1,2,3,3,3,1,2,3,2,3,1,2,3,3,1,2,3,3,1)
fdata = factor(data)
rdata = factor(data,labels=c("State_A","State_B","State_C"))

# create transition matrix
dimMatrix = createSequenceMatrix(rdata, toRowProbs = TRUE)
dimMatrix

ВОПРОС: как я могу передать dimMatrix, чтобы define_transition мог его обработать?

mat_dim <- define_transition( ??? );
plot(mat_dim)

Любые идеи? Есть ли лучшие/более простые решения?


person RalfB    schedule 01.09.2018    source источник


Ответы (1)


Ввод в define_transition кажется довольно неудобным. Возможно, это из-за моей неопытности с пакетом heemod, но кажется, что единственный способ ввода переходов — поэлементный.

Вот обходной путь

library(heemod)
library(diagram)

сначала преобразуйте матрицу перехода в список. Я использовал округление цифр, которое не является обязательным. Это соответствует ... переменным в define_transition

lis <- as.list(round(dimMatrix, 3))

теперь добавьте в список все остальные именованные аргументы, которые вы хотите:

lis$state_names = colnames(dimMatrix)

а теперь передайте эти аргументы в define_transition, используя do.call:

plot(do.call(define_transition, lis))

введите здесь описание изображения

Обновление: на вопрос в комментариях:

lis <- as.list(t(round(dimMatrix, 3)))
lis$state_names = colnames(dimMatrix)
plot(do.call(define_transition, lis))

введите здесь описание изображения

Причина do.call

Самый очевидный способ (который здесь не работает) - это сделать:

define_transition(dimMatrix, state_names = colnames(dimMatrix))

однако это выдает ошибку, поскольку define_transition ожидает, что каждый переход будет предоставлен как аргумент, а не как матрица или список. Чтобы не печатать:

define_transition(0.182, 0.222,..., state_names = colnames(dimMatrix))

можно поместить все аргументы в список, а затем вызвать do.call в этом списке, как это сделал я.

person missuse    schedule 01.09.2018
comment
Это работает. Однако мне просто интересно, почему следующий код здесь не работает? mat_dim ‹- определить_переход (lis); plot(mat_dim) Делает ли do.call что-то большее, чем вызов define_transition с этим списком? - person RalfB; 01.09.2018
comment
Кроме того, вероятности кажутся обратными (например, исходная вероятность перехода из состояния_А в состояние_В кажется вероятностью перехода из состояния_В в состояние_А). Я что-то не так сделал или список что-то перепутал? - person RalfB; 01.09.2018
comment
do.call вызывает функцию, в данном случае define_transition в списке аргументов, в данном случае все аргументы находятся в lis, я выполнил это таким образом, так как не вижу другого способа передать матрицу перехода в объект R. Если вероятности поменялись местами, то можно выполнить transpose до unlist. Проверьте редактирование, пожалуйста. - person missuse; 01.09.2018