簡體   English   中英

在 R 中圍繞統計測試編寫函數

[英]Writing function around statistical tests in R

我正在為我的(工作)R 腳本編寫一個函數以清理我的代碼。 我沒有編寫函數的經驗,但決定我應該投入一些時間。 我的功能的目標是執行多個統計測試,同時只通過一次所需的數據幀、定量變量和分組變量。 但是,我無法讓它發揮作用。 供您參考,我將使用 ToothGrowth 數據框來說明我的問題。

假設我想在len上運行 Kruskal-Wallis 測試和單向方差分析,以比較名為supp的不同組,無論出於何種原因。 我可以單獨執行此操作

kruskal.test(len ~ supp, data = ToothGrowth)
aov(len ~ supp, data = ToothGrowth)

現在我想編寫一個執行這兩個測試的函數。 這是我認為應該工作的:

stat_test <- function(mydata, quantvar, groupvar) {
  kruskal.test(quantvar ~ groupvar, data = mydata)
  aov(quantvar ~ groupvar, data = mydata)
}

但是如果我然后運行stat_test(ToothGrowth, "len", "sup") ,我會收到錯誤

Error in kruskal.test.default("len", "supp") : 
  all observations are in the same group 

我究竟做錯了什么? 任何幫助將非常感激!

看起來您需要將作為文本字符串給出的變量參數轉換為公式。 您可以通過使用paste()連接字符串來做到這一點。 此外,您需要將print()包裹在函數內的兩個統計測試中,否則只會顯示最后一個。

這是修改后的功能:

stat_test <- function(mydata, quantvar, groupvar) {
  model_formula <- formula(paste(quantvar, '~', groupvar))
  print(kruskal.test(model_formula, data = mydata))
  print(aov(model_formula, data = mydata))
}

您可以使用deparse(substitute(quantvar))獲取要傳遞給函數的列的引用名稱,這將允許您使用paste構建公式。 這是在 R 中更慣用的操作方式。

這是一個可重現的示例:

stat_test <- function(mydata, quantvar, groupvar) {
  A <- as.formula(paste(deparse(substitute(quantvar)), "~", 
                        deparse(substitute(groupvar))))
  print(kruskal.test(A, data = mydata))
  cat("\n--------------------------------------\n\n")
  aov(A, data = mydata)
}

stat_test(ToothGrowth, len, supp)
#> 
#>  Kruskal-Wallis rank sum test
#> 
#> data:  len by supp
#> Kruskal-Wallis chi-squared = 3.4454, df = 1, p-value = 0.06343
#> 
#> 
#> --------------------------------------
#> Call:
#>    aov(formula = A, data = mydata)
#> 
#> Terms:
#>                     supp Residuals
#> Sum of Squares   205.350  3246.859
#> Deg. of Freedom        1        58
#> 
#> Residual standard error: 7.482001
#> Estimated effects may be unbalanced

reprex 包於 2020-03-30 創建 (v0.3.0)

作為參考,如果使用 rstatix(統計函數的整潔版),則需要使用sym!! ,而在需要時使用formula()

make_kruskal_test <- function(data, quantvar, groupvar) {
  library(rstatix, quietly = TRUE)
  library(rlang, quietly = TRUE)

  formula_expression <- formula(paste(quantvar, "~", groupvar))
  quantvar_sym <- sym(quantvar)

  shapiro <- shapiro_test(data, !!quantvar_sym) %>% print()
}

sample_data <- tibble::tibble(sample = letters[1:5], mean = 1:5)

make_kruskal_test(sample_data, "mean", "sample")

#> # A tibble: 1 x 3
#>   variable statistic     p
#>   <chr>        <dbl> <dbl>
#> 1 mean         0.987 0.967

暫無
暫無

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

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