Ошибка при использовании deltaMethod с объектом nls в R

Я пытаюсь использовать deltaMethod в библиотеке car, но получаю странную ошибку.

library(car)
x=c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11)
y=c(-0.78636545259908996, -0.48499513735893701, -0.61035206318152102, -0.60156864486986295, -0.61323703005521701, -0.33091952573467498, -0.269895273193686, -0.32222378534205598, -0.53183084634683997, -0.96631869084439304, -0.77105781684519603, -0.524039870915605, -0.41181303531095498, -0.27581842299642001, -0.72085673574325404, -0.35874718580022702, -0.30752543764527501, -0.090745334342823197, -0.465889655296298, -0.20115970219526799, -0.0511742487116199, 0.0100170907454752, -0.176138595601495, 0.042138062483845398, 0.00081247733328697303, -0.0045220167465173499, 0.57326735553016905, 0.116862163616526, 0.0072264835163109399, 0.48714531471859701, 0.83738659120408598, 0.83740077959237003, 0.48762419789728001, 0.20072016467283199, 0.56916547038663201, 0.14651949468445999, 0.575517323481333, 0.72715907067082697, 0.99958886855260898, 0.36070109242748599, 0.49335611371191601, 0.27098248212991599, 1.28001727666798, 0.36192955257384501)
gdat=data.frame(x,y)
fit=nls(y~a+b*(exp(-exp(s*(x-m)))),data=gdat,start=list(a=-0.5,b=1,s=-0.6,m=5))
deltaMethod(fit,"m-s*log((1/0.05)-1)")

Я получаю сообщение об ошибке: Error in eval(expr, envir, enclos) : object 'ParaParam43' not found

Пытаясь решить эту проблему, я заметил пару вещей:

  • число после ParaParam меняется в зависимости от запрашиваемых параметров
  • он работает с объектами lm, хотя я не пробовал другие поддерживаемые объекты
  • в приведенном выше примере deltaMethod(fit,"m") работает, но ни один из других параметров не работает. Это может быть связано с тем, что только m находится в names(fit). По-видимому, метод по умолчанию использует names(fit) вместо coef(fit) (как и для других типов объектов), поэтому может ли быть так, что метод не распознает fit как объект nls? Нужно ли мне указывать deltaMethod, какой тип объекта ожидать?

Я использовал это некоторое время назад с устаревшим alr3 delta.method без проблем, но теперь он дает ту же ошибку.

У кого-нибудь есть идеи?

Я использую R версии 2.13 и car версии 2.0-10.

Спасибо


r nls
person steiny    schedule 25.07.2011    source источник
comment
Я не могу быть уверен, но код для deltaMethod.default использует eval, что дает высокую вероятность ошибки.   -  person Richie Cotton    schedule 25.07.2011


Ответы (2)


Это ошибка в методе deltaMethod.default, и о ней следует сообщить команде разработчиков R.

Причина ошибки кроется в следующих строках кода:

for (i in seq(along = para.names)) {
    g <- gsub(para.names[i], std.names.ordered[i], g)
}

Этот довольно удивительный способ замены вещей приводит к тому, что все параметры, которые являются именами с любой буквой из Param, заставят код возвращать что-то, что не нужно. Что он должен сделать, так это изменить para.name (в данном случае "s") на "Paramx". Когда он зациклится на нем, он изменит «s» на «Param3», а затем изменит «Param3» на «ParaParam43», поскольку он заменяет «m» на «Param4».

Очевидное решение - переименовать ваши параметры:

library(car)
x=c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11)
y=c(-0.78636545259908996, -0.48499513735893701, -0.61035206318152102, -0.60156864486986295, -0.61323703005521701, -0.33091952573467498, -0.269895273193686, -0.32222378534205598, -0.53183084634683997, -0.96631869084439304, -0.77105781684519603, -0.524039870915605, -0.41181303531095498, -0.27581842299642001, -0.72085673574325404, -0.35874718580022702, -0.30752543764527501, -0.090745334342823197, -0.465889655296298, -0.20115970219526799, -0.0511742487116199, 0.0100170907454752, -0.176138595601495, 0.042138062483845398, 0.00081247733328697303, -0.0045220167465173499, 0.57326735553016905, 0.116862163616526, 0.0072264835163109399, 0.48714531471859701, 0.83738659120408598, 0.83740077959237003, 0.48762419789728001, 0.20072016467283199, 0.56916547038663201, 0.14651949468445999, 0.575517323481333, 0.72715907067082697, 0.99958886855260898, 0.36070109242748599, 0.49335611371191601, 0.27098248212991599, 1.28001727666798, 0.36192955257384501)
gdat=data.frame(x,y)
fit=nls(y~d+b*(exp(-exp(s*(x-k)))),data=gdat,start=list(d=-0.5,b=1,s=-0.6,k=5))
deltaMethod(fit,"k-s*log((1/0.05)-1)")

проходит без ошибок.

person Joris Meys    schedule 25.07.2011
comment
Примечание: Об этом сообщается авторам пакета автомобиля. - person Joris Meys; 25.07.2011
comment
Интересный баг. Спасибо за отладку и отчет - person steiny; 26.07.2011

Вау, это была забавная ошибка, которую нужно было отследить...

Если вы посмотрите в deltaMethod.default, вы увидите, что он меняет имена параметров на такие вещи, как «Param1», используя gsub:

g <- gsub(para.names[i], std.names.ordered[i], g)

в петле. Поскольку у вас есть параметр с именем «m», вы получаете двойную замену, поскольку в «Param1» есть «m»! Это объясняет ошибку, которую вы получаете. Изменение вашего параметра с «m» на «z» позволило запустить код для меня.

Я предлагаю связаться с автором пакета с этой информацией.

person joran    schedule 25.07.2011
comment
См. packageDescription("car") контактную информацию автора. - person Richie Cotton; 25.07.2011