对称矩阵检查:容差如何工作?

时间:2014-05-05 19:38:11

标签: r matrix

我有一个矩阵(mat1)。测试对称性时:

  

isSymmetric(mat1,tol = 0)

     
    

FALSE

  

这意味着零容差,矩阵不对称。然而,测试具有稍大的公差,矩阵被认为是对称的:

  

isSymmetric(mat1,tol = 10 * .Machine $ double.eps)

     
    

TRUE

  

但是,对称条目之间的最大差异大于此容差值:

  

max(abs(mat1-t(mat1)))> (10 * .Machine $ double.eps)

     
    

TRUE

  

当对称差异大于容差值时,为什么分类为对称的矩阵?

对于使用?glm示例的工作示例:

counts <- c(18,17,15,20,10,20,25,13,12)
outcome <- gl(3,1,9)
treatment <- gl(3,3)
d.AD <- data.frame(treatment, outcome, counts)
glm.D93 <- glm(counts ~ outcome + treatment, family = poisson())
mat1 <- solve(vcov(glm.D93))

isSymmetric(mat1,tol=0) # FALSE
isSymmetric(mat1,tol=10 * .Machine$double.eps) # TRUE
max(abs(mat1-t(mat1))) > (10 * .Machine$double.eps) # TRUE 

我可能不明白容忍是如何起作用的;我的想法是,大于容差阈值的值会使矩阵对称性测试失败,显然情况并非如此。

1 个答案:

答案 0 :(得分:1)

@BenBolker告诉您查看isSymmetric的帮助页面,该页面将您引导至all.equal。你构建了这个矩阵:

> mat1
            (Intercept)     outcome2     outcome3   treatment2   treatment3
(Intercept)         150 4.000000e+01 4.700000e+01 5.000000e+01 5.000000e+01
outcome2             40 4.000000e+01 2.237910e-14 1.333333e+01 1.333333e+01
outcome3             47 2.476834e-14 4.700000e+01 1.566667e+01 1.566667e+01
treatment2           50 1.333333e+01 1.566667e+01 5.000000e+01 2.710506e-14
treatment3           50 1.333333e+01 1.566667e+01 2.818926e-14 5.000000e+01

all.equal中的测试是tolerance = .Machine$double.eps ^ 0.5,因此没有一个测试实际上与没有参数的测试相同。 (在数量非常小的情况下,sqrt实际上要大得多。)请注意,还有一个关于行名和列名相等的附加测试,您的示例可能会满足。

如果你看一下帮助页面,你应该对你理解all.equal可能正在做什么,当你看到sthat是testing ‘near equality’然后引用你所说的详细信息时会产生怀疑:

 Numerical comparisons for scale = NULL (the default) are done by first computing the mean 
 absolute difference of the two numerical vectors.

在代码中你可以看到,相对于公差而言,不是测试的个体差异,而是平均绝对差异。