【问题标题】:How to redefine cov to calculate population covariance matrix如何重新定义 cov 以计算总体协方差矩阵
【发布时间】:2015-06-07 16:04:28
【问题描述】:

标准的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 函数以获得正确的总体协方差矩阵?

【问题讨论】:

    标签: r covariance


    【解决方案1】:

    我猜结果是不同的,因为matrix 中的length(即cbind(Apple, HP, Microsoft) 和每个list 元素中的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
    

    【讨论】:

    • +1 并接受:太棒了,谢谢!我想了一些类似的东西,但 'NROW(x)' 实际上可以解决问题:-)
    猜你喜欢
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多