R 在函数环境中运行线性模型和测试时的名称问题

R 在函数环境中运行线性模型和测试时的名称问题,r,lm,R,Lm,我在尝试将线性模型和waldtest封装到函数中时遇到了一个问题。当您运行wald测试时,它无法再告诉您数据在哪里。当lm和waldtest在同一个函数中,以及lm在一个函数中和waldtest在全局(或不同的函数)环境中时,都会发生这种情况 最小工作示例 在函数内部执行回归和测试时,会出现错误: # Doing Regression inside function reg = function(form, FrameOfData){ Model = lm(formula = form, d

我在尝试将线性模型和
waldtest
封装到函数中时遇到了一个问题。当您运行wald测试时,它无法再告诉您数据在哪里。当
lm
waldtest
在同一个函数中,以及
lm
在一个函数中和
waldtest
在全局(或不同的函数)环境中时,都会发生这种情况

最小工作示例 在函数内部执行回归和测试时,会出现错误:

# Doing Regression inside function
reg = function(form, FrameOfData){
  Model = lm(formula = form, data = FrameOfData)
  print(waldtest(Model))
}
reg(form, FrameOfData = dd)
# Error in is.data.frame(data) : object 'FrameOfData' not found
将上面的waldtest命令更改为
print(waldtest(Model2,data=dd))
也无法返回
#modelUpdate(objects[[i-1]],objects[[i]])中的错误:原始模型属于“lm”类,更新后的模型属于“data.frame”类。

我能找到的一个解决方法是选择一个全局数据帧名称来匹配函数名称(在上面的例子中,在运行
reg
函数之前运行
FrameOfData=dd
),但我不想为我心目中的应用程序这样做

关于堆栈溢出的其他问题 我能找到的最相似的问题是: 当线性回归在全局环境中运行时,不会出现此问题

期望的解决方案 是否仍要运行
lm
命令,然后更改对象的属性以指向全局数据帧的真实名称?否则,是否有方法告诉
waldtest
命令全局数据帧的真实名称?

1)执行。在函数
reg
中调用,将定义
模型的行替换为:

Model <- do.call("lm", list(formula = form, data = FrameOfData))
注意:以上大部分都存在潜在问题。基于(1)和(3a)的以下代码在这种情况下也适用,但所有其他代码的相应代码将失败:

set.seed(123)

rm(x, y, dd, form)

fn <- function() {
    x <- sin(1:100)
    y <- 1 + x + rnorm(100)
    dd = data.frame(x = x, y = y)
    form = "y ~ x"
    reg(form, FrameOfData = dd)
}

reg <- function(form, FrameOfData){
  Model <- do.call("lm", list(formula = form, data = FrameOfData))
  waldtest(Model)
}
fn()
set.seed(123)
rm(x、y、dd、表格)

很好的回答,谢谢。我认为
with
eval
是最好的-
do.call
将整个data.frame复制到模型对象。如果我从函数返回它,它会更大(根据
object.size
)1a)修复
do.call的此问题,那么为什么会出现此问题?这是R的作用域规则。如果复制输入,则不依赖它们。
Model <- do.call("lm", list(formula = form, data = FrameOfData))
Model <- do.call("lm", list(formula = form, data = substitute(FrameOfData)))
Model <- with(FrameOfData, lm(formula = form))
Model <- eval(substitute(lm(formula = form, data = FrameOfData)))
reg <- function(form, FrameOfData) {
  eval(substitute(waldtest(lm(formula = form, FrameOfData)), 
         list(form = form, FrameOfData = FrameOfData)))
}
set.seed(123)

rm(x, y, dd, form)

fn <- function() {
    x <- sin(1:100)
    y <- 1 + x + rnorm(100)
    dd = data.frame(x = x, y = y)
    form = "y ~ x"
    reg(form, FrameOfData = dd)
}

reg <- function(form, FrameOfData){
  Model <- do.call("lm", list(formula = form, data = FrameOfData))
  waldtest(Model)
}
fn()