如何使用 dplyr 在大型面板数据集中进行西格玛运算
How to to do sigma operations in large panel data set using dplyr
我有一个时间序列面板数据集,其结构如下:
有多个基金,每个基金拥有多只股票,我们有该投资组合中股票权重的时间序列和当年投资组合的总价值。
如您所见,面板不平衡。
df <- data.frame(
fund_id = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L),
stock_id = c(1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 3L, 3L, 2L, 2L, 3L, 3L, 3L),
year = c(2011L, 2012L, 2011L, 2012L, 2013L, 2011L, 2012L, 2013L, 2012L,2013L, 2011L, 2012L, 2013L, 2014L, 2011L, 2012L, 2013L),
weight = c(0.3L, 0.2L, 0.7L, 0.8L, 1L, 0.2L, 0.1L, 0.2L, 0.7L, 0.8L, 0.8L, 0.2L, 0.3L, 1L, 0.5L, 0.2L, 0.7L),
aum = c(3L, 3.5L, 3L, 3.5L, 4L, 5L, 4L, 5L, 4L, 5L, 5L, 4L, 6L, 7L, 5L, 6L, 6L)
)
> df
fund_id stock_id year weight aum
1 1 1 2011 0.3 3.0
2 1 1 2012 0.2 3.5
3 1 2 2011 0.7 3.0
4 1 2 2012 0.8 3.5
5 1 2 2013 1.0 4.0
6 2 1 2011 0.2 5.0
7 2 1 2012 0.1 4.0
8 2 1 2013 0.2 5.0
9 2 2 2012 0.7 4.0
10 2 2 2013 0.8 5.0
11 2 3 2011 0.8 5.0
12 2 3 2012 0.2 4.0
13 3 2 2013 0.3 6.0
14 3 2 2014 1.0 7.0
15 3 3 2011 0.5 5.0
16 3 3 2012 0.2 6.0
17 3 3 2013 0.7 6.0
>
我想为每年和每只股票计算以下公式:
请注意,i 是基金编号,n 是股票编号,在这种情况下,j 应该是除 i 之外的任何其他基金。该公式每年重复一次,所以我去掉了下标 t。 aum 仅取决于 fund_id 和年份,而不取决于股票,因此对于相同的基金和年份但股票 ID 不同,它的价值相同。
我正在考虑使用 dplyr 来执行此操作,但我有一个非常大的面板数据集,但不确定如何处理。
根据描述,按'year'、'stock_id'进行分组,然后将'aum'乘以'weight',同时提取整列的子集'aum' (.$aum
) 根据逻辑表达式 (.$fund_id != first(fund_id)
) 和 'weight',得到 sum
并用乘积 'aum' 除以 'weight'
library(dplyr)
df %>%
mutate(aumweight = aum * weight) %>%
group_by(year, stock_id) %>%
mutate(sn = {
tmp <- .$fund_id != first(fund_id)
(aumweight)/sum(.$aum[tmp] *
.$weight[tmp])
}, aumweight = NULL) %>%
ungroup
-输出
# A tibble: 17 × 6
fund_id stock_id year weight aum sn
<int> <int> <int> <dbl> <dbl> <dbl>
1 1 1 2011 0.3 3 0.0293
2 1 1 2012 0.2 3.5 0.0228
3 1 2 2011 0.7 3 0.0684
4 1 2 2012 0.8 3.5 0.0912
5 1 2 2013 1 4 0.130
6 2 1 2011 0.2 5 0.0326
7 2 1 2012 0.1 4 0.0130
8 2 1 2013 0.2 5 0.0368
9 2 2 2012 0.7 4 0.0912
10 2 2 2013 0.8 5 0.130
11 2 3 2011 0.8 5 0.147
12 2 3 2012 0.2 4 0.0294
13 3 2 2013 0.3 6 0.0586
14 3 2 2014 1 7 0.286
15 3 3 2011 0.5 5 0.0919
16 3 3 2012 0.2 6 0.0441
17 3 3 2013 0.7 6 0.171
我有一个时间序列面板数据集,其结构如下: 有多个基金,每个基金拥有多只股票,我们有该投资组合中股票权重的时间序列和当年投资组合的总价值。 如您所见,面板不平衡。
df <- data.frame(
fund_id = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L),
stock_id = c(1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 3L, 3L, 2L, 2L, 3L, 3L, 3L),
year = c(2011L, 2012L, 2011L, 2012L, 2013L, 2011L, 2012L, 2013L, 2012L,2013L, 2011L, 2012L, 2013L, 2014L, 2011L, 2012L, 2013L),
weight = c(0.3L, 0.2L, 0.7L, 0.8L, 1L, 0.2L, 0.1L, 0.2L, 0.7L, 0.8L, 0.8L, 0.2L, 0.3L, 1L, 0.5L, 0.2L, 0.7L),
aum = c(3L, 3.5L, 3L, 3.5L, 4L, 5L, 4L, 5L, 4L, 5L, 5L, 4L, 6L, 7L, 5L, 6L, 6L)
)
> df
fund_id stock_id year weight aum
1 1 1 2011 0.3 3.0
2 1 1 2012 0.2 3.5
3 1 2 2011 0.7 3.0
4 1 2 2012 0.8 3.5
5 1 2 2013 1.0 4.0
6 2 1 2011 0.2 5.0
7 2 1 2012 0.1 4.0
8 2 1 2013 0.2 5.0
9 2 2 2012 0.7 4.0
10 2 2 2013 0.8 5.0
11 2 3 2011 0.8 5.0
12 2 3 2012 0.2 4.0
13 3 2 2013 0.3 6.0
14 3 2 2014 1.0 7.0
15 3 3 2011 0.5 5.0
16 3 3 2012 0.2 6.0
17 3 3 2013 0.7 6.0
>
我想为每年和每只股票计算以下公式:
请注意,i 是基金编号,n 是股票编号,在这种情况下,j 应该是除 i 之外的任何其他基金。该公式每年重复一次,所以我去掉了下标 t。 aum 仅取决于 fund_id 和年份,而不取决于股票,因此对于相同的基金和年份但股票 ID 不同,它的价值相同。
我正在考虑使用 dplyr 来执行此操作,但我有一个非常大的面板数据集,但不确定如何处理。
根据描述,按'year'、'stock_id'进行分组,然后将'aum'乘以'weight',同时提取整列的子集'aum' (.$aum
) 根据逻辑表达式 (.$fund_id != first(fund_id)
) 和 'weight',得到 sum
并用乘积 'aum' 除以 'weight'
library(dplyr)
df %>%
mutate(aumweight = aum * weight) %>%
group_by(year, stock_id) %>%
mutate(sn = {
tmp <- .$fund_id != first(fund_id)
(aumweight)/sum(.$aum[tmp] *
.$weight[tmp])
}, aumweight = NULL) %>%
ungroup
-输出
# A tibble: 17 × 6
fund_id stock_id year weight aum sn
<int> <int> <int> <dbl> <dbl> <dbl>
1 1 1 2011 0.3 3 0.0293
2 1 1 2012 0.2 3.5 0.0228
3 1 2 2011 0.7 3 0.0684
4 1 2 2012 0.8 3.5 0.0912
5 1 2 2013 1 4 0.130
6 2 1 2011 0.2 5 0.0326
7 2 1 2012 0.1 4 0.0130
8 2 1 2013 0.2 5 0.0368
9 2 2 2012 0.7 4 0.0912
10 2 2 2013 0.8 5 0.130
11 2 3 2011 0.8 5 0.147
12 2 3 2012 0.2 4 0.0294
13 3 2 2013 0.3 6 0.0586
14 3 2 2014 1 7 0.286
15 3 3 2011 0.5 5 0.0919
16 3 3 2012 0.2 6 0.0441
17 3 3 2013 0.7 6 0.171