在R中绘制过渡图

时间:2019-01-17 15:48:31

标签: r ggplot2 plot plotly markov-chains

我的数据结构如下:

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

,我想绘制列表的转移矩阵。我们可以将列表中的每个向量视为一个个体,并将向量的每个元素视为该个体的连续状态。

绘图应采用以下方式:我希望边缘具有从一个状态到另一个状态(通过整个列表进行估计)的概率。也就是说,这里从A到B的概率应该是1/2,从A到C的概率应该是1/2。我无法连接向量,因为这将提供从B到A的概率1,而不是它。

我知道this question是相似的,但是我需要使用向量列表而不是向量。

1 个答案:

答案 0 :(得分:1)

我没有为您创建绘图,但是我可以创建绘图所需的数据。我的方法是迭代的,为避免编写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)

首先,我正在编写一个自定义函数,它将一个矢量转换为一个数据帧。每个“步骤”产生两个值:fromto。因此,我的循环的长度等于向量的长度减去一。

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 

我希望这是您的问题的答案,并且您可以基于此数据格式构建图。