矩阵计算精度R与Stata

矩阵计算精度R与Stata,r,matrix,stata,zero,eigenvalue,R,Matrix,Stata,Zero,Eigenvalue,我试图确定矩阵是否为负半定矩阵。因此,我检查所有特征值是否都小于或等于零。一个例子是: [,1] [,2] [,3] [,4] [1,] -1.181830e-05 0.0001576663 -2.602332e-07 1.472770e-05 [2,] 1.576663e-04 -0.0116220027 3.249607e-04 -2.348050e-04 [3,] -2.602332e-07 0.0

我试图确定矩阵是否为负半定矩阵。因此,我检查所有特征值是否都小于或等于零。一个例子是:

              [,1]          [,2]          [,3]          [,4]
[1,] -1.181830e-05  0.0001576663 -2.602332e-07  1.472770e-05
[2,]  1.576663e-04 -0.0116220027  3.249607e-04 -2.348050e-04
[3,] -2.602332e-07  0.0003249607 -2.616447e-05  3.492998e-05
[4,]  1.472770e-05 -0.0002348050  3.492998e-05 -9.103073e-05
stata计算的特征值为1.045e-12、-0.00001559、-0.00009737、-0.01163805。然而,由R计算的特征值为-1.207746e-20、-1.558760e-05、-9.737074e-05、-1.163806e-02。所以最后三个特征值非常相似,但第一个非常接近于零的特征值却不是。对于用stata得到的特征值,矩阵不是半定矩阵,但对于用R得到的特征值,矩阵是半定矩阵。有没有办法让我找出哪个计算更精确?或者,为了避免无穷小的特征值,是否可能重新调整矩阵的比例


事先非常感谢。每一个提示都将受到高度赞赏。

使用双精度浮点数的数值算法不会有这么高的精度

您可以期望不超过17个十进制数字,零附近的相对精度损失并不罕见。也就是说,给定数值误差,1e-12和-1e-20与0几乎无法区分

例如,对于最小特征值(使用您在评论中给出的系数),我得到:

  • R 3.4.1:5.9231E-21
  • MATLAB R2017a:3.412972022812169e-19
  • Stata 15:3.2998e-20()或4.464e-19()
  • 英特尔Fortran与MKL(函数):2.2608e-19
您可以选择一个阈值,例如1e-10,当特征值与最大特征值的比率小于1e-10时,强制该特征值为零

总之,你的1e-12看起来有点大。在Stata和R之间传输数据时,可能会丢失一些精度:矩阵中的小相对误差可能会导致特征值在零附近的大相对误差。 有了Stata和你问题中的数据(不在评论中),我得到了最小特征值的3.696e-12

但是,即使使用相同的矩阵,由于以下方面的变化,也可能存在差异(如上所述):

  • 解析器,如果您以文本形式输入数字
  • 用于特征值计算的算法
  • 同一算法的实现细节(例如,浮点运算符不是关联的)
  • 用于编译计算例程或编译器选项的编译器
  • 浮点硬件
对于这类问题,传统的建议阅读:


我使用了选项(scipen=999)并对第一个特征值(0.000000000003696385)得到了不同的结果。R使用有限精度算术,因此答案的精度不超过15或16位小数。我在R中得到了不同的结果。您能给出矩阵上的
dput
的结果,并说明您使用的是什么版本的R以及计算特征值的函数吗?谢谢你们!James,dput是
结构(c(-1.181829909022E-05,0.00015766259977248,-2.60233161187324e-07,1.47276984589202e-05,0.0001576625977248,-0.0116220026732496,0.000324906733501042,-0.000234805001002050020702079655,-.60233161187324324960673501042,-2.61644706608917e-05,3.49299708080411E-05,1.47276984920508020905,-.2998808080905,-332256831e-05),.Dim=c(4L,4L))
我使用的是RStudio版本1.0.44,计算特征值的函数是eigen()。python(
np.linalg.eigvals
)为我提供了
5.96768236e-20
,以增加示例计数