0

使用 glmmTMB 建模生成的建模对象在保存到 RDS 后由于其大小而变得难以处理。

为 lm 对象建议的另一个线程这个问题是由环境属性引起的,这些属性在保存这些对象时似乎是随手可得的,但当然这些建模对象的结构不同。
saveRDS 膨胀对象的大小

更新:在进行更多挖掘时,我发现了这个线程,其中似乎 saveRDS refhook 参数可能有助于防止将环境写入对象,但我不明白这个参数是如何工作的或如何构建重新挂钩功能。

这是一个可重现的小示例,演示了对象在将其保存到 RDS 后如何增长(大约 100 kb)。然而,在更大的模型中,我运行的大小从 2 MB 膨胀到超过 1 GB。

# data frame from dput
DF <- structure(list(loc = c("300", "300", "300", "300", "300", "300", 
                             "301", "301", "301", "301", "301", "302", "302", "302", "302", 
                             "302", "302", "303", "303", "304", "304", "304", "305", "305", 
                             "307", "307", "308", "308", "309", "309", "310", "310", "312", 
                             "313", "315", "317", "318", "319"), num_pts = c(100L, 100L, 100L, 
                                                                             100L, 100L, 100L, 100L, 100L, 100L, 100L, 100L, 100L, 100L, 100L, 
                                                                             100L, 100L, 100L, 100L, 100L, 100L, 100L, 100L, 100L, 100L, 100L, 
                                                                             100L, 100L, 100L, 100L, 100L, 100L, 100L, 100L, 100L, 100L, 100L, 
                                                                             100L, 100L), n = c(0, 1, 1, 0, 5, 1, 7, 5, 4, 2, 15, 1, 0, 1, 
                                                                                                5, 5, 8, 4, 2, 5, 10, 6, 14, 10, 9, 10, 7, 10, 0, 0, 14, 16, 
                                                                                                0, 0, 6, 2, 10, 2), yr = structure(c(27L, 28L, 29L, 30L, 31L, 
                                                                                                                                     32L, 27L, 28L, 29L, 30L, 31L, 27L, 28L, 29L, 30L, 31L, 32L, 27L, 
                                                                                                                                     31L, 27L, 31L, 32L, 27L, 31L, 28L, 32L, 28L, 32L, 28L, 32L, 28L, 
                                                                                                                                     32L, 29L, 29L, 29L, 29L, 30L, 30L), .Label = c("1984", "1985", 
                                                                                                                                                                                    "1986", "1987", "1988", "1990", "1993", "1994", "1995", "1996", 
                                                                                                                                                                                    "1997", "1998", "1999", "2000", "2001", "2002", "2003", "2004", 
                                                                                                                                                                                    "2005", "2006", "2007", "2008", "2009", "2010", "2011", "2012", 
                                                                                                                                                                                    "2013", "2014", "2015", "2016", "2017", "2018"), class = "factor"), 
                     var = c(154.341666666667, 154.341666666667, 154.341666666667, 
                             154.341666666667, 154.341666666667, 154.341666666667, 149.208333333333, 
                             149.208333333333, 149.208333333333, 149.208333333333, 149.208333333333, 
                             136.025, 136.025, 136.025, 136.025, 136.025, 136.025, 150.125, 
                             150.125, 169.375, 169.375, 169.375, 156.891666666667, 156.891666666667, 
                             148.716666666667, 148.716666666667, 150.533333333333, 150.533333333333, 
                             155.2, 155.2, 150.033333333333, 150.033333333333, 152.275, 
                             155.266666666667, 155.7, 149.358333333333, 146.925, 147.575
                     )), row.names = 1912:1949, class = "data.frame")

# form model
model <- as.formula("cbind(n, num_pts - n) ~ var + (1 | yr) + (1 | loc)")

# fit
fit <- 
  glmmTMB::glmmTMB(model,
                   family = "betabinomial",
                   data=DF)


pryr::object_size(fit)  # 530kb

saveRDS(fit, "fit.rds")

fit2 <- readRDS("fit.rds")

pryr::object_size(fit2) # 640kb

谢谢

4

0 回答 0