我正在尝试建立一个回归模型,该模型包括对美国城市的固定影响。我有超过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
[当有很多因素时,在lm()
中构造model.matrix将花费大部分时间,一种方法是像glmnet
中那样使用sparseMatrix,并且有两个包,sparseM
,MatrixModels
允许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
相比可能仍然存在一些差异,请仔细检查。