获取方差协方差矩阵的函数之间的差异(var和cova)

获取方差协方差矩阵的函数之间的差异(var和cova),r,optimization,equivalent,covariance-matrix,R,Optimization,Equivalent,Covariance Matrix,我正在尝试优化一个函数(NbCluster),以便能够处理更大的矩阵,这是我之前发布的内容: 这让我创建了一个(仍然是非常实验性的)NbClust分支,如下所示: 主要瓶颈之一是使用var()函数,因此我在Rfast中用cova替换了它。结果并不完全相同,我需要弄清楚它们是否足够接近,可以互换使用。在差异更大的情况下,还会出现其他情况吗 > bigm <- matrix(rnorm(1000*1000,mean=0,sd = 3), 1000, 1000) > v <-

我正在尝试优化一个函数(
NbCluster
),以便能够处理更大的矩阵,这是我之前发布的内容: 这让我创建了一个(仍然是非常实验性的)NbClust分支,如下所示:

主要瓶颈之一是使用
var()
函数,因此我在
Rfast
中用
cova
替换了它。结果并不完全相同,我需要弄清楚它们是否足够接近,可以互换使用。在差异更大的情况下,还会出现其他情况吗

> bigm <- matrix(rnorm(1000*1000,mean=0,sd = 3), 1000, 1000)
> v <- var(bigm)
> cvm <- cova(bigm)
> sum(v != cvm)
[1] 954579
> sum(v == cvm)
[1] 45421
> cor(c(v), c(cvm), method = "pearson")
[1] 1
> cor(c(v), c(cvm), method = "spearman")
[1] 1
> diff = v - cvm
> mean(diff)
[1] -4.557742e-19
> max(diff)
[1] 2.4869e-14

这似乎是
cova
在特定循环迭代的特定情况下获得向量而不是矩阵的结果(cova在早期步骤获得dim()。我总是通过将对象强制到矩阵来修复它,但我仍然担心我的更改可能会产生意外的后果。我不能说我真正掌握了函数的内部工作原理,我只是用我理解为等价的函数替换了一些函数

cova和var给出了相同的结果,您可以从平均差异中看到。“总和(v!=cvm)”不等于零是合理的。结果并非与所有小数位相同

cova和var给出了相同的结果,您可以从平均差异中看到。“总和(v!=cvm)”不等于零是合理的。结果并非与所有小数位相同

> bigm <- matrix(rnorm(10000*10000,mean=0,sd = 3), 10000, 10000)
> v <- var(bigm)
> cvm <- cova(bigm)
> sum(v != cvm)
[1] 97986031
> sum(v == cvm)
[1] 2013969
> cor(c(v), c(cvm), method = "pearson")
[1] 1
> cor(c(v), c(cvm), method = "spearman")
[1] 1
> diff = v - cvm
> mean(diff)
[1] -3.875792e-20
> max(diff)
[1] 9.05942e-14
Error in sqrt(n) : non-numeric argument to mathematical function