为什么在绘制具有多条曲线的drm模型时的单一置信区间?

时间:2017-12-05 18:20:32

标签: r plot non-linear-regression drc

我正在使用drm包中的drc函数在R中进行非线性回归。 drm函数采用curveid参数,这使drm适合多条曲线并将结果存储在单个模型对象中。接下来,我绘制曲线和置信区间。我有一个问题,但是,当模型对象包含多条曲线时,曲线看起来很好,但是通常只为第一条曲线绘制置信区间(尽管通过它的alpha级别,看起来好像已经多次完成)

drm提供的示例开始,我发现我得到了所需的行为,当我将变量的名称更改为curveid参数时,出现所有置信区间 - 奇怪,只有“ CURVE“工作,没有别的,甚至”曲线“不起作用(下面给出了可重现的例子)。这让我觉得plot.drc中可能存在一个错误(类'drc'的S3方法),因此“CURVE”在那里被硬编码。我对源代码进行了观察,但由于我是一名初学R用户并且编程经验不足,所以无法判断它是否属实。

很可能没有错误,我只是遗漏了一些重要的东西。

library(drc)

# create some data
df <- data.frame(
  x=rep(c(0.003, 0.01, 0.03, 1, 3, 10, 100),2),
  y=c(3,3,3,1.5,-2,-3,-3.2, 3.5,3.5,3.2,1,-2.5,-2.8,-2.8),
  CURVE=rep(1:2, each=7)
)

# working as it should
mod1 <- drm(y~x, curveid=CURVE, data=df)
plot(mod1, type="confidence", main="working as it should")

# not working
names(df)[3] <- "curve"
mod2 <- drm(y~x, curveid=curve, data=df)
plot(mod2, type="confidence", main="not working")

# working again
names(df)[3] <- "CURVE"
mod3 <- drm(y~x, curveid=CURVE, data=df)
plot(mod3, type="confidence", main="working again")

Resulting three plots as an image

1 个答案:

答案 0 :(得分:0)

瓦洛,

我可以确认您描述的行为。只有列名称&#39; CURVE&#39;作品。我累的所有其他名字都不起作用。

我想我已经跟踪了plot.drc函数中ciFct子函数的行为(bug?)的这种行为。

   ciFct <- function(level, ...)
    {
        newdata <- data.frame(DOSE=dosePts, CURVE=rep(level, length(dosePts)))
        predictMat <- predict(object, 
                              newdata=newdata,
                              interval = "confidence",
                              level=confidence.level)

        x <- c(dosePts, rev(dosePts))
        y <- c(predictMat[,"Lower"], rev(predictMat[,"Upper"]))
        polygon(x,y, border=NA, ...)
    }

这是调用predict()并生成置信带的函数。请注意,它使用硬编码值&#39; CURVE&#39;在第3行构建新数据。只有在使用&#39; CURVE&#39;在原始数据框中 - 否则无法正常工作。

要解决此问题,您当然可以选择列名称&#39; CURVE&#39;。否则,您需要使用上面代码的修补版本替换plot.drc函数。可以通过将ciFit函数更改为以下来修复代码(注意,只添加了一行):

  ciFct <- function(level, ...)
  {
    newdata <- data.frame(DOSE=dosePts, CURVE=rep(level, length(dosePts)))
    names(newdata)[2] <- object$curveVarNam # this is a new line to fix the bug
    predictMat <- predict(object, 
                          newdata=newdata,
                          interval = "confidence",
                          level=confidence.level)

    x <- c(dosePts, rev(dosePts))
    y <- c(predictMat[,"Lower"], rev(predictMat[,"Upper"]))
    polygon(x,y, border=NA, ...)
  }