如何计算 R 中矩阵列表的平均值
How to compute the mean of a list of matrices in R
我有一个 data.table,其中包含以下列:月份、Return、超额 Return、Beta、Momentum、MktCap,每月一次,涵盖一堆股票。我想计算按月分组的所有这些变量的月度相关性,然后得到月度相关性的平均值。到目前为止我有这个:
all_spearman_corr <- Sub_Sample_Spearman %>%
split(.$Month) %>% map(select, -c(Month)) %>% map(cor,method = "spearman", use = "complete.obs")
它给了我每月的相关性。
all_spearman_corr[["196308"]] <- structure(c(1, 1, 0.08264061, 0.08264061, 0.08043907, 0.05978233,
0.078441391, 0.078441391, 0.201316452, 1, 1, 0.08264061, 0.08264061,
0.08043907, 0.05978233, 0.078441391, 0.078441391, 0.201316452,
0.08264061, 0.08264061, 1, 1, 0.99924668, 0.11975039, -0.387153796,
-0.387153796, 0.229128338, 0.08264061, 0.08264061, 1, 1, 0.99924668,
0.11975039, -0.387153796, -0.387153796, 0.229128338, 0.08043907,
0.08043907, 0.99924668, 0.99924668, 1, 0.1174954, -0.388342201,
-0.388342201, 0.229212869, 0.05978233, 0.05978233, 0.11975039,
0.11975039, 0.1174954, 1, 0.016575506, 0.016575506, -0.032427527,
0.07844139, 0.07844139, -0.3871538, -0.3871538, -0.3883422, 0.01657551,
1, 1, 0.003028194, 0.07844139, 0.07844139, -0.3871538, -0.3871538,
-0.3883422, 0.01657551, 1, 1, 0.003028194, 0.20131645, 0.20131645,
0.22912834, 0.22912834, 0.22921287, -0.03242753, 0.003028194,
0.003028194, 1), .Dim = c(9L, 9L), .Dimnames = list(c("Return",
"ExcessReturn", "MktCapFirm", "Size", "MktCapStock", "Momentum",
"BM", "lnBM", "Beta"), c("Return", "ExcessReturn", "MktCapFirm",
"Size", "MktCapStock", "Momentum", "BM", "lnBM", "Beta")))
all_spearman_corr[["196307"]] <- structure(c(1, 1, 0.1033246, 0.1033246, 0.1034092, 0.04182368,
-0.10575399, -0.10575399, -0.08070454, 1, 1, 0.1033246, 0.1033246,
0.1034092, 0.04182368, -0.10575399, -0.10575399, -0.08070454,
0.10332464, 0.10332464, 1, 1, 0.9999975, 0.21854458, -0.3871538,
-0.3871538, 0.2459102, 0.10332464, 0.10332464, 1, 1, 0.9999975,
0.21854458, -0.3871538, -0.3871538, 0.2459102, 0.10340918, 0.10340918,
0.9999975, 0.9999975, 1, 0.21895231, -0.38706181, -0.38706181,
0.24593257, 0.04182368, 0.04182368, 0.2185446, 0.2185446, 0.2189523,
1, -0.09428919, -0.09428919, 0.04835413, -0.10575399, -0.10575399,
-0.3871538, -0.3871538, -0.3870618, -0.09428919, 1, 1, -0.06238128,
-0.10575399, -0.10575399, -0.3871538, -0.3871538, -0.3870618,
-0.09428919, 1, 1, -0.06238128, -0.08070454, -0.08070454, 0.2459102,
0.2459102, 0.2459326, 0.04835413, -0.06238128, -0.06238128, 1
), .Dim = c(9L, 9L), .Dimnames = list(c("Return", "ExcessReturn",
"MktCapFirm", "Size", "MktCapStock", "Momentum", "BM", "nBM",
"Beta"), c("Return", "ExcessReturn", "MktCapFirm", "Size", "MktCapStock",
"Momentum", "BM", "nBM", "Beta")))
我想要的是能够表示这些列表并获得具有平均值的相关矩阵。
有人可以帮忙吗?
谢谢!
这可以通过 Reduce
实现,如下所示:
Reduce(`+`, all_spearman_corr) / length(all_spearman_corr)
输出:
#> Return ExcessReturn MktCapFirm Size MktCapStock
#> Return 1.00000000 1.00000000 0.09298262 0.09298262 0.09192412
#> ExcessReturn 1.00000000 1.00000000 0.09298262 0.09298262 0.09192412
#> MktCapFirm 0.09298260 0.09298260 1.00000000 1.00000000 0.99962209
#> Size 0.09298260 0.09298260 1.00000000 1.00000000 0.99962209
#> MktCapStock 0.09192414 0.09192414 0.99962209 0.99962209 1.00000000
#> Momentum 0.05080300 0.05080300 0.16914748 0.16914748 0.16822386
#> BM -0.01365630 -0.01365630 -0.38715380 -0.38715380 -0.38770201
#> lnBM -0.01365630 -0.01365630 -0.38715380 -0.38715380 -0.38770201
#> Beta 0.06030596 0.06030596 0.23751927 0.23751927 0.23757272
#> Momentum BM lnBM Beta
#> Return 0.050803005 -0.01365630 -0.01365630 0.06030596
#> ExcessReturn 0.050803005 -0.01365630 -0.01365630 0.06030596
#> MktCapFirm 0.169147495 -0.38715380 -0.38715380 0.23751927
#> Size 0.169147495 -0.38715380 -0.38715380 0.23751927
#> MktCapStock 0.168223850 -0.38770200 -0.38770200 0.23757274
#> Momentum 1.000000000 -0.03885684 -0.03885684 0.00796330
#> BM -0.038856842 1.00000000 1.00000000 -0.02967654
#> lnBM -0.038856842 1.00000000 1.00000000 -0.02967654
#> Beta 0.007963302 -0.02967654 -0.02967654 1.00000000
数据:
all_spearman_corr <- list(`196308` = structure(c(1, 1, 0.08264061, 0.08264061, 0.08043907,
0.05978233, 0.078441391, 0.078441391, 0.201316452, 1, 1, 0.08264061,
0.08264061, 0.08043907, 0.05978233, 0.078441391, 0.078441391,
0.201316452, 0.08264061, 0.08264061, 1, 1, 0.99924668, 0.11975039,
-0.387153796, -0.387153796, 0.229128338, 0.08264061, 0.08264061,
1, 1, 0.99924668, 0.11975039, -0.387153796, -0.387153796, 0.229128338,
0.08043907, 0.08043907, 0.99924668, 0.99924668, 1, 0.1174954,
-0.388342201, -0.388342201, 0.229212869, 0.05978233, 0.05978233,
0.11975039, 0.11975039, 0.1174954, 1, 0.016575506, 0.016575506,
-0.032427527, 0.07844139, 0.07844139, -0.3871538, -0.3871538,
-0.3883422, 0.01657551, 1, 1, 0.003028194, 0.07844139, 0.07844139,
-0.3871538, -0.3871538, -0.3883422, 0.01657551, 1, 1, 0.003028194,
0.20131645, 0.20131645, 0.22912834, 0.22912834, 0.22921287, -0.03242753,
0.003028194, 0.003028194, 1), .Dim = c(9L, 9L), .Dimnames = list(
c("Return", "ExcessReturn", "MktCapFirm", "Size", "MktCapStock",
"Momentum", "BM", "lnBM", "Beta"), c("Return", "ExcessReturn",
"MktCapFirm", "Size", "MktCapStock", "Momentum", "BM", "lnBM",
"Beta"))), `196307` = structure(c(1, 1, 0.1033246, 0.1033246,
0.1034092, 0.04182368, -0.10575399, -0.10575399, -0.08070454,
1, 1, 0.1033246, 0.1033246, 0.1034092, 0.04182368, -0.10575399,
-0.10575399, -0.08070454, 0.10332464, 0.10332464, 1, 1, 0.9999975,
0.21854458, -0.3871538, -0.3871538, 0.2459102, 0.10332464, 0.10332464,
1, 1, 0.9999975, 0.21854458, -0.3871538, -0.3871538, 0.2459102,
0.10340918, 0.10340918, 0.9999975, 0.9999975, 1, 0.21895231,
-0.38706181, -0.38706181, 0.24593257, 0.04182368, 0.04182368,
0.2185446, 0.2185446, 0.2189523, 1, -0.09428919, -0.09428919,
0.04835413, -0.10575399, -0.10575399, -0.3871538, -0.3871538,
-0.3870618, -0.09428919, 1, 1, -0.06238128, -0.10575399, -0.10575399,
-0.3871538, -0.3871538, -0.3870618, -0.09428919, 1, 1, -0.06238128,
-0.08070454, -0.08070454, 0.2459102, 0.2459102, 0.2459326, 0.04835413,
-0.06238128, -0.06238128, 1), .Dim = c(9L, 9L), .Dimnames = list(
c("Return", "ExcessReturn", "MktCapFirm", "Size", "MktCapStock",
"Momentum", "BM", "nBM", "Beta"), c("Return", "ExcessReturn",
"MktCapFirm", "Size", "MktCapStock", "Momentum", "BM", "nBM",
"Beta"))))
除了 的 Reduce
方法外,您还可以使用 apply
+ simplify2array
来计算平均值,例如
apply(simplify2array(all_spearman_corr),1:2,mean)
这给出了
> apply(simplify2array(all_spearman_corr),1:2,mean)
Return ExcessReturn MktCapFirm Size MktCapStock
Return 1.00000000 1.00000000 0.09298262 0.09298262 0.09192412
ExcessReturn 1.00000000 1.00000000 0.09298262 0.09298262 0.09192412
MktCapFirm 0.09298260 0.09298260 1.00000000 1.00000000 0.99962209
Size 0.09298260 0.09298260 1.00000000 1.00000000 0.99962209
MktCapStock 0.09192414 0.09192414 0.99962209 0.99962209 1.00000000
Momentum 0.05080300 0.05080300 0.16914748 0.16914748 0.16822386
BM -0.01365630 -0.01365630 -0.38715380 -0.38715380 -0.38770201
lnBM -0.01365630 -0.01365630 -0.38715380 -0.38715380 -0.38770201
Beta 0.06030596 0.06030596 0.23751927 0.23751927 0.23757272
Momentum BM lnBM Beta
Return 0.050803005 -0.01365630 -0.01365630 0.06030596
ExcessReturn 0.050803005 -0.01365630 -0.01365630 0.06030596
MktCapFirm 0.169147495 -0.38715380 -0.38715380 0.23751927
Size 0.169147495 -0.38715380 -0.38715380 0.23751927
MktCapStock 0.168223850 -0.38770200 -0.38770200 0.23757274
Momentum 1.000000000 -0.03885684 -0.03885684 0.00796330
BM -0.038856842 1.00000000 1.00000000 -0.02967654
lnBM -0.038856842 1.00000000 1.00000000 -0.02967654
Beta 0.007963302 -0.02967654 -0.02967654 1.00000000
我有一个 data.table,其中包含以下列:月份、Return、超额 Return、Beta、Momentum、MktCap,每月一次,涵盖一堆股票。我想计算按月分组的所有这些变量的月度相关性,然后得到月度相关性的平均值。到目前为止我有这个:
all_spearman_corr <- Sub_Sample_Spearman %>%
split(.$Month) %>% map(select, -c(Month)) %>% map(cor,method = "spearman", use = "complete.obs")
它给了我每月的相关性。
all_spearman_corr[["196308"]] <- structure(c(1, 1, 0.08264061, 0.08264061, 0.08043907, 0.05978233,
0.078441391, 0.078441391, 0.201316452, 1, 1, 0.08264061, 0.08264061,
0.08043907, 0.05978233, 0.078441391, 0.078441391, 0.201316452,
0.08264061, 0.08264061, 1, 1, 0.99924668, 0.11975039, -0.387153796,
-0.387153796, 0.229128338, 0.08264061, 0.08264061, 1, 1, 0.99924668,
0.11975039, -0.387153796, -0.387153796, 0.229128338, 0.08043907,
0.08043907, 0.99924668, 0.99924668, 1, 0.1174954, -0.388342201,
-0.388342201, 0.229212869, 0.05978233, 0.05978233, 0.11975039,
0.11975039, 0.1174954, 1, 0.016575506, 0.016575506, -0.032427527,
0.07844139, 0.07844139, -0.3871538, -0.3871538, -0.3883422, 0.01657551,
1, 1, 0.003028194, 0.07844139, 0.07844139, -0.3871538, -0.3871538,
-0.3883422, 0.01657551, 1, 1, 0.003028194, 0.20131645, 0.20131645,
0.22912834, 0.22912834, 0.22921287, -0.03242753, 0.003028194,
0.003028194, 1), .Dim = c(9L, 9L), .Dimnames = list(c("Return",
"ExcessReturn", "MktCapFirm", "Size", "MktCapStock", "Momentum",
"BM", "lnBM", "Beta"), c("Return", "ExcessReturn", "MktCapFirm",
"Size", "MktCapStock", "Momentum", "BM", "lnBM", "Beta")))
all_spearman_corr[["196307"]] <- structure(c(1, 1, 0.1033246, 0.1033246, 0.1034092, 0.04182368,
-0.10575399, -0.10575399, -0.08070454, 1, 1, 0.1033246, 0.1033246,
0.1034092, 0.04182368, -0.10575399, -0.10575399, -0.08070454,
0.10332464, 0.10332464, 1, 1, 0.9999975, 0.21854458, -0.3871538,
-0.3871538, 0.2459102, 0.10332464, 0.10332464, 1, 1, 0.9999975,
0.21854458, -0.3871538, -0.3871538, 0.2459102, 0.10340918, 0.10340918,
0.9999975, 0.9999975, 1, 0.21895231, -0.38706181, -0.38706181,
0.24593257, 0.04182368, 0.04182368, 0.2185446, 0.2185446, 0.2189523,
1, -0.09428919, -0.09428919, 0.04835413, -0.10575399, -0.10575399,
-0.3871538, -0.3871538, -0.3870618, -0.09428919, 1, 1, -0.06238128,
-0.10575399, -0.10575399, -0.3871538, -0.3871538, -0.3870618,
-0.09428919, 1, 1, -0.06238128, -0.08070454, -0.08070454, 0.2459102,
0.2459102, 0.2459326, 0.04835413, -0.06238128, -0.06238128, 1
), .Dim = c(9L, 9L), .Dimnames = list(c("Return", "ExcessReturn",
"MktCapFirm", "Size", "MktCapStock", "Momentum", "BM", "nBM",
"Beta"), c("Return", "ExcessReturn", "MktCapFirm", "Size", "MktCapStock",
"Momentum", "BM", "nBM", "Beta")))
我想要的是能够表示这些列表并获得具有平均值的相关矩阵。
有人可以帮忙吗?
谢谢!
这可以通过 Reduce
实现,如下所示:
Reduce(`+`, all_spearman_corr) / length(all_spearman_corr)
输出:
#> Return ExcessReturn MktCapFirm Size MktCapStock
#> Return 1.00000000 1.00000000 0.09298262 0.09298262 0.09192412
#> ExcessReturn 1.00000000 1.00000000 0.09298262 0.09298262 0.09192412
#> MktCapFirm 0.09298260 0.09298260 1.00000000 1.00000000 0.99962209
#> Size 0.09298260 0.09298260 1.00000000 1.00000000 0.99962209
#> MktCapStock 0.09192414 0.09192414 0.99962209 0.99962209 1.00000000
#> Momentum 0.05080300 0.05080300 0.16914748 0.16914748 0.16822386
#> BM -0.01365630 -0.01365630 -0.38715380 -0.38715380 -0.38770201
#> lnBM -0.01365630 -0.01365630 -0.38715380 -0.38715380 -0.38770201
#> Beta 0.06030596 0.06030596 0.23751927 0.23751927 0.23757272
#> Momentum BM lnBM Beta
#> Return 0.050803005 -0.01365630 -0.01365630 0.06030596
#> ExcessReturn 0.050803005 -0.01365630 -0.01365630 0.06030596
#> MktCapFirm 0.169147495 -0.38715380 -0.38715380 0.23751927
#> Size 0.169147495 -0.38715380 -0.38715380 0.23751927
#> MktCapStock 0.168223850 -0.38770200 -0.38770200 0.23757274
#> Momentum 1.000000000 -0.03885684 -0.03885684 0.00796330
#> BM -0.038856842 1.00000000 1.00000000 -0.02967654
#> lnBM -0.038856842 1.00000000 1.00000000 -0.02967654
#> Beta 0.007963302 -0.02967654 -0.02967654 1.00000000
数据:
all_spearman_corr <- list(`196308` = structure(c(1, 1, 0.08264061, 0.08264061, 0.08043907,
0.05978233, 0.078441391, 0.078441391, 0.201316452, 1, 1, 0.08264061,
0.08264061, 0.08043907, 0.05978233, 0.078441391, 0.078441391,
0.201316452, 0.08264061, 0.08264061, 1, 1, 0.99924668, 0.11975039,
-0.387153796, -0.387153796, 0.229128338, 0.08264061, 0.08264061,
1, 1, 0.99924668, 0.11975039, -0.387153796, -0.387153796, 0.229128338,
0.08043907, 0.08043907, 0.99924668, 0.99924668, 1, 0.1174954,
-0.388342201, -0.388342201, 0.229212869, 0.05978233, 0.05978233,
0.11975039, 0.11975039, 0.1174954, 1, 0.016575506, 0.016575506,
-0.032427527, 0.07844139, 0.07844139, -0.3871538, -0.3871538,
-0.3883422, 0.01657551, 1, 1, 0.003028194, 0.07844139, 0.07844139,
-0.3871538, -0.3871538, -0.3883422, 0.01657551, 1, 1, 0.003028194,
0.20131645, 0.20131645, 0.22912834, 0.22912834, 0.22921287, -0.03242753,
0.003028194, 0.003028194, 1), .Dim = c(9L, 9L), .Dimnames = list(
c("Return", "ExcessReturn", "MktCapFirm", "Size", "MktCapStock",
"Momentum", "BM", "lnBM", "Beta"), c("Return", "ExcessReturn",
"MktCapFirm", "Size", "MktCapStock", "Momentum", "BM", "lnBM",
"Beta"))), `196307` = structure(c(1, 1, 0.1033246, 0.1033246,
0.1034092, 0.04182368, -0.10575399, -0.10575399, -0.08070454,
1, 1, 0.1033246, 0.1033246, 0.1034092, 0.04182368, -0.10575399,
-0.10575399, -0.08070454, 0.10332464, 0.10332464, 1, 1, 0.9999975,
0.21854458, -0.3871538, -0.3871538, 0.2459102, 0.10332464, 0.10332464,
1, 1, 0.9999975, 0.21854458, -0.3871538, -0.3871538, 0.2459102,
0.10340918, 0.10340918, 0.9999975, 0.9999975, 1, 0.21895231,
-0.38706181, -0.38706181, 0.24593257, 0.04182368, 0.04182368,
0.2185446, 0.2185446, 0.2189523, 1, -0.09428919, -0.09428919,
0.04835413, -0.10575399, -0.10575399, -0.3871538, -0.3871538,
-0.3870618, -0.09428919, 1, 1, -0.06238128, -0.10575399, -0.10575399,
-0.3871538, -0.3871538, -0.3870618, -0.09428919, 1, 1, -0.06238128,
-0.08070454, -0.08070454, 0.2459102, 0.2459102, 0.2459326, 0.04835413,
-0.06238128, -0.06238128, 1), .Dim = c(9L, 9L), .Dimnames = list(
c("Return", "ExcessReturn", "MktCapFirm", "Size", "MktCapStock",
"Momentum", "BM", "nBM", "Beta"), c("Return", "ExcessReturn",
"MktCapFirm", "Size", "MktCapStock", "Momentum", "BM", "nBM",
"Beta"))))
除了 Reduce
方法外,您还可以使用 apply
+ simplify2array
来计算平均值,例如
apply(simplify2array(all_spearman_corr),1:2,mean)
这给出了
> apply(simplify2array(all_spearman_corr),1:2,mean)
Return ExcessReturn MktCapFirm Size MktCapStock
Return 1.00000000 1.00000000 0.09298262 0.09298262 0.09192412
ExcessReturn 1.00000000 1.00000000 0.09298262 0.09298262 0.09192412
MktCapFirm 0.09298260 0.09298260 1.00000000 1.00000000 0.99962209
Size 0.09298260 0.09298260 1.00000000 1.00000000 0.99962209
MktCapStock 0.09192414 0.09192414 0.99962209 0.99962209 1.00000000
Momentum 0.05080300 0.05080300 0.16914748 0.16914748 0.16822386
BM -0.01365630 -0.01365630 -0.38715380 -0.38715380 -0.38770201
lnBM -0.01365630 -0.01365630 -0.38715380 -0.38715380 -0.38770201
Beta 0.06030596 0.06030596 0.23751927 0.23751927 0.23757272
Momentum BM lnBM Beta
Return 0.050803005 -0.01365630 -0.01365630 0.06030596
ExcessReturn 0.050803005 -0.01365630 -0.01365630 0.06030596
MktCapFirm 0.169147495 -0.38715380 -0.38715380 0.23751927
Size 0.169147495 -0.38715380 -0.38715380 0.23751927
MktCapStock 0.168223850 -0.38770200 -0.38770200 0.23757274
Momentum 1.000000000 -0.03885684 -0.03885684 0.00796330
BM -0.038856842 1.00000000 1.00000000 -0.02967654
lnBM -0.038856842 1.00000000 1.00000000 -0.02967654
Beta 0.007963302 -0.02967654 -0.02967654 1.00000000