Марковская модель диаграммы напрямую из данных (маковчейн или пакет deemod?) - PullRequest
0 голосов
/ 01 сентября 2018

Я хочу прочитать кучу факторных данных и создать из них матрицу переходов, которую я могу визуализировать. Я нашел очень приятный пакет, названный «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)

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

1 Ответ

0 голосов
/ 01 сентября 2018

Ввод в 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))

enter image description here

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

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

enter image description here

Обоснование do.call

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

define_transition(dimMatrix, state_names = colnames(dimMatrix))

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...