R:predict.lme 无法解释从变量定义的公式

问题描述 投票:0回答:1

我一直被一个追溯到 predict.lme 的错误所困扰,它在函数内部运行,无法根据从函数外部传递的变量解释公式。我知道这个问题与可变范围和不同环境有关,但我一直无法完全理解它或找到解决方法。非常感谢您的帮助。

这是一个可重现的例子:

# This will be the nested function.
train_test_perf <- function(train_data, test_data, model, termLabels) {
  fixForm <- reformulate(termlabels=termLabels, response="Y")
  fit <- nlme::lme(fixForm, data=train_data, random=~ 1|ID)
  train_pred <- predict(fit, newdata=train_data, level=0, na.action=na.exclude)
  rtrain <- cor.test(train_data$Y, train_pred)
  test_pred <- predict(fit, newdata=test_data, level=0, na.action=na.exclude)
  rtest <- cor.test(test_data$Y, test_pred)
  tmp <- data.frame(Model=model, 
                    R_train=rtrain$estimate, 
                    R_test=rtest$estimate)
  return(tmp)
}

# And here is the function that calls it.
myfunc <- function(df, newdf, varList) {
  for (v in varList) {
    perf <- train_test_perf(train_data=df, test_data=newdf, model=v, termLabels=v)
    print(perf)
  }
}

# The outer function call.
myfunc(df=dat, newdf=newdat, varList=list("W", "X"))

运行它会出现以下错误和回溯:

Error in eval(mCall$fixed) : object 'fixForm' not found
7.
eval(mCall$fixed)
6.
eval(mCall$fixed)
5.
eval(eval(mCall$fixed)[-2])
4.
predict.lme(fit, newdata = train_data, level = 0, na.action = na.exclude)
3.
predict(fit, newdata = train_data, level = 0, na.action = na.exclude)
2.
train_test_perf(train_data = df, test_data = newdf, model = v, 
termLabels = v)
1.
myfunc(df = dat, newdf = newdat, varList = list("W", "X"))

很明显 predict.lme 无法访问 fixForm 变量,但我一直无法找到一种方法来定义基于变量的公式并使 predict.lme 可以访问该值。我不确定嵌套函数结构是否是这里问题的一部分——如果是的话,我更愿意找到一种解决方法来维护这个结构,因为我的真实代码在 myfunc 中包含之前发生的一些其他事情在调用 train_test_perf 之后。

谢谢,

杰夫·菲利普斯

r scope nested predict
1个回答
0
投票

这行得通。

train_test_perf <- function(train_data, test_data, model, termLabels) {
  fixForm <- reformulate(termlabels=termLabels, response="Y")
  fit <- do.call(nlme::lme, list(fixForm, data=quote(train_data), random=~ 1|ID))
  train_pred <- predict(fit, newdata=train_data, level=0, na.action=na.exclude)
  rtrain <- cor.test(train_data$Y, train_pred)
  test_pred <- predict(fit, newdata=test_data, level=0, na.action=na.exclude)
  rtest <- cor.test(test_data$Y, test_pred)
  tmp <- data.frame(Model=model, R_train=rtrain$estimate, 
                    R_test=rtest$estimate)
  return(tmp)
}

t(sapply(list("W", "X"), \(x) train_test_perf(train_data=dat, test_data=newdat, model=x, termLabels=x)))
#      Model R_train   R_test      
# [1,] "W"   0.1686495 -0.001738604
# [2,] "X"   0.4138526 0.2992374   
© www.soinside.com 2019 - 2024. All rights reserved.