如何重新定义cov来计算总体协方差矩阵

How to redefine cov to calculate population covariance matrix

标准cov函数计算样本协方差矩阵,我想要总体协方差矩阵

我尝试了以下方法:

cov.pop <- function(x,y=NULL) {
  cov(x,y)*(length(x)-1)/length(x)
}

> sapply(list(Apple,HP,Microsoft),cov.pop,y=Apple) #correct
[1] 0.7861672 0.1363396 0.2223303
> sapply(list(Apple,HP,Microsoft),cov.pop,y=HP) #correct
[1] 0.13633964 0.09560376 0.05226032
> sapply(list(Apple,HP,Microsoft),cov.pop,y=Microsoft) #correct
[1] 0.22233028 0.05226032 0.13519964
> cov.pop(cbind(Apple,HP,Microsoft)) #not correct
              Apple         HP  Microsoft
Apple     0.8444018 0.14643887 0.23879919
HP        0.1464389 0.10268552 0.05613145
Microsoft 0.2387992 0.05613145 0.14521443

我的问题
有没有一种简单的方法来修改 cov.pop 函数以获得正确的总体协方差矩阵?

我猜结果是不同的,因为 matrix 中的 length(即每个 list 元素中的 cbind(Apple, HP, Microsoft)length 不是一样

cov.pop <- function(x,y=NULL) {
   cov(x,y)*(NROW(x)-1)/NROW(x)
  }

使用示例数据集

set.seed(24)
Apple <- rnorm(140)
HP <- rnorm(140)
Microsoft <- rnorm(140)

cov.pop(cbind(Apple,HP,Microsoft)) 
#                Apple          HP  Microsoft
#Apple     0.946489639 0.006511604 0.02518080
#HP        0.006511604 1.015532869 0.04940075
#Microsoft 0.025180805 0.049400745 1.08388185

sapply(list(Apple,HP,Microsoft),cov.pop,y=Apple)
#[1] 0.946489639 0.006511604 0.025180805

sapply(list(Apple,HP,Microsoft),cov.pop,y=HP)
#[1] 0.006511604 1.015532869 0.049400745

sapply(list(Apple,HP,Microsoft),cov.pop,y=Microsoft)
#[1] 0.02518080 0.04940075 1.08388185