如何解决函数内的emmeans错误?

How to solve the emmeans error within function?

在我没有功能的情况下默认使用就可以了。 CHQ01 是一个有 5 个水平的因素。

out <- aov(DF2M[['RMR']] ~ DF2M[['CHQ01']] + AGE + FFM, data = DF2M)
emm <- emmeans::emmeans(out,specs ='CHQ01',)
results <-  summary(emm)[-c(1,4)]
results_vec <- cbind(results[1,],results[2,],results[3,],results[4,],results[5,])
results_vec <- results_vec[ , order(names(results_vec))]
order.list <- c(results_vec %>% select(starts_with('emmean')) %>% names(),
                results_vec %>% select(starts_with('SE')) %>% names(),
                results_vec %>% select(starts_with('lower.CL')) %>% names(),
                results_vec %>% select(starts_with('upper.CL')) %>% names())
results_ord <- results_vec[ ,order.list]
results_ord 

但是emmeans包进入函数的时候出现如下错误

ano_emm.fun <- function(df,namedep,nameindep) {
out <- aov(df[[nameindep]] ~  (df[[namedep]]) + AGE + FFM, df)
emm <- emmeans(out, specs = namedep)
  results <-  summary(emm)[-c(1,4)]
  results_vec <- cbind(results[1,],results[2,],results[3,],results[4,],results[5,])
  results_vec <- results_vec[ , order(names(results_vec))]
  order.list <- c(results_vec %>% select(starts_with('emmean')) %>% names(),
                  results_vec %>% select(starts_with('SE')) %>% names(),
                  results_vec %>% select(starts_with('lower.CL')) %>% names(),
                  results_vec %>% select(starts_with('upper.CL')) %>% names())
  results_ord <- results_vec[ ,order.list]
  results_ord <- cbind(var= namedep, results_ord)
  return(results_ord)
}
ano_emm.fun(DF2M, 'AGE', 'RMR')
Error in model.frame.default(formula, data = data, ...) : 
invalid type (NULL) for variable df[[namedep]]
8.
model.frame.default(formula, data = data, ...)
7.
stats::model.frame(formula, data = data, ...)
6.
model.frame(trms, utils::head(data, 2))
5.
.find.coerced(trms, data)
4.
(function (object, at, cov.reduce = mean, cov.keep = get_emm_option("cov.keep"), 
mult.names, mult.levs, options = get_emm_option("ref_grid"), 
data, df, type, regrid, nesting, offset, sigma, nuisance = character(0), 
non.nuisance, wt.nuis = "equal", rg.limit = get_emm_option("rg.limit"), ...
3.
do.call(ref_grid, args)
2.
emmeans(out, specs = namedep)
1.
ano_emm.fun(df = DF2M, namedep = colnames(DF2M[i]), nameindep = "RMR")

我做了一个函数,因为我要同时分析几个变量,但奇怪的是,当emmeans在函数中时,出现了错误。 我已经在变量 df[[namedep]] 上尝试了 as.nuermic、as.factor,但它不起作用。

很抱歉我不能公开数据集。在 iris 数据集中发现了同样的问题。

out <- aov(iris[['Sepal.Length']] ~ iris[['Species']] + Sepal.Width +  Petal.Length, data = iris)
emm <- emmeans::emmeans(out,specs ='Species')

ano_emm.fun <- function(df,namedep,nameindep) {
  out <- aov(df[[nameindep]] ~ df[[namedep]] + Sepal.Width + Petal.Length, df)
  emm <- emmeans(out, specs = namedep)
  return(out)
}
ano_emm.fun(iris,'Species','Sepal.Length')

仔细查看您的错误消息,我们发现:

invalid type (NULL) for variable df[[namedep]]

这意味着它正在寻找一个名为 "df[[namedep]]" 而不是 namedep 的变量。 我们可以通过使用 reformulate() 创建模型公式来最优雅地解决这个问题。

其他小问题:

  • 我想你想要 return emm,而不是 out
  • 按照常规术语,模型公式的left-hand边是因变量,right-hand边是独立个变量。

以下修改后的函数可以解决问题(并且还解决了上面的小问题)

ano_emm.fun <- function(df, nameindep, namedep) {
    fmla <- reformulate(c(nameindep, "Sepal.Width", "Petal.Length"),
                        response = namedep)
    out <- aov(fmla, df)
    emm <- emmeans(out, specs = nameindep)
    return(emm)
}

测试运行:

> ano_emm.fun(iris, 'Species', 'Sepal.Length')
 Species    emmean     SE  df lower.CL upper.CL
 setosa       6.63 0.1672 145     6.30     6.96
 versicolor   5.67 0.0639 145     5.54     5.80
 virginica    5.23 0.1259 145     4.98     5.48

Confidence level used: 0.95