gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 05:12:59 24 4
gpt4 key购买 nike

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

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

然后使用这些模型为新数据生成预测。我不关心模型的任何其他内容。

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

我相信这是因为 scam 和 gam 保存了数百万条记录中每条记录的拟合值。

有没有办法只保存一个包含预测新数据所需的最小对象的小对象?这不应大于几千字节。

非常感谢!

edit1:这里有一个可重现的例子来展示我对 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 和系数来预测 Sepal.Length 之前从未见过的 Sepal.Width 为 2.5 的花?

edit2:答案是否简单地生成所有可能的 Sepal.Width 的网格(四舍五入到某个小数点),然后将此表与任何 future 数据左连接?

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 的大小,因此您可以减少预测所需对象的维数。

关于r - 保存适合的 gam 对象时节省空间(mgcv::gam 和 scam::scam),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54120491/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com