我有一个矩阵(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
我可能不明白容忍是如何起作用的;我的想法是,大于容差阈值的值会使矩阵对称性测试失败,显然情况并非如此。
答案 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.
在代码中你可以看到,相对于公差而言,不是测试的个体差异,而是平均绝对差异。