【问题标题】:How to decrease machine precision .Machine$double.eps in R?如何降低 R 中的机器精度 .Machine$double.eps?
【发布时间】:2023-03-14 22:00:01
【问题描述】:

当使用名为 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,所以如果我可以减少这个默认值会很好。怎么样?

【问题讨论】:

    标签: r epsilon


    【解决方案1】:

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


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

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

    转到https://cran.r-project.org/package=did,下载源文件.tar.gz for Linux,.tgz for Mac 或.zip for Windows。解压,打开/Rdirector/文件夹中的“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 安装这个特定的文件,然后愉快地使用它。

    【讨论】:

    • 但是你不能将tol 提高到机器精度之外,因为那将是形而上学,所以1e-20在自欺欺人。
    • @DirkEddelbuettel 在我的情况下你会怎么做?我如何解释这些结果?仅仅是因为我正在尝试做一些数学不正确的事情吗?
    • 来自help(".Machine"),列表成员double.eps满足 1 + x != 1 的最小正浮点数 x。 所以不,你无法改进它。
    • 当我按照建议从 cran 下载 did.zip 并打开 did.r 时,我只得到以下信息:#Some cmets that I cant write do to character limit。 local({ info
    • @ParkerWilliam 啊,我明白了。 Windows 和 Mac 只有预编译的二进制文件而不是源代码。所以开源只在 Linux 上开放。应该有一种方法可以在 Windows 上解决,也许是 Rtools。但我不是 Windows 用户所以我不知道。
    猜你喜欢
    • 1970-01-01
    • 2014-03-26
    • 2014-08-05
    • 1970-01-01
    • 2011-07-16
    • 2018-12-28
    • 2022-11-02
    • 2015-05-15
    • 2019-05-08
    相关资源
    最近更新 更多