簡體   English   中英

保存適合的 gam 對象時節省空間(mgcv::gam 和scam::scam)

[英]Saving space when saving a fitted gam object (mgcv::gam and scam::scam)

我正在一個大型數據集上估計一個非常簡單的模型。 公式看起來像

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

然后使用這些模型來生成對新數據的預測。 我不關心模型的其他任何事情。

我的問題是返回的對象很大(幾 GB),這往往會導致下游出現問題。

我相信這是因為scam 和gam 保存了數百萬條記錄中每條記錄的擬合值。

有沒有辦法只保存一個包含預測新數據所需的最小值的小對象? 這不應大於幾千字節。

非常感謝!

編輯 1 :這是一個可重復的示例,以顯示我對 Gavin 回答的理解:

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 ?

編輯2 :答案是否只是生成所有可能的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

查看?mgav:::predict.gam和參數type的信息,特別是"lpmatrix"

例如,您只需要系數向量和來自

predict(model, newdata, type = "lpmatrix")`

其中newdata是原始數據的一個小得多的子集,但涵蓋了協變量的范圍。

此選項"lpmatrix"設計用於下游或 R 之外。一般的想法是,給定"lpmatrix"作為Xp然后Xp %*% coef(model)給出擬合值。 但是由於您可以通過newdata減少Xp的大小,因此您可以減少預測所需的對象的維度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM