优化在R lm()模型中运行固定效果的时间

问题描述 投票:0回答:1

我正在尝试建立一个回归模型,该模型包括对美国城市的固定影响。我有超过1万亿行和600个城市。下面的代码可以工作,但是速度确实很慢。当为具有多个级别的变量添加一个因子时,有什么方法可以更快地运行模型。

x <- data.frame(
    a = sample( 1:1000, 1000000 , replace=T),
    cityfips = sample( 1:250, 1000000 , replace=T),
    d = sample( 1:4, 1000000 , replace=T)
)

system.time(a1 <- lm( a~cityfips+d  , x ) )
system.time(a2 <- lm( a~as.factor(cityfips) + d  , x ) )

注意,抱歉,因为不清楚,我对as.factor()块特别感兴趣。 @StupidWolf在评论中提供了解决方案。他建议在slm中使用library( SparseM )函数,这要快得多:请参见:

> system.time(a1 <- lm( a~cityfips+d  , x ) )
   user  system elapsed 
   0.22    0.00    0.22 
> system.time(a2 <- lm( a~as.factor(cityfips) + d  , x ) )
   user  system elapsed 
  95.65    0.97   96.62 
> system.time(a3 <- slm( a~as.factor(cityfips) + d  , x ) )
   user  system elapsed 
   4.58    2.06    6.65 
r lm
1个回答
0
投票

[当有很多因素时,在lm()中构造model.matrix将花费大部分时间,一种方法是像glmnet中那样使用sparseMatrix,并且有两个包,sparseMMatrixModels允许lm到sparseMatrix:

set.seed(111)
x <- data.frame(
    a = sample( 1:1000, 1000000 , replace=T),
    cityfips = sample( 1:250, 1000000 , replace=T),
    d = sample( 1:4, 1000000 , replace=T)
)

library(SparseM)
library(MatrixModels)
library(Matrix)

system.time(f_lm <- lm( a~as.factor(cityfips) + d  , x )  )
   user  system elapsed 
 75.720   2.494  79.365  
system.time(f_sparseM <- slm(a~as.factor(cityfips) + d  , x ))
   user  system elapsed 
  5.373   3.952  10.646
system.time(f_modelMatrix <- glm4(a~as.factor(cityfips) + d  ,data=x,sparse=TRUE))
   user  system elapsed 
  1.878   0.335   2.219

我能找到的最接近的是MatrixModels中的glm4,但是您可以看到下面的系数与使用lm的拟合相同:

all.equal(as.numeric(f_sparseM$coefficients),as.numeric(f_lm$coefficients))
[1] TRUE
all.equal(as.numeric(f_lm$coefficients),as.numeric(coefficients(f_modelMatrix)))
[1] TRUE

但是,这两个软件包的作者都警告说它是实验性的,因此与stats::lm相比可能仍然存在一些差异,请仔细检查。

© www.soinside.com 2019 - 2024. All rights reserved.