当换成自制函数时,car :: boxCox()函数的奇怪行为

时间:2016-09-22 13:11:49

标签: r function r-car

我正在尝试将car :: boxCox函数包装到自制函数中,以便将其映射到数据集列表。我正在使用汽车包装中的boxCox功能而不是MASS包装,因为我想使用family =“yjPower”。我的问题很奇怪,这或者是我不理解的东西或者某种bug。这是一个可重复的例子:

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”但没有找到它,并且我忽略了在功能特定环境中不寻找它的原因。

有人有想法解决这个问题或向我解释我在这里不明白的地方吗?我已经把这个问题转过头几天了,我无法让它发挥作用。

由于

1 个答案:

答案 0 :(得分:4)

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

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

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

由于某些原因,这可以让它通过。