我有一个像这样的大面板数据的数据框
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个矩阵的平均值。
答案 0 :(得分:0)
这是使用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
表将以“长”格式保存所有概率矩阵,其中Date
,to
和from
的每个现有组合都会排成一行。要获得所有矩阵的平均值(每一个矩阵都是a
共享一个日期的所有行),我们可以取所有往返组合的平均值。
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")