[英]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.