我试图概括一个函数,它将运行所有这些不同的模型组合,但对不同的响应变量。
`
model_suite <- function(response, df){
mod1.2 <- lmer(log(response) ~ traffic + (1 | site), data = df, na.action = na.exclude, REML = FALSE)}
#all eelgrass dry weight by site type with site as a random effect #
mod2.2 <- lmer(log(response) ~ type + (1 | site), data = df, na.action = na.exclude, REML = FALSE)
#all data by season with site as a random effect
mod3.2 <- lmer(log(response) ~ season + (1 | site), data = df, na.action = na.exclude, REML = FALSE)
#all data by traffic class and season with site as a random effect
mod4.2 <- lmer(log(response) ~ traffic * season + (1 | site), data = df, na.action = na.exclude, REML = FALSE)
mod5.2<- lmer(log(response) ~ traffic + season + (1 | site), data = df, na.action = na.exclude, REML = FALSE)
#all data by site type and season with site as a random effect
mod6.2 <- lmer(log(response) ~ type * season + (1 | site), data = df, na.action = na.exclude, REML = FALSE)
mod7.2 <- lmer(log(response) ~ type + season + (1 | site), data = df, na.action = na.exclude, REML = FALSE)
mod.sel <- model.sel(mod1.2, mod2.2, mod3.2, mod4.2, mod5.2, mod6.2, mod7.2)
print(mod.sel)
}`
字符串
这样当我运行这个函数时:
`model_suite(eelgrass_length, all_eelgrass) `
型
Error in eval(predvars,data,env):object 'eelgrass_length' not found(eval(predvars,data,env):对象'eelgrass_length'未找到)
我如何推广它来遍历这些呢?
1条答案
按热度按时间ssgvzors1#
在R中使用公式时必须小心。公式中的名称不会以您可能期望的方式替换。例如,如果我们这样做:
字符串
然后运行:
型
我们可以看到,公式的左手侧仍然是
variable
-它没有像你期望的那样被替换为banana
。有很多方法可以解决这个问题,一种是使用
deparse(substitute(...))
从输入名称创建一个字符串,然后使用as.formula
将其转换为公式。因此,我们可以将上述函数更改为:
型
现在函数的输入将被代入公式
型
这正是你的函数的问题所在。
response
在你的公式中没有被替换,所以你的函数实际上是在寻找一个名为response
的列,而这个列并不存在。使用
as.formula
创建公式的机制也使我们有机会删除函数中的一些重复。我们可以创建一个list
公式,并在lapply
中循环lmer
调用。然后我们可以直接在此列表上调用model.sel
。型
这允许:
使用的数据
我们没有你用来运行这个函数的数据,而且看起来这个函数依赖于传递的数据框中的特定列。我已经创建了一个与你的数据同名的小数据框,这样上面的代码也应该适用于你的真实的数据: