График перехода участка в R - PullRequest
0 голосов
/ 17 января 2019

У меня есть данные, структурированные следующим образом:

transition_list <- list(c('A', 'B'), c('A', 'C', 'D'))

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

График должен быть следующим: я хочу, чтобы у краев были вероятности перехода из одного состояния в другое, оцениваемые по всему списку. То есть здесь вероятность перехода от A к B должна быть 1/2, а вероятность перехода от A к C должна быть 1/2. Я не могу объединить векторы, так как это обеспечит вероятность перехода 1 из B в A, а это не то, чем оно является.

Мне известно, что этот вопрос аналогичен, но мне нужен его со списком векторов, а не с вектором.

1 Ответ

0 голосов
/ 17 января 2019

Я не создал график для вас, но я могу создать данные, которые вам понадобятся для графика. Мой подход итеративный, и чтобы избежать написания циклов for, я использую функцию map из пакета purrr.

Во-первых, я позволил себе немного расширить ваши данные:

transition_list <- list(c('A', 'B', 'D', 'X'), c('A', 'C', 'D', 'X'), c('A', 'B', 'E', 'X'))

Далее нам понадобятся следующие пакеты:

library(purrr)
library(dplyr)

Во-первых, я пишу пользовательскую функцию, которая преобразует один вектор во фрейм данных. Каждый «шаг» приводит к двум значениям: from и to. Поэтому длина моего цикла равна длине вектора минус один.

browse_individual <- function(states) {
  map_df(
    1:(length(states)-1),
    ~list(from = states[.x], to = states[.x+1])
  )
}

Этот код очень лаконичен, но вот что он делает: первый аргумент map_df - это то, что мы собираемся зациклить. Это длина вектора минус один. Второй аргумент - это то, что мы хотим вернуть для каждого шага, который представляет собой список из двух элементов, содержащий текущий элемент как from и следующий элемент как to. Специальная функция map_df преобразует выходные данные (список списков) во фрейм данных.

Далее нам нужно применить эту функцию к каждому вектору в вашем списке.

state_changes <- map_df(transition_list, browse_individual)

Здесь я снова использую map_df. Результатом каждого шага цикла является фрейм данных (а именно тот, который возвращает browse_individual). Все эти кадры данных объединяются в один кадр данных, который называется state_changes.

Следующая часть представляет собой некоторый код dplyr, который подсчитывает, как часто происходит изменение, и вычисляет, насколько он вероятен с учетом позиции from.

state_change_prob <- state_changes %>%
  count(from, to) %>%
  group_by(from) %>%
  mutate(prob = n / sum(n)) %>%
  select(from, to, prob) %>%
  ungroup()

В итоге мы получаем такой результат:

> state_change_prob
#> # A tibble: 7 x 3
#>   from  to     prob
#>   <chr> <chr> <dbl>
#> 1 A     B     0.667
#> 2 A     C     0.333
#> 3 B     D     0.5  
#> 4 B     E     0.5  
#> 5 C     D     1    
#> 6 D     X     1    
#> 7 E     X     1 

Я надеюсь, что это ответ на ваш вопрос, и вы можете построить сюжет на основе этого формата данных.

...