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

时间:2018-07-18 15:06:34

标签: r epsilon

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

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

solve函数有一个名为tol的参数,通过该参数可以设置公差,从而避免出现问题。但是,该软件包未提供从其顶层函数中指定此tol的选项,因此无法为tol设置solve

我正在考虑一种替代方法。由于solve()的默认值是.Machine$double.eps使用的是tol,因此,如果我可以减小此默认值,那就很好了。怎么样?

1 个答案:

答案 0 :(得分:1)

这是C标准,因此您不能减少。但是,您可以手动将tol = 1e-20设置为函数输入,以覆盖默认公差。但是,这纯粹是一个数值解决方法。您需要考虑是否有可能在您的问题级别上解决等级不足问题。例如,由于数据变量之间的缩放比例不佳,可能导致排名不足,这是一个简单的示例:Linear model singular because of large integer datetime in R?


  

我不确定在那做什么?如我所说,我正在使用一个名为mp.spatt的函数,其中使用了solve函数。所以我真的不能(或者至少我不知道怎么做?)在tol = blabla函数中添加solve参数吗?

您可以编写该功能的修补版本,然后重新构建软件包供自己使用。这就是为什么开源软件和软件包如此出色的原因。

转到https://cran.r-project.org/package=did,下载源文件.tar.gz(对于Linux),.tgz(对于Mac)或.zip(对于Windows)。解压缩它,打开/R导演/文件夹中的“ did.R”文件。函数solve在此文件中仅使用一次,因此您可以轻松找到它:

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

为简单起见,您可以添加tol = 0。或者,您很多将solve替换为MASS::ginv。实际上,程序包作者已经在脚本中的其他所有地方使用了MASS::ginv。可能是他也忘记了替换此solve(我正在检查2018/07/11的最新版本1.1.0)。

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