Написание функции вокруг статистических тестов в R - PullRequest
1 голос
/ 30 марта 2020

Я пишу функцию для моего (рабочего) R-скрипта, чтобы очистить мой код. У меня нет опыта написания функций, но я решил потратить некоторое время на это. Цель моей функции - выполнить несколько статистических тестов, передавая только необходимые данные, количественные и групповые переменные один раз . Однако я не могу заставить это работать. Для справки, я буду использовать фрейм данных ToothGrowth, чтобы проиллюстрировать мою проблему.

Скажем, я хочу запустить тест Крускала-Уоллиса и односторонний ANOVA на len, чтобы сравнить разные группы с именем 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 

Что я делаю не так? Любая помощь будет высоко ценится!

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Вы можете использовать deparse(substitute(quantvar)), чтобы получить цитируемое имя столбца, который вы передаете функции, и это позволит вам построить формулу, используя paste. Это более идиоматический c способ работы в 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

Создано в 2020-03-30 с помощью представ пакет (v0.3.0)

1 голос
/ 30 марта 2020

Похоже, вам нужно преобразовать переменные аргументы, заданные в виде текстовых строк, в формулу. Вы можете сделать это путем объединения строк с 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))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...