R 对称矩阵检查:公差是如何工作的?
我有一个矩阵(mat1)。测试对称性时: isSymmetric(mat1,tol=0) 假的 这意味着零公差下,矩阵是不对称的。但是,在公差稍大的情况下,矩阵被视为对称: isSymmetric(mat1,tol=10*.Machine$double.eps) 真的 但是,对称条目之间的最大差值大于此公差值: 最大值(abs(mat1-t(mat1))>(10*机器$double.eps) 真的 为什么当对称差大于公差值时,矩阵被归类为对称矩阵 对于使用?glm示例的工作示例:R 对称矩阵检查:公差是如何工作的?,r,matrix,R,Matrix,我有一个矩阵(mat1)。测试对称性时: isSymmetric(mat1,tol=0) 假的 这意味着零公差下,矩阵是不对称的。但是,在公差稍大的情况下,矩阵被视为对称: isSymmetric(mat1,tol=10*.Machine$double.eps) 真的 但是,对称条目之间的最大差值大于此公差值: 最大值(abs(mat1-t(mat1))>(10*机器$double.eps) 真的 为什么当对称差大于公差值时,矩阵被归类为对称矩阵 对于使用?glm示例的工作示例: counts
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
counts@BenBolker让您查看帮助页面中的IsSymmetry,它会引导您进入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可能在做什么的理解,因为yious看到它正在测试“近似相等”
,然后向您介绍其中的详细信息:
Numerical comparisons for scale = NULL (the default) are done by first computing the mean
absolute difference of the two numerical vectors.
在代码中,您可以看到测试的不是相对于公差的个体差异,而是平均绝对差异。您是否查看了
isSymmetric.matrix
了解详细信息?这将导致您找到all.equal(mat1,t(mat1))
或all.equal(c(abs(mat1-t(mat1))),rep(0,length(mat1))
(两者都是真的)。然后查看?all.equal
和all.equal.numeric
@BenBolker all.equal还有一个默认设置-.Machine$double.eps^0.5-,它明显小于我正在测试的值,因此使用它而不是isSymmetric,我还可以显示矩阵不是对称的:all.equal(mat1,t(mat1),公差=0)但这不是我主要关心的问题-当我故意将公差设置为小于最大值(即max(abs(mat1-t(mat1)))-all.equal(mat1,t(mat1),公差=10*.Machine$double.eps)时,为什么会这样?在测试所有与该公差相等的值时,任何较大的值差都将使其为假…2.13162e-14>2.220446e-15(对吗?)标记为重复的I的可能重复项。简而言之,与宽容相比的是相对的,而不是绝对的差异。它与all.equal
的第二个参数中的平均绝对值相对。对,我的测试与all.equal的默认公差不同。我正在设置公差值,因此不在.Machine$double.eps^0.5处测试公差。使用我在IsSymmetry中指定的公差(10*.Machine$double.eps-也可用于all.equal),我发现矩阵被视为对称的,即使存在大于该公差值的差异-即max(abs(mat1-t(mat1)),可能我不理解“公差”:对我来说,这意味着它将“接受”差异,只要它们低于公差阈值。。。但是有比这更大的区别!