变量未找到;范围问题

时间:2016-07-20 03:28:35

标签: r function lme4

我遇到了一些奇怪的范围(可能是?)问题......下面的MWE调用RunSamples,打印变量pr,然后在下一行抛出错误,说明pr不存在。我似乎无法理解为什么print函数可以找到并打印变量pr,但lmer不能。任何帮助,将不胜感激。此外,如果我将pr参数更改为prot,则代码运行正常。

require(lme4)
dat <-data.frame(value=1:10,Item=1:10,Protocol=rep(c("FFT","Data"),5))
RunSamples <- function(dat,form,pr) {
  rets <- list()
  print(pr)
  rets$Full <- lmer(update.formula(form,.~.),data=dat, subset= Protocol==pr )
  return( rets )
}
RunFullMain <- function(prot="CLASS") {
  ret <- list()

  form <-  value~0+Item
  ret$Item <- RunSamples(dat=dat,form=form    ,prot)
  return(ret)
}

Results <- list()
for (pp in c("FFT","CLASS","PLATO")) {
  Results[[pp]] <- RunFullMain(pp)
}

1 个答案:

答案 0 :(得分:0)

我不确定我是否可以解决这个问题,就像让它工作一样,但我想我可以解释发生了什么,并给你一个合理的解决方法。

lmer会尝试评估数据并确保公式中提到的所有变量都存在,从而会执行各种(可能过于复杂)的复杂操作。它试图携带data参数中的所有变量,以及存在于公式环境中的变量,但除此之外它还有问题。这里的近端问题是你的subset调用是指在这两个地方都不存在的变量。简单的解决方法是使用subset函数而不是subset参数:

RunSamples <- function(dat,form,pr) {
  rets <- list()
  rets$Full <- lmer(update.formula(form,.~.),
               data=subset(dat,Protocol==pr))
  return( rets )
}

以便子集化立即完成,而不是等到从无法找到pr的环境中调用函数。

当我这样做时,我会遇到一系列不同的问题,这可能是由于你设置了一个不切实际的简单MWE ......

  • Error: no random effects terms specified in the formula。 (原始公式中将0+Item更改为0+(1|Item)
  • Error: number of levels of each grouping factor must be < number of observations(可能也可以处理这个......)