我有一个大型数据集,其中包含70k +行和几列具有可变数据。另外,我也有一列我需要使用超过5000个因素。
有什么方法可以加快回归速度,因为当前运行需要40分钟以上的时间。我认为我加快速度的唯一方法是,我可以仅将测试数据中的因素过滤到训练数据中,或者使用data.table并从中运行reg。
任何帮助将不胜感激。
library(dbplyr)
library(dplyr)
library(data.table)
library(readr)
greys <- read_excel("Punting'/Dogs/greys.xlsx", sheet = 'Vic')
greys$name<- as.factor(greys$name)
ggtrain<- tail(greys,63000)
gtrain<- head(ggtrain, -190)
gtest1<- tail(ggtrain,190)
gtest<- filter(gtest1, runnum >5)
#mygrey<- gam(gtrain$time~ s(name, bs='fs')+s(box)+s(distance),data = gtrain,method = 'ML')
mygrey<- lm(gtrain$margin~name+box+distance+trate+grade+trackid, data = gtrain)
pgrey<- predict(mygrey,gtest)
gdf<- data.frame(gtest$name,pgrey)
#gdf
write.csv(gdf,'thedogs.csv')```
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 63000 obs. of 25 variables:
$ position: num 4 5 6 7 1 2 3 4 5 6 ...
$ box : num 3 10 5 8 3 7 9 5 2 4 ...
$ name : Factor w/ 5903 levels "AARON'S ME BOY",..: 4107 2197 3294 3402 4766 4463 5477 274 5506 2249 ...
$ trainer : chr "Marcus Lloyd" "Ian Robinson" "Adam Richardson" "Nathan Hunt" ...
$ time : num 22.9 23 23.1 23.5 22.5 ...
$ margin : num 7.25 8.31 9.96 15.33 0 ...
$ split : num 9.17 8.98 9.12 9.14 8.62 8.73 8.8 8.99 9.04 9.02 ...
$ inrun : num 75 44 56 67 11 22 33 54 76 67 ...
$ weight : num 27.9 26.2 30.3 27.7 26.5 31.5 34.1 32.8 31.2 34 ...
$ sire : chr "Didda Joe" "Swift Fancy" "Barcia Bale" "Hostile" ...
$ dam : chr "Hurricane Queen" "Ulla Allen" "Diva's Shadow" "Flashing Bessy" ...
$ odds : num 20.3 55.5 1.6 33.2 1.6 5 22.6 7.9 12.5 9.9 ...
$ distance: num 390 390 390 390 390 390 390 390 390 390 ...
$ grade : num 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 ...
$ race : chr "Race 11" "Race 11" "Race 11" "Race 11" ...
$ location: chr "Ballarat" "Ballarat" "Ballarat" "Ballarat" ...
$ date : chr "Monday 5th of August 2019" "Monday 5th of August 2019" "Monday 5th of August 2019" "Monday 5th of August 2019" ...
$ state : chr "vic" "vic" "vic" "vic" ...
$ trate : num 0.515 0.376 0.818 0.226 0.55 ...
$ espeed : num 75 44 56 67 11 22 33 54 76 67 ...
$ trackid : num 3 3 3 3 3 3 3 3 3 3 ...
$ runnum : num 4 6 3 2 2 2 3 4 2 4 ...
$ qms : chr "M/75" "M/44" "M/56" "M/67" ...
由于name
变量,您的回归拟合缓慢。将一个因子与5903级别拟合将为您的设计矩阵添加5903列-就像尝试对5903个单独的变量进行拟合。
您的设计矩阵将具有63000x5908的尺寸,其中一个将占用大量内存,而第二个将使lm
努力工作以产生其估计值(因此需要40分钟的拟合时间)。
您有几种选择:
lm
)name
变量,在这种情况下,lm
将几乎立即适合name
或其他程序包,将lmer
作为随机效果来拟合混合效果模型。 lmer
特别针对随机效应使用稀疏设计矩阵,这是因为每个观察结果只能具有5903个名称之一(因此,大多数矩阵为空)。在这三个选项中,第三个选项可能是最原则的方法。随机效应将解释观察结果之间个体水平的差异,并且还会汇总不同个体之间的信息,以帮助更好地估计没有大量观察结果的狗。最重要的是,得益于稀疏的设计矩阵,它可以快速进行计算。
您的数据集的简单模型可能看起来像这样:
library(lme4) ## read data mygrey <- lmer(gtrain$margin~(1|name)+box+distance+trate+grade+trackid, data = gtrain)
如果您想走这条路,我建议您阅读更多有关混合效果模型的信息,以便您可以选择对数据有意义的模型结构。这里有两个很好的资源:
lmer