r语言 - 函数之间的差异,以获得方差-协方差矩阵(var 和 cova)



我正在尝试优化一个函数(NbCluster(以便能够处理更大的矩阵,我之前已经发布过: 减少 NbClust 内存使用 这导致我创建了一个(仍然非常实验性的(NbClust分支,它在这里:https://github.com/jbhanks/BigNbClust

主要瓶颈之一是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
> 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

但是,在某些现实世界的情况下(不幸的是,我无法共享实际数据(,cova会抛出错误,而var则不会。

Error in sqrt(n) : non-numeric argument to mathematical function

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

cova和var给你相同的结果,你从平均差异中看到它。"sum(v != cvm("不给出零是合理的。结果并不完全相同。

最新更新