由于“预测”以外的原因,“lm”是否返回“模型”

默认情况下, lm设置model = TRUE ,这意味着用于学习的整个数据集将被复制并返回给拟合对象。 这被predict使用,但会产生内存开销(下面的例子)。

我想知道,复制的数据集是用于除predict之外的任何其他原因吗?

不是必须回答的,但我也想知道存储数据的模型,而不是predict

object.size(lm(mpg ~ ., mtcars))
#> 45768 bytes
object.size(lm(mpg ~ ., mtcars, model = FALSE))
#> 28152 bytes

更大的数据集=更大的开销。

动机

为了分享我的动机,twidlr软件包强制用户在使用predict时提供数据。 如果这使得在学习不必要时复制数据集,通过默认为model = FALSE来节省内存似乎是合理的。 我在这里打开了一个相关的问题。

次要的动机 - 你可以很容易地适应许多模型,例如lm和pipelearner,但每次复制数据都会产生大量开销。 所以想方设法减少内存需求将非常方便!


我认为模型框架是为了防止非标准评估而返回的。

我们来看一个小例子。

dat <- data.frame(x = runif(10), y = rnorm(10))
FIT <- lm(y ~ x, data = dat)
fit <- FIT; fit$model <- NULL

有什么区别

model.frame(FIT)
model.frame(fit)

?? 检查methods(model.frame)stats:::model.frame.lm表明,在第一种情况下,模型框架可以从FIT$model高效提取; 而在第二种情况下,它将从fit$callmodel.frame.default重建。 这种差异也会导致两者之间的差异

# depends on `model.frame`
model.matrix(FIT)
model.matrix(fit)

因为模型矩阵是从模型框架构建的。 如果我们进一步挖掘,我们会看到这些也是不同的,

# depends on `model.matrix`
predict(FIT)
predict(fit)

# depends on `predict.lm`
plot(FIT)
plot(fit)

请注意,这是问题所在。 如果我们故意删除dat ,我们不能重建模型框架,那么所有这些都将失败:

rm(dat)
model.frame(fit)
model.matrix(fit)
predict(fit)
plot(fit)

而使用FIT将起作用。


这还不够糟糕。 下面的非标准评估示例非常糟糕!

fitting <- function (myformula, mydata, keep.mf = FALSE) {
  b <- lm(formula = myformula, data = mydata, model = keep.mf)
  par(mfrow = c(2,2))
  plot(b)
  predict(b)
  }

现在让我们再次创建一个数据框(我们先前已经删除了它)

dat <- data.frame(x = runif(10), y = rnorm(10))

你能看到吗?

fitting(y ~ x, dat, keep.mf = TRUE)

工作但是

fitting(y ~ x, dat, keep.mf = FALSE)

失败?

这是我一年前回答/调查的一个问题:R - model.frame()和非标准评估它被要求提供survival包。 这个例子非常极端:即使我们提供newdata ,我们仍然会得到错误。 保留模型框架是继续进行的唯一方法!


最后根据你对内存成本的观察。 事实上, $model并不主要负责潜在的大型lm对象。 $qr是,因为它与模型矩阵具有相同的维数。 考虑一个有很多因素的模型,或者像bsnspoly这样的非线性项,与模型矩阵相比,模型框架要小得多。 所以省略模型帧返回不会减少lm对象的大小。 这实际上是biglm开发的一个动机。


由于我不可避免地提到了biglm ,我会再次强调这种方法仅有助于减少最终的模型对象大小,而不是在模型拟合期间使用RAM。

链接地址: http://www.djcxy.com/p/96497.html

上一篇: Does `lm` return `model` for reasons other than `predict`

下一篇: Not able to delete selected polygon in ui