5

在 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 参数中的变量来解决它,但这似乎很烦人并且被忽视了......

4

2 回答 2

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(...))可以正常工作,然后您可以将新数据框传递给lmor update

于 2019-06-18T22:01:48.953 回答
-1

我不认为这是一个错误。由于公式可以接收函数和运算符,即

log(foo)*3 ~ abs(fooller) + fooz

它无法将调用的对象与带有参数abs(fooller)的函数结果分开。abs()fooller

在我看来,这是命名约定的问题。您不应该将变量或列命名为可能被误解为函数的名称。相反,您可以使用salary.log.

于 2012-04-24T15:51:53.640 回答