【问题标题】:R: HUGE memory requirement applying variance structure to gls in nlme packageR:将方差结构应用于 nlme 包中的 gls 的巨大内存需求
【发布时间】:2016-10-18 03:46:44
【问题描述】:

我使用 R 中 nlme 包的 gls 函数创建了一个模型。 然后我尝试使用weights 参数向模型添加固定方差结构。

但是,我收到了一个关于内存分配的错误,看起来非常极端。

glsEstimate(object, control = control) 中的错误: 'Calloc' 无法分配内存(18446744073709551616,共 8 个字节)

关于如何处理此问题的任何建议?


上下文:

  • 我的代码:

    mod <- read.csv('mod.ht.dat.csv', head = T)
    dim(mod)
    [1] 90826     8
    
    library(nlme)
    lm3 <- gls(HT ~ D * I(D^2), data = mod, na.action = na.omit, method = 'ML')
    vf1Fixed <- varFixed(~D)
    lm2 <- update(lm3, . ~ ., weights = vf1Fixed)
    Error in glsEstimate(object, control = control) : 
      'Calloc' could not allocate memory (18446744073709551616 of 8 bytes)
    

    -- 注意:模型格式来自Zuur et al. (2009)

  • 我的内存使用情况(使用来自here 的代码)和内存限制:

    > lsos()
                     Type     Size    PrettySize  Rows Columns
    lm3               gls 12361512 [1] "11.8 Mb"    16      NA
    mod.ht.dat data.frame  4002768  [1] "3.8 Mb" 90826       8
    vf1Fixed     varFixed     1024    [1] "1 Kb"     0      NA
    
    > memory.limit()
    [1] 8182
    
  • 会话信息:

    R version 3.3.1 (2016-06-21)
    Platform: x86_64-w64-mingw32/x64 (64-bit)
    Running under: Windows 7 x64 (build 7601) Service Pack 1
    

对于我正在做的事情,必要的分配内存似乎高得离谱。

我已经通过直接使用gls 修改了代码(与update 相比),我已经将varFixed 放在了模型调用本身之外,我已经创建了在模型调用之前 D^2 的一个 nw 变量,我已经清除了我的内存,我已经重新启动了我的计算机,等等......似乎没有什么能让这个巨大的数字下降。

是否有可能将这个固定方差结构添加到模型中真的会占用大量内存吗?还是我错过了这里发生的其他事情?...


更新

根据 cmets 的要求:

>traceback()

8: glsEstimate(object, control = control)
7: Initialize.glsStruct(glsSt, dataMod, glsEstControl)
6: Initialize(glsSt, dataMod, glsEstControl)
5: gls(model = HT ~ D + I(D^2) + D:I(D^2), data = mod, method = "ML", 
   na.action = na.omit, weights = vf1Fixed)
4: eval(expr, envir, enclos)
3: eval(call, parent.frame())
2: update.gls(lm3, . ~ ., weights = vf1Fixed)
1: update(lm3, . ~ ., weights = vf1Fixed)

>dput(head(mod,5))

structure(list(HT = c(3.7, 8.7, 10.1, 4, 8.7), SPEC = structure(c(53L, 
53L, 53L, 53L, 53L), .Label = c("ACBA", "ACER", "ACRU", "AESY", 
"AIAL", "ALJU", "AMAR", "BENI", "CACA", "CACO", "CACR", "CAFL", 
"CAGL", "CAOL", "CAOV", "CAPA", "CARY", "CATO", "CECA", "CELA", 
"CEOC", "CHVI", "COFL", "CRAT", "CRMA", "DIVI", "ELPU", "ELUM", 
"EUAM", "FAGR", "FRAX", "GLTR", "HAVI", "ILAM", "ILDE", "ILOP", 
"JUNI", "JUVI", "LIBE", "LIJA", "LISI", "LIST", "LITU", "LOMA", 
"MAGR", "MATR", "MORU", "NYSY", "OSVI", "OXAR", "PATO", "PIEC", 
"PITA", "PIVI", "PLOC", "PRSE", "QUAL", "QUCO", "QUER", "QUFA", 
"QULY", "QUMA", "QUPH", "QURG", "QURU", "QUST", "QUVE", "RHCO", 
"SAAL", "STGR", "ULAL", "ULAM", "ULRU", "UNKN", "VAAR", "VACC", 
"VACO", "VAST", "VIAC", "VIBR", "VIPR", "VIRA", "VIRU"), class = "factor"), 
    D = c(4.1, 6.9, 7.4, 6.9, 13.7), plot = c(4L, 4L, 4L, 4L, 
    4L), tree_age = c(9L, 13L, 16L, 9L, 13L), Year = c(1933L, 
    1937L, 1940L, 1933L, 1937L), StaticLineID = c(1L, 1L, 1L, 
    2L, 2L), D2 = c(16.81, 47.61, 54.76, 47.61, 187.69)), .Names = c("HT", 
"SPEC", "D", "plot", "tree_age", "Year", "StaticLineID", "D2"
), row.names = c(NA, 5L), class = "data.frame")

更新 2:

请注意:我尝试将完全不同类型的方差结构应用于我的数据,以查看我的计算机如何处理我认为相对相似的内存密集型过程。

  • 这次我添加了 varIdent 方差结构:

    >vf2 <- varIdent(form = ~ 1 | SPEC)
    >lm22 <- update(lm3, . ~ ., weights = vf2)
    

虽然它运行了很长时间(并最终导致收敛错误),但它并没有像以前的 varFixed 编码那样立即产生内存分配错误。

【问题讨论】:

  • 您能否还包括traceback()dput(head(mod,5)) 的输出以一窥数据结构
  • @Osssan :查看更新。我添加了来自tracebackdput 的输出。
  • 试试如果你使用三次正交多项式(见 poly 函数)而不是同一变量的线性和二次效应之间的这种奇怪的相互作用会发生什么。您的模型似乎不太明智。
  • @Roland:即使我删除了线性和二次效应之间的“交互”,我仍然会得到同样的错误。
  • 你能提供一个可重现的例子吗?我不认为没有答案你会得到答案。

标签: r memory memory-management variance nlme


【解决方案1】:

解决方案:从方差协变量中删除 0 值

好吧,我仍然不确定为什么会发生这种情况(尽管我假设仔细查看 varFixed 可能会告诉我),但我发现了问题。

有 3 个实例 D = 0。

(更一般地说,变量中有 0 个值(所谓的方差协变量)我试图用来生成我的固定方差结构)。

一旦我从训练数据中删除了这 3 棵值为 0 的树,模型就会按预期运行(并且几乎立即)。

[注意:这些树都代表数据收集错误,所以“扔掉”是可以的]。

【讨论】:

  • 好的,所以你已经分配了无限权重。
猜你喜欢
  • 1970-01-01
  • 2010-11-26
  • 2018-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
  • 2021-02-12
相关资源
最近更新 更多