我正在尝试将 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”但没有找到它,出于某种原因,我忽略了在特定功能环境中不寻找它。
有人有想法解决这个问题或向我解释我在这里不明白的地方吗?几天来我一直在思考这个问题,但我无法让它工作。
谢谢