r - 在 R 中围绕统计测试编写函数

标签 r function

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

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

最佳答案

您可以使用 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 创建于 2020-03-30 (v0.3.0)

关于r - 在 R 中围绕统计测试编写函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60928736/

相关文章:

r - STRINGdb r 环境;绘图网络中的错误

r - 使用神经网络包保存神经网络图时遇到问题 - R

css - R:Shiny:如何在shinyapp中将gvisTable与中心对齐

function - 使用 ADO.Net “System.Data.Odbc” (VB.Net) 从 PostgreSQL 数据库中检索数据

r - 稳定分布对数似然和 AIC 值

r - 当我的 dockerized Shiny 应用程序不起作用时如何查找错误日志

c - 为什么有些函数的原型(prototype)带有星号?

javascript - .shift() 显然不再存在

c - 段错误从函数返回字符串数组

c++ - Serial.println 改变函数的返回值 (Arduino)