无法重现协方差矩阵

Failure to reproduce covariance matrix

我正在尝试为生成的数据重现协方差矩阵

 set.seed(1)
 datam <- round((matrix((rnorm(300, mean = 2, sd = 0.5)), nrow = 100, ncol = 
 3)), digits = 2)

为此,我应该将该矩阵的转置乘以原始矩阵,然后再乘以 1/n,其中 n=100,转置如下

datamT <- t(datam)

所以,

datamT%*%datam*1/100 

无法重现最初由

确定的 datam 的协方差矩阵
cov(datam) 

我不确定哪里错了,所以不胜感激

您需要减去列均值才能使近似有效。

x <- datam-rep(colMeans(datam),each=nrow(datam))
## or use scale(datam, scale=FALSE)

t(x)%*%x/(nrow(x)-1)
              [,1]          [,2]         [,3]
[1,]  0.2015461010 -0.0001247677  0.004172283
[2,] -0.0001247677  0.2289751111 -0.012216242
[3,]  0.0041722828 -0.0122162424  0.266885848

t(x)%*%x/(nrow(x)-1)-cov(datam)
              [,1]          [,2]         [,3]
[1,] -1.387779e-16  7.047314e-19 0.000000e+00
[2,]  7.047314e-19 -5.551115e-17 0.000000e+00
[3,]  0.000000e+00  0.000000e+00 1.110223e-16

我想你需要看看 here. 协方差 的公式 它是每行与其平均值的偏差总和的平均值。如果它是样本协方差,则使用 n-1 而不是 n。要复制它,

var_cov_matrix <- data.frame()

for(i in 1:ncol(datam)){ 
    for(j in 1:ncol(datam)) {

        var_cov_matrix[i,j] <-sum((datam[,i]- mean(datam[,i])) * (datam[,j]- mean(datam[,j])))/(nrow(datam)-1)



    }

}

             V1            V2           V3
1  0.2015461010 -0.0001247677  0.004172283
2 -0.0001247677  0.2289751111 -0.012216242
3  0.0041722828 -0.0122162424  0.266885848

cov(datam)相同,

              [,1]          [,2]         [,3]
[1,]  0.2015461010 -0.0001247677  0.004172283
[2,] -0.0001247677  0.2289751111 -0.012216242
[3,]  0.0041722828 -0.0122162424  0.266885848