如何降低 R 中的机器精度 .Machine$double.eps?

How to decrease machine precision .Machine$double.eps in R?

当使用名为 did 的 R 包时,出现此错误:

Error in solve.default(preV) :    system is computationally singular:
reciprocal condition number = 4.09946e-19

solve 函数有一个名为 tol 的参数,我可以通过它设置公差,从而避免问题。但是这个包没有给出这个选项来从它的顶级函数中指定这个tol,所以没有办法为solve设置tol

我正在考虑替代方案。由于 solve() 默认使用 .Machine$double.eps 作为 tol,如果我能降低这个默认值就好了。怎么样?

这是你不能减少的东西,因为它是一种 C 标准。但是,您可以手动将 tol = 1e-20 设置为函数输入,例如,以覆盖默认容差。但是,这纯粹是一种数字解决方法。您需要考虑是否有可能在您的问题级别解决排名不足的问题。例如,由于数据变量之间的缩放比例不佳,可能会出现排名不足,这是一个简单的例子:.


I not sure as to what to do here then? As I said I'm using a function called mp.spatt where the solve function is used. So I can't really (or at least I don't know how?) add the tol = blabla argument in the solve function?

您可以编写该函数的补丁版本并重建包供您自己使用。这正是开源软件和软件包如此出色的原因。

转到https://cran.r-project.org/package=did,下载Linux的源文件.tar.gz,Mac的.tgz或[=49的.zip =].解压,打开/R目录/文件夹中的"did.R"文件。函数solve在这个文件中只使用了一次,所以你很容易找到它:

W <- n*t(preatt)%*%solve(preV)%*%preatt

为简单起见,您可以添加 tol = 0。或者,你们用 MASS::ginv 替换 solve。实际上,包作者一直在脚本的其他地方使用 MASS::ginv。也有可能是他忘记更换这个solve(我正在查看2018/07/11的最新版本1.1.0)

修复后,再次生成.tar.gz.tgz.zip文件。打开你的R,使用install.packages安装这个特定的文件,愉快地使用它。