car::boxCox() 函数包装到自制函数时的奇怪行为

Weird behaviour of the car::boxCox() function when wrap into a homemade function

我正在尝试将 car::boxCox 函数包装到一个自制函数中,以便我可以将其映射到数据集列表。我使用的是 car 包中的 boxCox 函数,而不是 MASS 包,因为我想使用 family="yjPower"。我的问题很奇怪,它要么是我不明白的基础问题,要么是某种错误。这是一个可重现的例子:

library(car)

le.mod <- function(val.gold,val.bad){
  donn <- data.frame(val.gold,val.bad)
  res.lm <- lm(val.gold ~ val.bad, data=donn)
  bcres <- boxCox(res.lm, family="yjPower", plotit=F)
  lambda <- bcres$x[which.max(bcres$y)]
  donn$val.bad.t <- donn$val.bad^lambda
  res.lm <- lm(val.gold ~ val.bad.t, data=donn)
  list(res.lm=res.lm, lambda = lambda)
}

xx <- runif(1000,1,100)
xxt1 <- xx^0.6 + runif(1000,1,10)
yy <- 2*xx + 10 + rnorm(1000,0,2)

le.mod(yy,xxt1)

这给了我错误信息:

## Error in is.data.frame(data) : object 'donn' not found

我将问题定位到以下行:

  bcres <- boxCox(res.lm, family="yjPower", plotit=F)

boxCox 应该能够获取 lm class 对象,它只是找不到 2 行之前创建的关联数据。

它在函数 le.mod() 之外运行良好。这可能是与环境管理相关的问题,boxCox 函数在全局环境中寻找 "donn" 但没有找到它,并且出于某种原因我忽略了在特定于函数的环境中不寻找它。

有人有解决此问题的想法或向我解释我在这里不明白的地方吗?几天来我一直在思考这个问题,但我无法让它工作。

谢谢

我找到了答案 (!),但是我无法理解这种行为的原因,所以如果有人有解释,请不要犹豫 post。

在函数第二行加入y=TRUE的解决方法:

res.lm <- lm(val.gold ~ val.bad, data=donn,y=TRUE)

出于某些原因,这允许它通过。