首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中使用带有nls对象的deltaMethod时出错

在R中使用带有nls对象的deltaMethod时出错
EN

Stack Overflow用户
提问于 2011-07-25 14:05:46
回答 2查看 790关注 0票数 4

我试图在deltaMethod库中使用car,但是我得到了一个奇怪的错误。

代码语言:javascript
复制
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")工作,但其他参数都不起作用。这可能是因为只有mnames(fit)中。显然,默认方法使用的是names(fit)而不是coef(fit) (对于其他类型的对象),那么该方法是否没有将fit识别为nls对象呢?我需要告诉deltaMethod预期的对象类型吗?

我以前在现在不推荐的alr3 delta.method中使用了它,没有问题,但是现在它也会出现同样的错误。

有人有什么想法吗?

我使用的是R版本2.13和car版本2.0-10

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-25 14:35:27

这是deltaMethod.default方法中的一个错误,应该向R开发团队报告。

出现此错误的原因在于代码中的以下几行:

代码语言:javascript
复制
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”。

显而易见的解决方案是重命名参数:

代码语言:javascript
复制
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)")

无错误地运行。

票数 6
EN

Stack Overflow用户

发布于 2011-07-25 14:34:29

哇,追踪到这是个有趣的虫子.

如果您查看deltaMethod.default,您将看到它使用gsub将参数的名称更改为“Param1”之类的内容

代码语言:javascript
复制
g <- gsub(para.names[i], std.names.ordered[i], g)

在一个循环中。因为您有一个名为“m”的参数,所以在'Param1‘中有一个'm’!这解释了你所犯的错误。将参数从“m”更改为“z”允许代码为我运行。

我建议将此信息与包作者联系。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6817372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档