簡體   English   中英

R中測試統計功能的指南

[英]guidelines for testing a statistical function in R?

問題:我正在測試正在開發的程序包中的功能,並想知道您是否可以就如何執行此操作提出一些一般性准則。 這些功能包括各種統計建模,轉換,子集和繪圖。 是否有“標准”或足夠的測試?

范例:測試提示我問這個問題,

函數dtheta:

dtheta <- function(x) {
  ## find the quantile of the mean
  q.mean <- mean(mean(x) >= x)
  ## find the quantiles of ucl and lcl (q.mean +/- 0.15)
  q.ucl  <- q.mean + 0.15
  q.lcl  <- q.mean - 0.15
  qs <- c(q.lcl, q.mean, q.ucl)
  ## find the lcl, mean, and ucl of the vector
  c(quantile(x,qs), var(x), sqrt(var(x))/mean(x))
}

步驟1:制作測試數據:

set.seed(100) # per Dirk's recommendation
test <- rnorm(100000,10,1)

步驟2:將功能的預期輸出與功能的實際輸出進行比較:

 expected <- quantile(test, c(0.35, 0.65, 0.5))
 actual   <- dtheta(test)[1:3]
 signif(expected,2) %in% signif(actual,2)

步驟3:也許再做一次測試

test2 <- runif(100000, 0, 100)
expected <- c(35, 50, 65)
actual   <- dtheta(test2)
expected %in% signif(actual,2)

步驟4:如果為真,則考慮功能為“功能性”

這取決於您要測試的內容。 除了Dirks的建議之外, svUnit提到了svUnitRUnit包VitoshKa,我想添加一些內容:

  • 確實,設置了種子,但請確保也嘗試使用其他種子來執行該功能。 某些功能每十次嘗試失敗一次。 特別是在涉及優化時,這變得至關重要。 replicate()是在此上下文中使用的很好的函數。
  • 考慮一下要測試的輸入。 您應該測試許多與“完美”數據集完全不同的“奇數”案例。 我總是至少測試10個(模擬的)不同大小的數據集。
  • 萬無一失的功能:我還拋出了一些不是該功能所要使用的數據類型。 錯誤的類型輸入很可能會在某一時刻發生,而您想要的最后一件事是一個函數在沒有警告的情況下返回假結果。 如果您稍后在其他一些代碼中使用該功能,則可以並且可以調試該代碼! 地獄。 到那里去做,買了這件T恤...

關於數據集擴展測試的示例:在這些情況下,您希望看到什么? 這是您期望的結果嗎? 並非根據您所做的測試。

> test3 <- rep(12,100000) # data with only 1 value
> expected <- c(12, 12, 12)
> actual   <- dtheta(test3) 
Error in quantile.default(x, qs) : 'probs' outside [0,1]

>  test4 <- rbinom(100000,30,0.5) # large dataset with a limited amount of values
>  expected <- quantile(test4,c(0.35, 0.50, 0.65))
>  actual   <- dtheta(test4)
>  expected %in% signif(actual,2)
[1] FALSE  TRUE  TRUE

> test5 <- runif(100,0,100) # small dataset. 
> expected <- c(35, 50, 65)
> actual   <- dtheta(test5)
> expected %in% signif(actual,2)
[1] FALSE FALSE FALSE

編輯:更正的代碼,因此測試更有意義。

你需要寫

  1. 輸入合理值的測試可顯示正確答案

  2. 當您輸入廢話時,表明您的功能的測試會正確失敗。

  3. 測試所有邊界情況

關於測試軟件的不同策略的文獻很多。 Wikipedia的軟件測試頁和任何開始的地方一樣好。

看你的例子:

輸入字符串/數據框/列表時會發生什么?
x或虛x呢?
向量/數組x怎么樣?
如果只允許正x ,那么x = 0時會發生什么?

請注意,子功能(僅由您的函數調用,而不會由用戶調用)需要較少的輸入檢查,因為您可以更好地控制該函數的內容。

好問題。

除了設置種子等一般性功能外,我建議您查看R源中的一些測試。 源代碼中的tests/目錄中有很多。 R Base中的某些軟件包(例如工具)還具有子目錄tests/

它已經作為評論出現,但是我將其添加為真實的答案。 [R確實有一些自動化的測試包,以幫助這種事情,主要的兩個是Runittestthat 我曾經簡短地使用過runit,最近又開始更深入地使用testthat(盡管我不能真正給出一個相對於另一個的任何優點/缺點!)。

自動化測試允許您設置這些測試用例以及上面建議的其他用例;例如,

  • 邊界測試
  • 壓力測試(無需測試准確性,只需向其扔數據並查看是否跌落)
  • 處理不同的輸入
  • 處理不同的基礎平台/語言環境

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM