保存适合的gam对象(mgcv :: gam和scam :: scam)时节省空间

时间:2019-01-10 00:38:29

标签: r gam mgcv

我估计大型数据集上的模型非常简单。公式看起来像

 scam::scam(formula = ratio ~ s(rate,bs="mpi"))

这些模型随后用于生成新数据的预测。我不在乎模型。

我的问题是返回的对象很大(几个GB),这往往会导致下游问题。

我认为这是由于诈骗和赌博会保存每百万条记录的拟合值这一事实。

是否有一种方法只能保存一个包含对新数据进行预测所需的最小值的小对象?这不应超过几千字节。

非常感谢!

edit1 :这是一个可重复的示例,用于说明我对加文答案的理解:

library(mgcv)
data(iris)
library(tidyverse)
mydb <- iris %>% filter(Species == "setosa")

dim(mydb) # 50 records
model <-  mgcv::gam(formula = Sepal.Length ~ s(Sepal.Width,bs="cs"), 
                     data  = mydb)

print(object.size(model), units = "KB") # 78 KB

distinct_mydb <- mydb %>% distinct(Sepal.Width) # 16 distinct values for the independent variables
Xp <- predict(model, newdata= distinct_mydb, type = "lpmatrix")
coefs <- coef(model)
dim(Xp) # 16 records and 10 columns (one for each of the 10 knots of the spline?)
preds1 <- Xp %*% coefs %>% t()  
preds2 <- predict(model, newdata= distinct_mydb)  # preds 1 and preds2 are identical

print(object.size(Xp), units = "KB")   # 3.4 Kb
print(object.size(coefs), units = "KB") # 1.1 Kb

在此解决方案中,我将节省“ Xp”(3.4 Kb)和“ coefs”(1.1Kb),总计4.5 Kb,而不是保存占用78 Kb的“模型”

我不确定下周如何使用Xp和coefs来预测花的Sepal.Length以及从未见过的Sepal.Width为2.5吗?

edit2 :答案是否只是生成所有可能的Sepal.Width(四舍五入到十进制的整数)的网格,并将此表与将来的任何数据一起留给left_join?

fake_db <- data.frame(Sepal.Width = seq(0,max(mydb$Sepal.Width), by = 0.1))
fake_db$predicted_Sepal.Length = predict(model, newdata =  fake_db)
print(object.size(fake_db), units = "KB") # 4.3 Kb

1 个答案:

答案 0 :(得分:1)

查看?mgav:::predict.gam以及自变量type尤其是"lpmatrix"的信息。

例如,您只需要系数向量和

的输出
predict(model, newdata, type = "lpmatrix")`

其中newdata是原始数据的较小子集,但涵盖了协变量的范围。

此选项"lpmatrix"设计为在R的下游或外部使用。一般的想法是,将"lpmatrix"设为Xp,然后Xp %*% coef(model)给出拟合值。但是,由于您可以通过Xp来减小newdata的大小,因此可以减小进行预测所需的对象的尺寸。