使用名为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
,因此,如果我可以减小此默认值,那就很好了。怎么样?
答案 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
安装此特定文件,并愉快地使用它。