在 R 中绘制转换图
Plot transition graph in R
我的数据结构如下:
transition_list <- list(c('A', 'B'), c('A', 'C', 'D'))
我想绘制列表的转换矩阵。我们可以将列表中的每个向量视为一个个体,并将向量中的每个元素视为个体的连续状态。
情节应该是这样的:我希望边缘有从一个状态到另一个状态的概率,通过整个列表来估计。也就是说,这里从 A 到 B 的概率应该是 1/2,从 A 到 C 的概率应该是 1/2。我无法连接向量,因为这会提供从 B 到 A 的概率 1,但事实并非如此。
我知道 this question 很相似,但我需要它与向量列表而不是向量。
我没有为您创建绘图,但我可以创建绘图所需的数据。我的方法是迭代的,为了避免编写 for 循环,我使用 purrr
包中的 map
函数。
首先,我冒昧地扩展了您的数据:
transition_list <- list(c('A', 'B', 'D', 'X'), c('A', 'C', 'D', 'X'), c('A', 'B', 'E', 'X'))
接下来,这些是我们需要的包:
library(purrr)
library(dplyr)
首先,我正在编写一个自定义函数,将一个向量转换为数据框。每个 'step' 都会产生两个值:from
和 to
。因此,我的循环长度等于向量的长度减一。
browse_individual <- function(states) {
map_df(
1:(length(states)-1),
~list(from = states[.x], to = states[.x+1])
)
}
这段代码非常简洁,但它的作用如下:map_df
的第一个参数是我们要循环的内容。那是向量的长度减一。第二个参数是我们想要的每一步 return,它是一个包含两个元素的列表,包含当前元素 from
和下一个元素 to
。具体函数 map_df
将输出(列表的列表)转换为数据框。
接下来,我们需要将此函数应用于列表中的每个向量。
state_changes <- map_df(transition_list, browse_individual)
这里我再次使用 map_df
。循环的每一步输出都是一个数据帧(即browse_individual
returns的那个)。所有这些数据帧组合成一个名为 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
我希望这是对您问题的回答,并且您可以根据此数据格式构建绘图。
我的数据结构如下:
transition_list <- list(c('A', 'B'), c('A', 'C', 'D'))
我想绘制列表的转换矩阵。我们可以将列表中的每个向量视为一个个体,并将向量中的每个元素视为个体的连续状态。
情节应该是这样的:我希望边缘有从一个状态到另一个状态的概率,通过整个列表来估计。也就是说,这里从 A 到 B 的概率应该是 1/2,从 A 到 C 的概率应该是 1/2。我无法连接向量,因为这会提供从 B 到 A 的概率 1,但事实并非如此。
我知道 this question 很相似,但我需要它与向量列表而不是向量。
我没有为您创建绘图,但我可以创建绘图所需的数据。我的方法是迭代的,为了避免编写 for 循环,我使用 purrr
包中的 map
函数。
首先,我冒昧地扩展了您的数据:
transition_list <- list(c('A', 'B', 'D', 'X'), c('A', 'C', 'D', 'X'), c('A', 'B', 'E', 'X'))
接下来,这些是我们需要的包:
library(purrr)
library(dplyr)
首先,我正在编写一个自定义函数,将一个向量转换为数据框。每个 'step' 都会产生两个值:from
和 to
。因此,我的循环长度等于向量的长度减一。
browse_individual <- function(states) {
map_df(
1:(length(states)-1),
~list(from = states[.x], to = states[.x+1])
)
}
这段代码非常简洁,但它的作用如下:map_df
的第一个参数是我们要循环的内容。那是向量的长度减一。第二个参数是我们想要的每一步 return,它是一个包含两个元素的列表,包含当前元素 from
和下一个元素 to
。具体函数 map_df
将输出(列表的列表)转换为数据框。
接下来,我们需要将此函数应用于列表中的每个向量。
state_changes <- map_df(transition_list, browse_individual)
这里我再次使用 map_df
。循环的每一步输出都是一个数据帧(即browse_individual
returns的那个)。所有这些数据帧组合成一个名为 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
我希望这是对您问题的回答,并且您可以根据此数据格式构建绘图。