未找到变量;范围问题

Variable not Found; Scoping Issue

我 运行 遇到了一些奇怪的范围界定(也许?)问题...下面的 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)
}

我不确定我能否解决这个问题,让它正常工作,但我想我可以解释发生了什么并为您提供合理的解决方法。

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(可能也可以处理这个......)