在 R 中使用 lapply 创建(协方差)矩阵列表时出错

Errors in creating a list of (covariance) matrices using lapply in R

我有这个公式,它创建了一个包含 251 个元素的大列表:

lapply(2:nrow(mat), function(y) cov(mat[1:y,]))

matdim():

[1] 252  80

但我希望它从 1 开始,即 1:nrow(mat) 这样我得到 252 个类似于 nrow(mat) 的元素。但是,将 2:nrow(mat) 更改为 1:nrow(mat) 会产生此错误消息:

lapply(1:nrow(mat), function(y) cov(mat[1:y,]))

Error in cov(mat[1:y, ]) : 
  supply both 'x' and 'y' or a matrix-like 'x'

有人知道这个问题的解决方法吗?

如果你用一个小矩阵进行试验,你可以更容易地看到发生了什么:

mat=matrix(1:12, 3,4)

lapply(1:nrow(mat), function(y) cov(mat[1:y,]))

Error in cov(mat[1:y, ]) : 
  supply both 'x' and 'y' or a matrix-like 'x'

所以你得到 mat[1:1,]cov:

> mat[1:1,]
[1]  1  4  7 10

这突然不再是矩阵了!这就是错误告诉您的内容 ("supply ... matrix-like 'x'")。这是因为当您对单个行或列进行子集化时,R 会删除维度。使用 drop=FALSE:

调整此行为
> mat[1:1,,drop=FALSE]
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10

列协方差无论如何在这一点上都不是很有意义:

> cov(mat[1:1,, drop=FALSE])
     [,1] [,2] [,3] [,4]
[1,]   NA   NA   NA   NA
[2,]   NA   NA   NA   NA
[3,]   NA   NA   NA   NA
[4,]   NA   NA   NA   NA

但它至少存在...