无法重现协方差矩阵
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
我正在尝试为生成的数据重现协方差矩阵
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