我正在尝试将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”但没有找到它,并且我忽略了在功能特定环境中不寻找它的原因。
有人有想法解决这个问题或向我解释我在这里不明白的地方吗?我已经把这个问题转过头几天了,我无法让它发挥作用。
由于
答案 0 :(得分:4)
我找到了答案(!),但是我无法理解这种行为的原因,所以如果有人有解释,请不要犹豫发布。
在函数的第二行添加y=TRUE
的解决方案:
res.lm <- lm(val.gold ~ val.bad, data=donn,y=TRUE)
由于某些原因,这可以让它通过。