我试图为生成的数据复制协方差矩阵。
set.seed(1)
datam <- round((matrix((rnorm(300, mean = 2, sd = 0.5)), nrow = 100, ncol =
3)), digits = 2)要做到这一点,我应该将这个矩阵的转置乘以原来的矩阵,然后再乘以1/n,其中n=100和transpose如下
datamT <- t(datam)所以,
datamT%*%datam*1/100 无法复制数据的协方差矩阵,该矩阵最初由
cov(datam) 我不知道哪里出了差错,所以我们会感谢你的帮助。
发布于 2019-08-21 13:40:08
您需要减去该列的平均值,才能使近似有效。
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发布于 2019-08-21 13:40:26
我认为您需要看一看协方差在这里。中的公式,它是每一行偏离均值的平均值的平均值。如果它是一个样本协方差,那么您使用n-1而不是n.To复制它,
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.266885848https://stackoverflow.com/questions/57592776
复制相似问题