如何解决函数内的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
在我没有功能的情况下默认使用就可以了。 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