自动化 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]]")
之所以有效,是因为:
这会将当前环境与 c
相关联,因此 uhatols
将
在随后的 lm
调用中找到。
因为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)
。
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]]")
之所以有效,是因为:
这会将当前环境与
c
相关联,因此uhatols
将 在随后的lm
调用中找到。因为
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)
。