0

考虑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))

我想编写一个函数,允许我指定数据、分组变量(RegionStateLoc)和变量的行名(var1: var5),我希望它使用这些变量进行 manova 并以整洁的格式返回结果。运行该函数将如下所示: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)
 }

你怎么做到这一点?我对如何以这种格式指定公式感到特别困惑!

4

3 回答 3

1

您可以使用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

reprex 包(v0.3.0)于 2020-05-27 创建

于 2020-05-27T15:01:15.417 回答
0

如果您只是担心公式,那么您就快到了。这应该工作

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

manova.test(dat1, "Region")

于 2020-05-27T15:05:59.720 回答
0

这是基于 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))
于 2020-05-27T15:10:52.557 回答