1

我正在尝试将 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 类对象,它只是找不到之前创建的 2 行的关联数据。

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

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

谢谢

4

1 回答 1

4

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

y=TRUE通过在函数的第二行添加解决方案:

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

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

于 2016-09-22T19:53:09.903 回答