2013-03-11 76 views
10

有人請向我解釋all.equal的公差參數嗎?all.equal()的tolerance參數如何工作?

的手冊說?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 

謝謝!

回答

11

如果target大於tolerance,它似乎檢查relative error <= tolerance。也就是說,在abs(current-target)/target <= tolerance

all.equal(target, current, tolerance) 

對於前:

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

相反,如果targettolerance較小,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例子中的必要部分)是: targetcurrent刪除任何NA和相等值(的targetcurrent)。然後計算xy作爲targetcurrent的平均絕對差值。但是決定是否將要relativeabsolute取決於部分what。這裏xy沒有檢查任何條件。它取決於只有xn這是mean(abs(target))

所以,最後,由OP粘貼部分(粘貼在這裏爲方便起見):

如果(意思,平均絕對差)是小於公差或不是有限的,絕對的使用差異,否則通過平均絕對差異縮放相對差異。

似乎是錯誤/誤導。

+0

+1打算髮布幾乎相同的東西。 – juba 2013-03-11 09:20:04

+0

這意味着文檔不正確或我閱讀幫助文件錯誤? – Roland 2013-03-11 09:34:02

+1

@Roland,無論是「相對」還是「絕對」差異計算似乎都只依賴*目標,至少從代碼來看。糾正我,如果我錯了。我認爲這些文件是誤導性的。我會添加更多詳細的代碼以進一步闡明。 – Arun 2013-03-11 09:48:34