Почему один доверительный интервал при построении цифровой модели с несколькими кривыми?

Я делаю нелинейную регрессию в R, используя функцию drm из пакета drc. Функция drm принимает аргумент curveid, что позволяет drm соответствовать нескольким кривым и сохранять результаты в одном объекте модели. Затем я строю кривые и доверительные интервалы. Однако у меня есть проблема, когда объект модели содержит несколько кривых, кривые выглядят нормально, но доверительный интервал часто строится только для первой кривой (хотя по уровню альфа кажется, что это делается несколько раз) .

Начиная с примеров, предоставленных drm, я обнаружил, что получаю желаемое поведение, появляются все доверительные интервалы, когда я меняю имя переменной, подаваемой в аргумент curveid - как ни странно, работает только "КРИВАЯ", больше ничего, даже "кривая" не работает (воспроизводимый пример приведен ниже). Это заставило меня подумать, что, возможно, есть ошибка в plot.drc (метод S3 для класса «drc»), так что «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")

Три графика в виде изображения


person Vallo Varik    schedule 05.12.2017    source источник
comment
Ответ ниже ответил на ваш вопрос? Если да, отметьте этот вопрос как ответ. Спасибо.   -  person Good Eats    schedule 14.12.2017


Ответы (1)


Валло,

Я могу подтвердить описанное вами поведение. Работает только имя столбца «КРИВАЯ». Все остальные названия мне надоело не работают.

Я думаю, что отследил это поведение до поведения (ошибки?) Подфункции ciFct в функции plot.drc.

   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, ...)
    }

Это функция, которая вызывает прогноз() и генерирует доверительные интервалы. Обратите внимание, что он использует жестко запрограммированное значение «КРИВАЯ» для создания новых данных в строке 3. Это работает правильно, только если вы использовали «КРИВУЮ» в исходном фрейме данных. В противном случае он не работает должным образом.

Чтобы исправить это, вы, конечно, всегда можете выбрать имя столбца «КРИВАЯ». В противном случае вам нужно будет заменить функцию 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, ...)
  }
person Good Eats    schedule 06.12.2017
comment
Два практических совета для тех, кто решит изменить имя переменной на CURVE: [1] удобнее всего добавить новую (фиктивную) переменную в ваш data.frame и использовать ее для ввода в drc, это особенно удобно для повторяющихся тестирование нескольких переменных на соответствие, чтобы исходные информативные имена оставались неизменными; [2] переменная CURVE, по-видимому, должна иметь тип double или integer для работы. Пример: dat$CURVE <- as.integer(dat$antibiotic_name) - person Vallo Varik; 15.12.2017