R中的线性回归没有在内存中复制数据?

R中的线性回归没有在内存中复制数据?,r,memory-management,linear-regression,lm,R,Memory Management,Linear Regression,Lm,进行线性回归的标准方法如下: l <- lm(Sepal.Width ~ Petal.Length + Petal.Width, data=iris) 这些东西占用了大量空间,lm对象最终几乎比原始数据集大一个数量级: R> object.size(iris) 7088 bytes R> object.size(l) 52704 bytes R> ls <- lm(Sepal.Width ~ Petal.Length + Petal.Width, data=ir

进行线性回归的标准方法如下:

l <- lm(Sepal.Width ~ Petal.Length + Petal.Width, data=iris)
这些东西占用了大量空间,
lm
对象最终几乎比原始数据集大一个数量级:

R> object.size(iris)
7088 bytes
R> object.size(l)
52704 bytes
R> ls <- lm(Sepal.Width ~ Petal.Length + Petal.Width, data=iris, model=FALSE, x=FALSE, y=FALSE, qr=FALSE)
R> object.size(ls)
30568 bytes
对于这样小的数据集,这不是问题,但是对于生成450mb
lm
对象的170Mb数据集,这确实是问题。即使所有返回选项都设置为false,lm对象仍然是原始数据集的5倍:

R> object.size(iris)
7088 bytes
R> object.size(l)
52704 bytes
R> ls <- lm(Sepal.Width ~ Petal.Length + Petal.Width, data=iris, model=FALSE, x=FALSE, y=FALSE, qr=FALSE)
R> object.size(ls)
30568 bytes
R>ls对象大小(ls)
30568字节
有没有办法在R中拟合模型,然后能够预测新输入数据的输出值,而无需存储大量多余的不必要数据?换句话说,有没有办法只存储模型系数,但仍然能够使用这些系数对新数据进行预测?


编辑:我想,除了不存储所有多余的数据外,我还真的对使用lm的方法感兴趣,这样它甚至不会计算数据-这只是浪费了CPU时间…

计算预测值所需的
lm
对象的唯一组件是
术语和
系数。但是,如果删除
qr
组件(需要该组件来计算逐项效应和标准误差),则需要将自己的预测函数滚动为
predict.lm
投诉。像这样的事情应该可以

m <- lm(Sepal.Length ~ Petal.Length + Petal.Width, iris)
m$effects <- m$fitted.values <- m$residuals <- m$model <- m$qr <-
     m$rank <- m$assign <- NULL

predict0 <- function(object, newdata)
{
    mm <- model.matrix(terms(object), newdata)
    mm %*% object$coefficients
}

predict0(m, iris[1:10,])
m您可以使用:

biglm
使用的数据量与参数数量成正比:

> object.size(m)
6720 bytes
> d <- rbind(iris, iris)
> m <- biglm(Sepal.Width ~ Petal.Length + Petal.Width, data=d)
> object.size(m)
6720 bytes
>对象大小(m)
6720字节
>d m对象大小(m)
6720字节

biglm
还允许您使用
update
方法使用新的数据块更新模型。使用此选项,还可以在完整数据集不适合内存时估计模型

我认为有两种方法可以解决这个问题:

  • 使用
    lm
    然后修剪脂肪。有关非常好且有启发性的讨论,请参见和。这并不能解决“计算时间”问题
  • 不要使用
    lm
如果您选择第二个选项,您可以轻松地自己编写矩阵运算,以便只获得预测值。如果您喜欢使用固定例程,您可以尝试其他实现最小二乘法的包,例如
RcppArmadillo
-包中的
fastLm
(或其
Eigen
版本,或其他人指出的
biglm
),这些包存储的信息要少得多。使用这种方法有一些好处,例如提供公式接口等<如果您担心计算时间的话,code>fastLm
也相当快

作为比较,这里有一个小基准:

l <- lm(Sepal.Width ~ Petal.Length + Petal.Width, data=iris)
library(biglm)
m <- biglm(Sepal.Length ~ Petal.Length + Petal.Width, iris)
library(RcppArmadillo)
a <- fastLm(Sepal.Length ~ Petal.Length + Petal.Width, iris)

object.size(l)
# 52704 bytes
object.size(m)
# 6664 bytes
object.size(a)
# 6344 bytes

我有没有检查过
bigmemory
软件包和类似的东西?@Alex:没有。我的内存需求没有那么大。我这里说的是<1Gb。见编辑,很好。这对我来说非常有效,谢谢!
l <- lm(Sepal.Width ~ Petal.Length + Petal.Width, data=iris)
library(biglm)
m <- biglm(Sepal.Length ~ Petal.Length + Petal.Width, iris)
library(RcppArmadillo)
a <- fastLm(Sepal.Length ~ Petal.Length + Petal.Width, iris)

object.size(l)
# 52704 bytes
object.size(m)
# 6664 bytes
object.size(a)
# 6344 bytes