【问题标题】:Writing function around statistical tests in R在 R 中围绕统计测试编写函数
【发布时间】:2020-03-30 10:39:08
【问题描述】:

我正在为我的(工作的)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 

我做错了什么?任何帮助将不胜感激!

【问题讨论】:

  • 欢迎来到 SO!这是一个很好的第一个问题,它举例说明了您迄今为止尝试过的内容以及您遇到的具体错误。编写更好问题的一种方法是提供一小部分数据,以便我们可以重现您的错误,而无需猜测您的数据是什么样的。您可以使用dput(head(mydata, 10)) 之类的内容来获取前十行。
  • @qdread ToothGrowth 在示例中给出。这是 R 中的一个内置数据集。但我同意你的观点,即这是一个很好的第一个问题。
  • 好点,我没有注意到。所以这绝对是一个很好的第一个问题。

标签: r function


【解决方案1】:

您可以使用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 package (v0.3.0) 于 2020 年 3 月 30 日创建

【讨论】:

  • 感谢您在这里解释deparse(substitute())的使用!我不知道这一点,并将其应用于我未来的脚本。
【解决方案2】:

您似乎需要将作为文本字符串给出的可变参数转换为公式。您可以通过将字符串与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()) 的解释,我接受了 Allan Cameron 的回答,但您的回答也很有帮助。
  • 请注意,deparse(substitute()) 在这里并不是绝对必要的,因为formula() 将直接将带引号的变量名(字符串)作为参数。
猜你喜欢
  • 2011-04-25
  • 2020-10-16
  • 2013-05-25
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多