我有一个这样的面板数据框

date        firms   return   mkreturn
5/1/1988        A       5       4
6/1/1988        A       6       6
7/1/1988        A       4       12
8/1/1988        A       5       3
9/1/1988        A       6       12
11/1/1988       A       6       14
12/1/1988       A       12      5
13/01/1988      A       3       6
14/01/1988      A       2       4
15/01/1988      A       5       5
16/01/1988      A       2       6
18/01/1988      A       7       6
19/01/1988      A       3       2
20/01/1988      A       5       7
21/01/1988      A       7       2
22/01/1988      A       5       5
23/01/1988      A       9       7
25/01/1988      A       1       5
26/01/1988      A       5       6
27/01/1988      A       2       6
28/01/1988      A       7       12
29/01/1988      A       2       3
5/1/1988        B       5       2
6/1/1988        B       7       5
7/1/1988        B       5       5
8/1/1988        B       9       7
9/1/1988        B       1       5
11/1/1988       B       5       6
12/1/1988       B       2       12
13/01/1988      B       7       6
14/01/1988      B       2       11
15/01/1988      B       5       2
16/01/1988      B       6       14
18/01/1988      B       8       12
19/01/1988      B       5       15
20/01/1988      B       4       8
21/01/1988      B       3       9
22/01/1988      B       18      10
23/01/1988      B       5       3
25/01/1988      B       2       5
26/01/1988      B       7       6
27/01/1988      B       3       8
28/01/1988      B       9       5
29/01/1988      B       2       3

我想找出每个公司的收益与市场收益的每月协方差。因此,预期的输出就像
date        Firms       cov(return, mkreturn)
Jan-88       A             ....
Jan-88       B             ....

我使用以下公式找出月度差异
df_var<-aggregate( return ~ Month+Year+firms, df , var )

如何修改此公式以找出协方差?请在这方面帮助我。

最佳答案

我们将'date'转换为Date类,在format步骤中将其'group_by'转换为'month-year'格式,并与'firms'一起应用cov

library(dplyr)
library(lubridate)
df %>%
   group_by(date = format(dmy(date), '%b-%y'), firms) %>%
   summarise(cov = cov(return, mkreturn))

data.table的类似选项
library(data.table)
setDT(df)[, .(cov = cov(return, mkreturn)),
     .(date = format(as.Date(date, '%d/%m/%Y'), '%b-%y'), firms)]
#     date firms      cov
#1: Jan-88     A 1.727273
#2: Jan-88     B 1.653680

或使用base R使用split
lst1 <- split(df, list(df$firms, format(as.Date(df$date, '%d/%m/%Y'),
                '%b-%y')), drop = TRUE)
sapply(lst1, function(x) cov(x$return, x$mkreturn))

关于r - 面板数据中的每月协方差计算-r,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53994449/

10-12 22:31