为什么在绘制具有多条曲线的 DRM 模型时使用单一置信区间?
Why single confidence interval when plotting drm model with multiple curves?
我正在使用 drc
包中的 drm
函数在 R 中进行非线性回归。 drm
函数采用 curveid
参数,这使得 drm
拟合多条曲线并将结果存储在单个模型对象中。接下来,我绘制曲线和置信区间。然而,我有一个问题,当模型对象包含多条曲线时,曲线看起来很好,但通常只为第一条曲线绘制置信区间(尽管根据它的 alpha 水平,它似乎已经完成了几次) .
从 drm
提供的示例开始,当我更改输入 curveid
参数的变量名称时,我发现我得到了期望的行为,所有置信区间都出现了——够奇怪的,只有 "CURVE" 有效,没有别的,甚至 "curve" 也不起作用(下面给出了可重现的示例)。这让我觉得 plot.drc 中可能存在错误(class '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
瓦洛,
我可以确认你描述的行为。只有列名 'CURVE' 有效。我厌倦的所有其他名称都不起作用。
我想我已经将此行为跟踪到 plot.drc 函数中 ciFct 子函数的行为(错误?)。
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() 并生成置信区间的函数。请注意,它使用硬编码值 'CURVE' 在第 3 行构建新数据。仅当您在原始数据框中使用 'CURVE' 时才能正常工作——否则无法正常工作。
要解决此问题,您当然可以始终选择列名称 'CURVE'。否则你需要用上面代码的补丁版本替换 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, ...)
}
我正在使用 drc
包中的 drm
函数在 R 中进行非线性回归。 drm
函数采用 curveid
参数,这使得 drm
拟合多条曲线并将结果存储在单个模型对象中。接下来,我绘制曲线和置信区间。然而,我有一个问题,当模型对象包含多条曲线时,曲线看起来很好,但通常只为第一条曲线绘制置信区间(尽管根据它的 alpha 水平,它似乎已经完成了几次) .
从 drm
提供的示例开始,当我更改输入 curveid
参数的变量名称时,我发现我得到了期望的行为,所有置信区间都出现了——够奇怪的,只有 "CURVE" 有效,没有别的,甚至 "curve" 也不起作用(下面给出了可重现的示例)。这让我觉得 plot.drc 中可能存在错误(class '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
瓦洛,
我可以确认你描述的行为。只有列名 'CURVE' 有效。我厌倦的所有其他名称都不起作用。
我想我已经将此行为跟踪到 plot.drc 函数中 ciFct 子函数的行为(错误?)。
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() 并生成置信区间的函数。请注意,它使用硬编码值 'CURVE' 在第 3 行构建新数据。仅当您在原始数据框中使用 'CURVE' 时才能正常工作——否则无法正常工作。
要解决此问题,您当然可以始终选择列名称 'CURVE'。否则你需要用上面代码的补丁版本替换 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, ...)
}