基于投资组合随时间变化的概率数据矩阵
probability data matrix based on portfolio change over period
我有一个像这样的大面板数据的数据框
Date Firms Portfolio
2007-02-01 A 1
2007-02-01 B 1
2007-02-01 C 2
2007-02-01 D 2
2007-02-01 E 3
2007-02-01 F 3
2007-03-01 C 1
2007-03-01 B 1
2007-03-01 A 2
2007-03-01 F 2
2007-03-01 E 3
2007-03-01 D 3
这里每个时期都有固定数量的投资组合(在上面的例子中是三个)。现在我想创建一个这样的逻辑概率矩阵。
port1 port2 port3
port1 0.5 0.5 0
port2 0.5 0 0.5
port3 0 0.5 0.5
如果你考虑第 1 期的投资组合 1,组合是 A 和 B。但是在第 2 期,投资组合 1 有 B 和 C,这意味着 50% 的股票(只有 B)在下一个投资组合 1 中时期。投资组合 1 的其他 50% 的股票进入投资组合 2,因为股票 A 在 2007-03-01 期间在投资组合 2 中。投资组合 3 在第二个时期 (2007-03-01) 有 E 和 D,这意味着没有股票来自投资组合 1。所以我们分配 port1-port3 单元格 0。类似的方式我喜欢在其他两个投资组合列中分配概率.
现在如果这个过程持续 100 个周期,我们将有 99 个这样的矩阵。但是我需要一个矩阵来表示这 99 个矩阵的平均值。
这是使用 dplyr
和 tidyr
的方法:
library(dplyr); library(tidyr)
a <- data %>%
# First get long-format listing of all Date-Firms shifts
arrange(Date, Firms) %>%
group_by(Firms) %>%
mutate(to = lead(Portfolio)) %>%
rename(from = Portfolio) %>%
ungroup() %>%
# What share of that month's moves with that to & from?
group_by(Date, from, to) %>%
tally() %>%
mutate(share = n / sum(n)) %>%
ungroup()
a
table 将以 "long" 格式保存所有概率矩阵,其中 Date
、to
和 [= 的每个现有组合18=] 得到一行。要获得所有矩阵的平均值(每个矩阵都是共享一个日期的 a
的所有行),我们可以取所有 to/from 组合的平均值。
a_summary <- a %>%
group_by(from, to) %>%
summarize(avg = mean(share, na.rm = T)) %>%
ungroup() %>%
spread(from, avg, fill = 0)
> a_summary
# A tibble: 4 x 4
to `1` `2` `3`
<int> <dbl> <dbl> <dbl>
1 1 0.5 0.75 0
2 2 0.5 0 0.5
3 3 0 0.5 0.5
4 NA 1 1 1
样本数据(添加第三期):
data <- read.table(header = T, text = "
Date Firms Portfolio
2007-02-01 A 1
2007-02-01 B 1
2007-02-01 C 2
2007-02-01 D 2
2007-02-01 E 3
2007-02-01 F 3
2007-03-01 C 1
2007-03-01 B 1
2007-03-01 A 2
2007-03-01 F 2
2007-03-01 E 3
2007-03-01 D 3
2007-04-01 A 1
2007-04-01 B 1
2007-04-01 C 2
2007-04-01 D 2
2007-04-01 E 3
2007-04-01 F 1")
我有一个像这样的大面板数据的数据框
Date Firms Portfolio
2007-02-01 A 1
2007-02-01 B 1
2007-02-01 C 2
2007-02-01 D 2
2007-02-01 E 3
2007-02-01 F 3
2007-03-01 C 1
2007-03-01 B 1
2007-03-01 A 2
2007-03-01 F 2
2007-03-01 E 3
2007-03-01 D 3
这里每个时期都有固定数量的投资组合(在上面的例子中是三个)。现在我想创建一个这样的逻辑概率矩阵。
port1 port2 port3
port1 0.5 0.5 0
port2 0.5 0 0.5
port3 0 0.5 0.5
如果你考虑第 1 期的投资组合 1,组合是 A 和 B。但是在第 2 期,投资组合 1 有 B 和 C,这意味着 50% 的股票(只有 B)在下一个投资组合 1 中时期。投资组合 1 的其他 50% 的股票进入投资组合 2,因为股票 A 在 2007-03-01 期间在投资组合 2 中。投资组合 3 在第二个时期 (2007-03-01) 有 E 和 D,这意味着没有股票来自投资组合 1。所以我们分配 port1-port3 单元格 0。类似的方式我喜欢在其他两个投资组合列中分配概率.
现在如果这个过程持续 100 个周期,我们将有 99 个这样的矩阵。但是我需要一个矩阵来表示这 99 个矩阵的平均值。
这是使用 dplyr
和 tidyr
的方法:
library(dplyr); library(tidyr)
a <- data %>%
# First get long-format listing of all Date-Firms shifts
arrange(Date, Firms) %>%
group_by(Firms) %>%
mutate(to = lead(Portfolio)) %>%
rename(from = Portfolio) %>%
ungroup() %>%
# What share of that month's moves with that to & from?
group_by(Date, from, to) %>%
tally() %>%
mutate(share = n / sum(n)) %>%
ungroup()
a
table 将以 "long" 格式保存所有概率矩阵,其中 Date
、to
和 [= 的每个现有组合18=] 得到一行。要获得所有矩阵的平均值(每个矩阵都是共享一个日期的 a
的所有行),我们可以取所有 to/from 组合的平均值。
a_summary <- a %>%
group_by(from, to) %>%
summarize(avg = mean(share, na.rm = T)) %>%
ungroup() %>%
spread(from, avg, fill = 0)
> a_summary
# A tibble: 4 x 4
to `1` `2` `3`
<int> <dbl> <dbl> <dbl>
1 1 0.5 0.75 0
2 2 0.5 0 0.5
3 3 0 0.5 0.5
4 NA 1 1 1
样本数据(添加第三期):
data <- read.table(header = T, text = "
Date Firms Portfolio
2007-02-01 A 1
2007-02-01 B 1
2007-02-01 C 2
2007-02-01 D 2
2007-02-01 E 3
2007-02-01 F 3
2007-03-01 C 1
2007-03-01 B 1
2007-03-01 A 2
2007-03-01 F 2
2007-03-01 E 3
2007-03-01 D 3
2007-04-01 A 1
2007-04-01 B 1
2007-04-01 C 2
2007-04-01 D 2
2007-04-01 E 3
2007-04-01 F 1")