Ошибка использования deltaMethod с объектом nls в R - PullRequest
4 голосов
/ 25 июля 2011

Я пытаюсь использовать 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

Спасибо

Ответы [ 2 ]

6 голосов
/ 25 июля 2011

Это ошибка в методе 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)")

работает без ошибок.

4 голосов
/ 25 июля 2011

Ух, это была забавная ошибка, чтобы выследить ...

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

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

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

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

...