【问题标题】:How to to do sigma operations in large panel data set using dplyr如何使用 dplyr 在大型面板数据集中进行 sigma 运算
【发布时间】:2022-01-21 02:15:26
【问题描述】:

我有一个时间序列面板数据集,其结构如下: 有多个基金,每个基金都拥有多只股票,我们有该投资组合中股票权重的时间序列以及当年投资组合的总价值。 如您所见,面板不平衡。

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 和 year 而不是股票,因此对于相同的基金和年份,它的值相同,但股票 id 不同。
我正在考虑使用 dplyr 来执行此操作,但我有一个非常大的面板数据集,不知道如何解决这个问题。

【问题讨论】:

    标签: r dplyr panel-data


    【解决方案1】:

    根据描述,按“year”、“stock_id”进行分组,然后将“aum”乘以“weight”,同时根据逻辑表达式 (.$fund_id != first(fund_id)) 和“权重”,得到 sum 并除以乘以“aum”和“权重”

    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 
    

    【讨论】:

    • 当我试图将它应用到一个非常大的数据集时,代码只会花很长时间。如果我只想计算分母,那么最有效的方法是什么?
    • @ErwinRhine 我认为问题在于我们计算了两次.$fund_id != first(fund_id)。取而代之的是,创建一个临时变量并使用它。尝试更新
    • @ErwinRhine 另外,aum * weight 可以在组外完成。 (更新)
    猜你喜欢
    • 2020-12-26
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 2021-12-08
    • 2018-06-22
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    相关资源
    最近更新 更多