2016-10-18 14 views
2

Я создал модель, используя gls функцию nlme пакета в R. тогда я пытался добавить фиксированную структуру дисперсии в модель с использованием weights аргумента.Р: ОГРОМНО требование к памяти нанесение дисперсии структура GLS в nlme пакета

Однако, я получаю сообщение о распределении памяти, которое просто кажется, ну, экстремальным.

Ошибка в glsEstimate (объект управления = контроль): '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 непосредственно (vs. update), я поместил varFixed в и внешней модели называют себя, я creatd в нВт переменную для D^2 до модели вызов, я очистил свою память, перезапустил компьютер и т. д. Ничто, кажется, не привело к тому, что это ОГРОМНОЕ число.

Возможно ли, что добавление этой фиксированной структуры дисперсии к модели действительно - это то, что интенсивная память? Или, возможно, что-то еще здесь, что я пропускаю ...


UPDATE:

Как было предложено в комментариях:

>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") 

Update 2:

Просто для того, чтобы отметить: я попытался применить к моим данным совершенно другой тип структуры дисперсий, чтобы увидеть, как мой компьютер обрабатывает то, что я предположил бы относительно похожей на интенсивную память процедуру.

  • На этот раз я добавил varIdent структуру дисперсии:

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

Хотя он принял навсегда бежать (и в конечном итоге с ошибкой конвергенции), она не сразу производить памяти-распределение как предыдущее кодирование varFixed.

+0

Вы также можете включить вывод 'traceback()' и, если возможно, 'dput (head (mod, 5))', чтобы заглянуть в структуру данных – OdeToMyFiddle

+0

@Osssan: см. Обновление. Я добавил вывод как из 'traceback', так и' dput'. – theforestecologist

+0

Попробуйте, что произойдет, если вместо этого странного взаимодействия между линейным и квадратичным эффектом той же переменной вы используете ортогональный многочлен третьей степени (см. Полифункцию). Ваша модель не кажется очень разумной. – Roland

ответ

1

РЕШЕНИЕ: Удалить 0-значения из дисперсии ковариата

Ну, я до сих пор не уверен, почему это происходит (хотя я предполагаю, что пристальный взгляд на varFixed может сказать мне), но я нашел проблему.

Были 3 случаев, в которых D = 0.

(В более общем плане, было 0 значения в переменном (так называемой дисперсии ковариатом) Я пытался использовать, чтобы генерировать свою фиксированную структуру дисперсии) ,

Как только я удалил эти 3 дерева с 0-значеними из моих данных обучения, модель бежала как ожидалось (и почти сразу).

[Примечание: эти деревья представляют собой ошибки сбора данных, поэтому было нормально «выбросить их»].

+0

ОК, поэтому вы назначили бесконечные веса. – Roland

 Смежные вопросы

  • Нет связанных вопросов^_^