Р: Как создать матрицу переходов состояний из вектора, представляющего состояния на дискретных временных шагах?

Я использую R и мне нужна помощь.

Предыстория:
я снимал на видео участников поведенческого исследования. Затем я закодировал различные аспекты их поведения из видео, так что теперь у меня есть один фрейм данных для каждого участника. У df есть много неупорядоченных факторов, каждый из которых представляет дискретную временную последовательность состояний участника для одного конкретного поведенческого измерения (например, направления взгляда). Каждая строка содержит значение в течение одной секунды для этого измерения. Для упрощения предположим, что один такой вектор может выглядеть так:

p01.gaze = factor(x = c("a", "b", "b", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "b", "b", "a", "d", "d", "d", "a", "a", "a", "e", "e", "d", "e", "e", "a","a", "e", "a", "a", "a", "e", "e", "e", "e", "e", "e", "e", "e", "e", "e", "d", "b", "b", "b", "d", "d", "d", "d", "d", "d", "d", "b", "d", "d", "d", "d", "d", "d", "d", "d", "d", "d", "d", "d", "d", "d", "d", "d", "d", "d", "d", "d", "d", "d", "d", "d", "d", "d", "d", "d", "a", "b", "a", "d", "d", "a", "c", "e", "e", "e", "c", "c", "a", "e", "e", "a", "a", "a"))

Проблема:
Для каждого вектора я хочу построить "матрицу переходов между состояниями" путем вычисления частоты переходов (используя подсчет или, альтернативно, пропорцию) между всеми возможными парами состояний. Таким образом, матрица будет:

p01.gaze.m = matrix(nrow=5, ncol=5, dimnames = list(c("a", "b", "c", "d", "e"), c("a", "b", "c", "d", "e")))  

ПРИМЕЧАНИЯ:
1) Я новичок в программировании и не смог найти нужных функций. Я тщательно искал, но не нашел подходящих решений, поэтому любая помощь будет приветствоваться.

2) Функция markovchainFit (пакет markovchain) звучала заманчиво, но я не думаю, что хочу/нужно подгонять марковскую модель к своим данным (из-за последствий и обязательств, которые я не хочу брать на себя).

3) Функция count.transitions (пакет RDS) тоже звучала заманчиво, но я не мог сообразить, как принудительно преобразовать мои данные в объект rds.data.

Большое спасибо =]

Моэ


person moe    schedule 19.12.2015    source источник
comment
Вы должны спрашивать об одном за раз. Я склонен закрыть вопрос, но я бы просто оставил его, если вы отредактируете его, указав только проблему 1.   -  person nicola    schedule 19.12.2015
comment
Чтобы ответить на вопрос № 2, предоставьте соответствующий набор данных.   -  person tchakravarty    schedule 19.12.2015


Ответы (1)


Используйте пакет markovchain для ваших #1 и # 3.

Вот пример кода для ваших данных, который показывает подсчет переходов между состояниями, а затем график матрицы вероятности перехода:

library(markovchain)
p01.gaze = factor(x = c("a", "b", "b", "a", "a", "a", 
                        "a", "a", "a", "a", "a", "a", 
                        "a", "b", "b", "a", "d", "d", 
                        "d", "a", "a", "a", "e", "e", 
                        "d", "e", "e", "a","a", "e", 
                        "a", "a", "a", "e", "e", "e", 
                        "e", "e", "e", "e", "e", "e", 
                        "e", "d", "b", "b", "b", "d", 
                        "d", "d", "d", "d", "d", "d", 
                        "b", "d", "d", "d", "d", "d", 
                        "d", "d", "d", "d", "d", "d", 
                        "d", "d", "d", "d", "d", "d", 
                        "d", "d", "d", "d", "d", "d", 
                        "d", "d", "d", "d", "d", "a", 
                        "b", "a", "d", "d", "a", "c", 
                        "e", "e", "e", "c", "c", "a", 
                        "e", "e", "a", "a", "a"))
p01_gaze_tpm = createSequenceMatrix(p01.gaze, toRowProbs = TRUE)
p01_gaze_mc = as(p01_gaze_tpm, "markovchain")
plot(p01_gaze_mc, edge.arrow.size = 0.2)

Это дает следующий график: введите здесь описание изображения

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

person tchakravarty    schedule 19.12.2015
comment
Это здорово @fg-nu, большое спасибо. Прежде чем мы перейдем к задаче 2, позвольте мне добавить здесь некоторые уточнения: в идеале я хотел бы, чтобы график представлял не только вероятности переходов (как они это делают сейчас благодаря вам), но и общее время, проведенное в каждом состоянии. Есть ли способ сделать размеры узлов пропорциональными, например. количество отсчетов для каждого конкретного значения? Благодарность - person moe; 19.12.2015
comment
@moe Приведите пример вектора переходов состояний с указанием времени, проведенного в каждом состоянии. Это должно быть возможно, если указать аргумент vertex.size для plot. - person tchakravarty; 19.12.2015