我正在努力寻找最佳的" lambda" Box-Cox转换的参数。
我正在使用 MASS 包中的实现,所以我只需要创建模型并提取lambda。
以下是该函数的代码:
library(MASS)
find_lambda <- function(x) {
# Function to find the best lambda for the Box-Cox transform
my_tmp <- data.frame(x = x) # Create a temporary data frame, to use it with the lm
str(my_tmp) # Gives the expected output
the_lm <- lm(x ~ 1, data = my_tmp) # Creates the linear model, no error here
print(summary(the_lm)) # Prints the summary, as expected
out <- boxcox(the_lm, plotit=FALSE) # Gives the error
best_lambda <- out$x[which.max(out$y)] # Extracting the best fitting lambda
return(best_lambda)
}
find_lambda(runif(100))
它出现以下错误:
Error in is.data.frame(data) : object 'my_tmp' not found
有趣的是,相同的代码在函数外部工作。换句话说,出于某种原因, MASS 包中的 boxcox 函数正在全局环境中查找变量。
我真的不明白,到底发生了什么......你有什么想法吗?
P.S。我没有提供软件/硬件规范,因为这个错误已成功复制到我的一些朋友身上。笔记本电脑。
P.P.S。我找到了解决预测包中的初始问题的方法,但我仍然想知道为什么这段代码无效。
答案 0 :(得分:4)
有时,用户提供的包并不总能很好地跟踪操作函数调用时执行调用的环境。最快的解决方法是从
更改行the_lm <- lm(x ~ 1, data = my_tmp)
到
the_lm <- lm(x ~ 1, data = my_tmp, y=True, qr=True)
因为如果y
调用未请求qr
和lm
,boxcox
函数会尝试通过这些参数重新运行lm
一个update
调用,事情会在函数范围内被删除。
答案 1 :(得分:1)
为什么不让box-cox做拟合?
find_lambda <- function(x) {
# Function to find the best lambda for the Box-Cox transform
my_tmp <- data.frame(x = x) # Create a temporary data frame, to use it with the lm
out <- boxcox(x ~ 1, data = my_tmp, plotit=FALSE) # Gives the error
best_lambda <- out$x[which.max(out$y)] # Extracting the best fitting lambda
return(best_lambda)
}
我认为您的范围界定问题是update.default
eval(call, parent.frame())
,而my_tmp
环境中不存在boxcox
和{{1}}。如果我错了,请纠正我。
答案 2 :(得分:0)
boxcox
无法找到您的数据。这可能是因为一些范围问题
您可以将数据输入boxcox
功能。
find_lambda <- function(x) {
# Function to find the best lambda for the Box-Cox transform
my_tmp <- data.frame(x = x) # Create a temporary data frame, to use it with the lm
str(my_tmp) # Gives the expected output
the_lm <- lm(x ~ 1, data = my_tmp) # Creates the linear model, no error here
print(summary(the_lm)) # Prints the summary, as expected
out <- boxcox(the_lm, plotit=FALSE, data = my_tmp) # feed data in here
best_lambda <- out$x[which.max(out$y)] # Extracting the best fitting lambda
return(best_lambda)
}
find_lambda(runif(100))