R:巨大的内存需求将方差结构应用于 nlme 包中的 gls
R: HUGE memory requirement applying variance structure to gls in nlme package
我使用 R 中 nlme
包的 gls
函数创建了一个模型。
然后我尝试使用 weights
参数向模型添加固定方差结构。
但是,我收到一个关于内存分配的错误,这个错误看起来非常极端。
Error in glsEstimate(object, control = control) :
'Calloc' could not allocate memory (18446744073709551616 of 8 bytes)
关于如何处理这个有什么建议吗??
上下文:
我的代码:
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 变量,我已经清除了我的内存,我已经重新启动了我的电脑,等等......似乎没有什么可以降低这个巨大的数字.
是否有可能将这个固定方差结构添加到模型中真的是内存密集型的吗?还是我遗漏了其他事情?...
更新:
根据评论中的要求:
>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")
更新二:
请注意:我尝试对我的数据应用完全不同类型的方差结构,以查看我的计算机如何处理我认为是相对类似的内存密集型过程。
这次我添加了varIdent方差结构:
>vf2 <- varIdent(form = ~ 1 | SPEC)
>lm22 <- update(lm3, . ~ ., weights = vf2)
尽管 运行 花了很长时间(并以收敛错误结束),但它并没有像以前的 varFixed 编码那样立即产生内存分配错误。
解决方案:从方差协变量中删除 0 值
嗯,我仍然不确定 为什么 它正在发生(尽管我假设仔细观察 varFixed
可能会告诉我),但我发现了问题.
有 3 个实例 D = 0。
(更一般地说,变量中有 0 个值(所谓的 方差协变量 ),我试图用它来生成我的固定方差结构)。
一旦我从我的训练数据中删除了这 3 棵具有 0 值的树,模型 运行 就如预期的那样(并且几乎立即)。
[注意:这些树都代表数据收集错误,所以"throw them out"就可以了。
我使用 R 中 nlme
包的 gls
函数创建了一个模型。
然后我尝试使用 weights
参数向模型添加固定方差结构。
但是,我收到一个关于内存分配的错误,这个错误看起来非常极端。
Error in glsEstimate(object, control = control) : 'Calloc' could not allocate memory (18446744073709551616 of 8 bytes)
关于如何处理这个有什么建议吗??
上下文:
我的代码:
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 变量,我已经清除了我的内存,我已经重新启动了我的电脑,等等......似乎没有什么可以降低这个巨大的数字.
是否有可能将这个固定方差结构添加到模型中真的是内存密集型的吗?还是我遗漏了其他事情?...
更新:
根据评论中的要求:
>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")
更新二:
请注意:我尝试对我的数据应用完全不同类型的方差结构,以查看我的计算机如何处理我认为是相对类似的内存密集型过程。
这次我添加了varIdent方差结构:
>vf2 <- varIdent(form = ~ 1 | SPEC) >lm22 <- update(lm3, . ~ ., weights = vf2)
尽管 运行 花了很长时间(并以收敛错误结束),但它并没有像以前的 varFixed 编码那样立即产生内存分配错误。
解决方案:从方差协变量中删除 0 值
嗯,我仍然不确定 为什么 它正在发生(尽管我假设仔细观察 varFixed
可能会告诉我),但我发现了问题.
有 3 个实例 D = 0。
(更一般地说,变量中有 0 个值(所谓的 方差协变量 ),我试图用它来生成我的固定方差结构)。
一旦我从我的训练数据中删除了这 3 棵具有 0 值的树,模型 运行 就如预期的那样(并且几乎立即)。
[注意:这些树都代表数据收集错误,所以"throw them out"就可以了。