如何使用 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