标准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
Run Code Online (Sandbox Code Playgroud)
我的问题
是否有一种简单的方法来修改cov.pop
函数以获得正确的种群协方差矩阵?
我猜的结果是不同的,因为length
在matrix
(即cbind(Apple, HP, Microsoft)
与length
每个list
元素是不一样的
cov.pop <- function(x,y=NULL) {
cov(x,y)*(NROW(x)-1)/NROW(x)
}
Run Code Online (Sandbox Code Playgroud)
使用示例数据集
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
Run Code Online (Sandbox Code Playgroud)