繁体   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