R将线性模型传递给函数内的另一个函数
R Passing linear model to another function inside a function
我正在尝试为 Box-Cox 变换找到最佳 "lambda" 参数。
我正在使用 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。我没有提供 software/hardware 说明,因为这个错误已成功复制到我朋友的许多笔记本电脑上。
P.P.S。我已经在 forecast 包中找到了解决最初问题的方法,但我仍然想知道,为什么这段代码不起作用。
有时,用户提供的包并不总是能很好地跟踪在操作函数调用时执行调用的环境。最快的解决方法是从
更改行
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
调用使用这些参数,并且函数范围内的事情变得一团糟。
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))
为什么不让 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
环境中不存在。如果我在这方面有误,请纠正我。
我正在尝试为 Box-Cox 变换找到最佳 "lambda" 参数。
我正在使用 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。我没有提供 software/hardware 说明,因为这个错误已成功复制到我朋友的许多笔记本电脑上。
P.P.S。我已经在 forecast 包中找到了解决最初问题的方法,但我仍然想知道,为什么这段代码不起作用。
有时,用户提供的包并不总是能很好地跟踪在操作函数调用时执行调用的环境。最快的解决方法是从
更改行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
调用使用这些参数,并且函数范围内的事情变得一团糟。
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))
为什么不让 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
环境中不存在。如果我在这方面有误,请纠正我。