all.equal函数给出误报

时间:2016-02-22 17:16:57

标签: r

我发现在all.equal函数中看起来似乎是一个错误,似乎会产生误报结果。这是一个可重复的小例子:

a<-rep(1,1e7)
#create a second vector in which each element is almost equal to a
b<-a + .Machine$double.eps
#as expected a and b are "all.equal"
all.equal(a,b)
#[1] TRUE
#Now we set a slighty different value for the first element of b
b[1]<-1.1
all.equal(a,b)
#[1] TRUE
那是怎么回事?即使TRUEa[1]之间的差异远远高于容差值,为什么b[1]会产生结果?

1 个答案:

答案 0 :(得分:5)

实际上,这是all.equal函数的预期行为。为了更好地理解这个问题,这里只是对all.equal主要做什么的一个小概述。

  • 首先,它检查要比较的两个对象的属性。当然,如果check.attributes设置为FALSE,则会跳过此步骤。
  • 然后,它会检查NAcurrenttarget的值是否一致。如果他们没有,则退出该功能并返回正确的消息。
  • 接下来,删除完全相等的元素。
  • 评估剩余值的绝对差值的平均值。如果此平均值小于tolerance,则函数返回TRUE;否则返回一个具有平均差异的字符串。

最后一步是至关重要的一步。 all.equal不会检查所有差异是否低于容差水平。它检查(绝对)差异的平均值是否为。这可能会产生看起来像是误报的东西。在您的情况下,ab的所有元素都不同;第一个元素(0.1)的微小差异除以不同值的数量,这是非常大的。它最终是一个低于默认容差的数字。

必须强调的是,这些误报&#34;只能在OP发布的边缘情况下出现。