Как указать субъективные столбцы для формулы внутри функции - PullRequest
0 голосов
/ 27 мая 2020

Рассмотрим dat1, созданный здесь:

dat1 <- data.frame(Region = rep(c("r1","r2"), each = 100),
                   State = rep(c("NY","MA","FL","GA"), each = 10),
                   Loc = rep(c("a","b","c","d","e","f","g","h"),each = 5),
                   ID = rep(c(1:10), each=2),
                   var1 = rnorm(200),
                   var2 = rnorm(200),
                   var3 = rnorm(200),
                   var4 = rnorm(200),
                   var5 = rnorm(200))

Я хочу написать функцию, которая позволит мне указать данные, группирующую переменную (Region, State или Loc) , и имена строк переменных (var1: var5), с которыми я хочу, чтобы он проводил манову и возвращал результаты в аккуратном формате. Запуск функции будет выглядеть примерно так: manova.test(dat = dat1, groupvar = "Region", cols = 5:9)

Функция будет выглядеть примерно так (что не работает):

manova.test <- function(dat, groupvar, cols){
   var.mat <- as.matrix(dat[, cols])
   group.man <- manova(cbind(var.mat) ~ groupvar, data = dat)
   summary(group.man)
 }

Как это сделать? Меня особенно смущает, как указать формулу в таком формате!

Ответы [ 3 ]

1 голос
/ 27 мая 2020

Вы можете использовать get, чтобы вернуть именованный объект внутри функции. Недостатком является то, что в сводке переменная будет помечена get(groupvar), поэтому я переименовал ее в вашей функции:

set.seed(1)
dat1 <- data.frame(Region = rep(c("r1","r2"), each = 100),
                   State = rep(c("NY","MA","FL","GA"), each = 10),
                   Loc = rep(c("a","b","c","d","e","f","g","h"),each = 5),
                   ID = rep(c(1:10), each=2),
                   var1 = rnorm(200),
                   var2 = rnorm(200),
                   var3 = rnorm(200),
                   var4 = rnorm(200),
                   var5 = rnorm(200))

manova.test <- function(dat, groupvar, cols){
    var.mat <- as.matrix(dat[, cols])
    group.man <- manova(cbind(var.mat) ~ get(groupvar), data = dat)
    s <- summary(group.man)
    dimnames(s$stats)[[1]][1] <- groupvar
    s
}

manova.test(dat = dat1, groupvar = "Region", cols = 5:9)
#>            Df   Pillai approx F num Df den Df Pr(>F)
#> Region      1 0.015933   0.6282      5    194 0.6784
#> Residuals 198

Создано 27 мая 2020 года пакетом репекс. (v0.3.0)

0 голосов
/ 27 мая 2020

Вот один из подходов, основанный на win-vector.com/blog/2018/09/r-tip-how-to-pass-a-formula-to-lm/. Самое замечательное в этом решении то, что вы можете легко расширить groupvar для нескольких столбцов

manova.test <- function(dat, groupvar, cols){
  paster <- function(x){
    paste(x,collapse = " + ")
  }

  groupvar <- dat %>% select({{groupvar}}) %>% names()

  var.mat <- as.matrix(dat %>% select({{cols}}))

  f <- paste("cbind(var.mat)", paster(groupvar), sep = " ~ " ) %>% as.formula()

  model <- eval(bquote(   manova(.(f), data = dat)))
  summary(model)
}

manova.test(dat1,c(Region,Loc),cols = c(var1:var5))
0 голосов
/ 27 мая 2020

Если вы просто беспокоитесь о формуле, вы почти у цели. Это должно работать

manova.test <- function(df, groupvar) {
  manova(cbind(var1, var2) ~ df[[groupvar]], data = df)
}

manova.test(dat1, "Region")

...