model.frame和更新

时间:2012-03-10 21:29:30

标签: r formula lm

在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参数中的变量来绕过它,但这看起来很烦人而且被忽略了......

2 个答案:

答案 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(...))可以正常工作,然后可以将新的数据帧传递到lmupdate