【问题标题】:How to use substitute() to loop lme functions from nlme package?如何使用substitute() 循环nlme 包中的lme 函数?
【发布时间】:2014-10-14 09:38:02
【问题描述】:

我正在尝试在 lapply 循环中使用 nlme 包中的 lme 函数。这适用于lme4 包中的lmer 函数,但会为lme 生成错误消息。如何循环 lme 函数,类似于下面示例中的 lmer 函数?

library("nlme")
library("lme4")

set.seed(1)
dt <- data.frame(Resp1 = rnorm(100, 50, 23), Resp2 = rnorm(100, 80, 15), Pred = rnorm(100,10,2), group = factor(rep(LETTERS[1:10], each = 10)))

## Syntax:
lmer(Resp1 ~ Pred + (1 |group), data = dt)
lme(Resp1 ~ Pred, random = ~1 | group, data = dt)

## Works for lme4
lapply(c("Resp1", "Resp2"), function(k) {
  lmer(substitute(j ~ Pred + (1 | group), list(j = as.name(k))), data = dt)})

## Does not work for nlme
lapply(c("Resp1", "Resp2"), function(k) {
lme(substitute(j ~ Pred, list(j = as.name(k))), random = ~1 | group, data = dt)})

# Error in UseMethod("lme") : 
# no applicable method for 'lme' applied to an object of class "call"

PS。我知道this solution 存在,但我想使用一种方法直接在模型函数中替换响应变量,而不是使用附加函数对数据进行子集化。

【问题讨论】:

  • 尝试添加eval 来处理call 对象?
  • @CarlWitthoft Jep。这就是诀窍。谢谢!答案是lme(eval(substitute(j ~ Pred, list(j = as.name(k)))), random = ~1 | group, data = dt)
  • Mikko,很高兴做到了。随意发布答案。

标签: r lapply lme4 mixed-models nlme


【解决方案1】:

除了摆弄substituteeval,您还可以执行以下操作:

lapply(c("Resp1", "Resp2"), function(r) {
   f <- formula(paste(r, "Pred", sep = "~"))
   m <- lme(fixed = f, random = ~ 1 | group, data = dt)
   m$call$fixed <- f
   m})

如果您想为建模函数提供不同的数据集,您可以使用相同的技巧:

makeModel <- function(dat) {
   l <- lme(Resp1 ~ Pred, random = ~ 1 | group, data = dat)
   l$call$data <- as.symbol(deparse(substitute(dat)))
   l
}

当我想从一个函数中生成一个模型并想在之后更新它时,我经常使用这个 sn-p。

【讨论】:

    【解决方案2】:

    正如@CarlWitthoft 建议的那样,将eval 添加到函数中将解决问题:

    lapply(c("Resp1", "Resp2"), function(k) {
    lme(eval(substitute(j ~ Pred, list(j = as.name(k)))), random = ~1 | group, data = dt)})
    

    另见@thothal 的替代方案。

    【讨论】:

      猜你喜欢
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      • 1970-01-01
      相关资源
      最近更新 更多