自动化 lm() 函数对象未找到错误

Automating the lm() function object not found error

test <- function(y, x)
{
  b <- paste(x, collapse=" + ")
  df.ols <- lm(paste(y," ~ ",b))
  uhatols <- df.ols$res
  c <- paste("uhatols ~ x[1]")
  df.aux2 <- lm(c)
}
x <- data.frame(e=c(1,4,13,2,7,6), f=c(5,9,1,4,3,2))
y <- data.frame(y=c(3,19,1,7,0.2,18))
test(y,x)

我正在尝试自动执行一些 ols 回归。当我 运行 这个公式时,我不断收到错误 Error in eval(expr, envir, enclos) : object 'uhatols' not found (在最后一行)。谁能告诉我为什么?

这就达到了你的目的。请注意我如何在公式中使用 .(这意味着除了 y 值之外的所有变量)以及 lm.

data 参数
test <- function(df, yval = "y") {
  mod1 <- lm(as.formula(sprintf("%s ~ .", yval)), data = df)
  new.df <- data.frame(res = residuals(mod1), 
                       x1 = df[, which.max(names(df) != yval)])
  mod2 <- lm(res ~ x1, data = new.df) 
  mod2
}
x <- data.frame(e=c(1,4,13,2,7,6), f=c(5,9,1,4,3,2))
y <- data.frame(y=c(3,19,1,7,0.2,18))
test(cbind(x, y), "y")
#Call:
#lm(formula = res ~ x1, data = new.df)
#
#Coefficients:
#(Intercept)           x1  
# -5.052e-16    9.185e-17 

将分配给 c 的行更改为:

c <- formula("uhatols ~ x[[1]]")

之所以有效,是因为:

  1. 这会将当前环境与 c 相关联,因此 uhatols 将 在随后的 lm 调用中找到。

  2. 因为x是一个data.frame,x[[1]]指的是第一个 列,而 x[1] 指的是一列数据框,而这些 不是一回事。从这里可以看出关系:

    > identical(x[1], data.frame(e = x[[1]]))
    [1] TRUE
    

注:因为test中的最后一个语句是一个赋值语句如

test(y, x)

不会自动显示其输出,但如果分配了它,它将正确分配:

out <- test(y, x)
out

如果您希望在未分配对 test 的调用时自动显示输​​出,请将 test 正文中的最后一条语句替换为 lm(c)