Как работает параметр допуска all.equal()?

Может кто-нибудь объяснить мне параметр допуска all.equal?

В руководстве написано (?all.equal) :

tolerance: числовое значение ≥ 0. Различия, меньшие, чем допуск, не считается.

Числовые сравнения для scale = NULL (по умолчанию) выполняются сначала вычисляя среднюю абсолютную разность двух числовых векторов. Если это меньше, чем допуск или не конечный, абсолютные различия, в противном случае относительные различия масштабируются средним абсолютным разница.

Пример:

all.equal(0.3, 0.26, tolerance=0.1)

возвращает Mean relative difference: 0.1333333

Почему средняя относительная разница вернулась сюда? Разве не средняя абсолютная разница двух числовых векторов меньше толерантности?

0.3 - 0.26 = 0.04 < 0.1

Спасибо!

Ответ 1

Если target больше, чем tolerance, похоже, для relative error <= tolerance. То есть abs(current-target)/target <= tolerance в:

all.equal(target, current, tolerance)

Для ex:

all.equal(3, 6, tolerance = 1)
# TRUE --> abs(6-3)/3 <= 1

Вместо этого, если target меньше, чем tolerance, all.equal использует mean absolute difference.

all.equal(0.01, 4, tolerance = 0.01)
# [1] "Mean absolute difference: 3.99"

all.equal(0.01, 4, tolerance = 0.00999)
# [1] "Mean relative difference: 399"

all.equal(4, 0.01, tolerance = 0.01)
# [1] "Mean relative difference: 0.9975"

Однако это не то, о чем говорится в документации. Чтобы узнать, почему это происходит, давайте посмотрим на соответствующий фрагмент из all.equal.numeric:

# take the example: all.equal(target=0.01, current=4, tolerance=0.01)
cplx <- is.complex(target) # FALSE
out <- is.na(target) # FALSE
out <- out | target == current # FALSE

target <- target[!out] # = target (0.01)
current <- current[!out] # = current (4)

xy <- mean((if(cplx) Mod else abs)(target - current)) # else part is run = 3.99

# scale is by default NULL
what <- if (is.null(scale)) {
    xn <- mean(abs(target)) # 0.01
    if (is.finite(xn) && xn > tolerance) { # No, xn = tolerance
        xy <- xy/xn
        "relative"
    }
    else "absolute" # this is computed for this example
}
else {
    xy <- xy/scale
    "scaled"
}

Все, что проверяется в приведенном выше коде (показаны только необходимые части для примера из OP): удалить любые NA и равные значения (target и current) из target и current. Затем вычислите xy как среднюю абсолютную разность target и current. Но решение о том, будет ли оно relative или absolute, зависит от части what. И здесь xy не проверяется ни на какие условия. Это зависит только от xn, которое mean(abs(target)).

Итак, в заключение, часть, вставленная OP (вставлена ​​здесь для удобства):

Если это (значение, означает абсолютную разницу) меньше, чем допуск или не конечный, используются абсолютные различия, в противном случае относительные различия масштабируются по средней абсолютной разности.

кажется неправильным/вводящим в заблуждение.