运行线性模型和函数环境中的waldtest时的命名问题

Name Problems when running linear model and waldtest in function environment

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

最小工作示例

# Loading Packages
library(lmtest)
# Loading Data
x <- sin(1:100)
y <- 1 + x + rnorm(100)
dd = data.frame(x = x, y = y)
form = "y ~ x"

当我在函数外进行回归和 waldtest 时没有问题:

# Doing Regression outside function
Model1 = lm(formula = form, data = dd)
waldtest(Model1)

当我在函数内部进行回归和 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))也不成功返回# Error in modelUpdate(objects[[i - 1]], objects[[i]]) : original model was of class "lm", updated model is of class "data.frame"

我能找到的一个解决方法是选择一个全局数据框名称来匹配函数名称(在上述情况下 运行 FrameOfData = dd 在 运行ning reg 之前功能),但我不想为我想到的应用程序执行此操作。

关于 Stack Overflow 的其他问题

我能找到的最相似的问题是这个: Regression with Heteroskedasticity Corrected Standard Errors 由于线性回归在全球环境中 运行 而不会出现此问题。

期望的解决方案

是否有 运行 lm 命令,然后更改对象的属性以指向全局数据框的真实名称?否则有没有办法告诉 waldtest 命令全局数据帧的真实名称?

1) do.call 在函数 reg 中将定义 Model 的行替换为:

Model <- do.call("lm", list(formula = form, data = FrameOfData))

1a) 变体:

Model <- do.call("lm", list(formula = form, data = substitute(FrameOfData)))

2) 与 或者,这会起作用:

Model <- with(FrameOfData, lm(formula = form))

3) eval 另一种可能性是这样的:

Model <- eval(substitute(lm(formula = form, data = FrameOfData)))

虽然使用 eval 往往不受欢迎。

3a) 这是一个变体:

reg <- function(form, FrameOfData) {
  eval(substitute(waldtest(lm(formula = form, FrameOfData)), 
         list(form = form, FrameOfData = 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()