在R中,您可能估计了一个带有对数变换因变量的模型:
mfit <- lm(
formula = log(salary) ~ yrs.service + yrs.since.phd,
data = Salaries
)
然后您可能想要更改模型框架并调用更新以重新安装模型:
n <- nrow(Salaries)
mfr <- model.frame(mfit)[sample(1:n, size=n, replace=TRUE),]
mfit2 <- update(mfit, data = mfr)
这会导致错误:
Error in eval(expr, envir, enclos) : object 'salary' not found
原因是公式仍然具有因变量log(salary)
,并且模型框架中的变量称为log(salary)
。 R认为它可以找到salary
,然后在其上调用log
。没有重新采样会发生同样的错误,这个例子只是说明了为什么人们可能想要这样做。
上述过程来自一个引导程序包,其中执行重新采样行。这种行为是预期的,还是一个错误?我知道可以通过转换data参数中的变量来绕过它,但这看起来很烦人而且被忽略了......
答案 0 :(得分:0)
我不认为这是一个错误。由于该公式可以接收函数和运算符,即
log(foo)*3 ~ abs(fooller) + fooz
它无法将函数abs(fooller)
的对象与函数abs()
的结果与参数fooller
分开。
在我看来,这是命名约定的问题。您不应将变量或列命名为可被误解为函数的名称。相反,您可以使用salary.log
。
答案 1 :(得分:0)
您可以从model.frame(mfit)
进行采样,而不是从na.omit(get_all_vars(myformula, Salaries))
进行采样。因此,您的示例将如下所示:
myformula <- log(salary) ~ yrs.service + yrs.since.phd
mfit <- lm(formula = myformula, data = Salaries)
n <- nrow(Salaries)
newdata <- na.omit(get_all_vars(myformula, Salaries))[sample(1:n, size=n, replace=TRUE),]
mfit2 <- update(mfit, data = newdata)
我们可以使用以下简单示例来确认model.frame(myformula, df)
和na.omit(get_all_vars(myformula, df))
从数据帧中选择相同的原始(未转换)数据:
df <- data.frame(w = rnorm(10), x = rnorm(10), y = rnorm(10), z = rnorm(10))
df[1, 1] <- NA
df[2, 2] <- NA
df[3, 3] <- NA
df[4, 4] <- NA
identical(data.frame(na.omit(get_all_vars(z ~ w + x, df))), data.frame(model.frame(z ~ w + x, df)))
# [1] TRUE
请注意,我将na.omit(get_all_vars(...))
和model.frame(...)
的结果包装在data.frame
中只是为了删除多余的属性以进行比较。当然,model.frame
可以完成其他工作,例如您的示例中的日志转换薪水。但是,如果您需要做的只是对原始数据进行采样,那么na.omit(get_all_vars(...))
可以正常工作,然后可以将新的数据帧传递到lm
或update
。