在for循环中保存协方差矩阵 - R.

时间:2017-11-10 09:28:33

标签: r loops for-loop matrix covariance

所以我目前正在开展一项业余爱好项目,以提高我的R技能。我用我之前的代码创建的是各种数据子集“returnseries.1,returnseries.2,returnseries.3,...”(从1到119),每个子集存储在252x6矩阵中。

现在我正在构建一个for循环来计算每个子集的协方差矩阵。

我的代码如下:

for(k in 1:119){
covmat[k] = matrix(c(cov(returnseries[k])),nrow=6, ncol=6)
} 

出于某种原因,我收到错误:"My column index must be at most 7 not 8."

我不明白为什么。我尝试了其他几个代码版本,但没有给我一个答案。认为它与命名有关,但使用return series.[k]给我一个错误,即返回序列。未定义

如果有人可以快速提供

,会很高兴

1 个答案:

答案 0 :(得分:0)

您可以使用数组。在这种情况下是一个3D数组。

生成一些数据。

> xy <- list(one = matrix(rnorm(9), ncol = 3),
+            two = matrix(rnorm(9), ncol = 3),
+            three = matrix(rnorm(9), ncol = 3))
> xy
$one
           [,1]        [,2]        [,3]
[1,]  0.1341714 -1.27229790  0.22431441
[2,]  1.0853899  0.02335881 -0.05600098
[3,] -1.5645181  0.83745858 -1.47670091

$two
           [,1]       [,2]        [,3]
[1,]  1.4891642 -0.3766222 -0.86981432
[2,]  0.3424295 -1.7882177  1.79601480
[3,] -1.1583058 -0.1604330  0.02690498

$three
           [,1]       [,2]       [,3]
[1,] -0.1511346 -0.3672432 -0.3008405
[2,] -1.9881830 -0.8545396 -0.7108430
[3,]  0.1637134 -0.7958267  1.1923535

创建空数组

> N <- 3
> ar <- array(rep(NA, 3*3*N), dim = c(3, 3, N))
> ar
, , 1

     [,1] [,2] [,3]
[1,]   NA   NA   NA
[2,]   NA   NA   NA
[3,]   NA   NA   NA

, , 2

     [,1] [,2] [,3]
[1,]   NA   NA   NA
[2,]   NA   NA   NA
[3,]   NA   NA   NA

, , 3

     [,1] [,2] [,3]
[1,]   NA   NA   NA
[2,]   NA   NA   NA
[3,]   NA   NA   NA

填写值。

> for (i in 1:N) {
+   ar[,, i] <- xy[[i]]
+ }
> 
> ar
, , 1

           [,1]        [,2]        [,3]
[1,]  0.1341714 -1.27229790  0.22431441
[2,]  1.0853899  0.02335881 -0.05600098
[3,] -1.5645181  0.83745858 -1.47670091

, , 2

           [,1]       [,2]        [,3]
[1,]  1.4891642 -0.3766222 -0.86981432
[2,]  0.3424295 -1.7882177  1.79601480
[3,] -1.1583058 -0.1604330  0.02690498

, , 3

           [,1]       [,2]       [,3]
[1,] -0.1511346 -0.3672432 -0.3008405
[2,] -1.9881830 -0.8545396 -0.7108430
[3,]  0.1637134 -0.7958267  1.1923535

你现在可以用这种方式做各种奇妙的事情。例如,做行和。

> apply(ar, MARGIN = 3, FUN = rowSums)
           [,1]       [,2]       [,3]
[1,] -0.9138121  0.2427277 -0.8192183
[2,]  1.0527477  0.3502266 -3.5535656
[3,] -2.2037604 -1.2918338  0.5602402

这是第一个矩阵的证明。将它与第一列比较:

> rowSums(xy[[1]])
[1] -0.9138121  1.0527477 -2.2037604