Функция mselect пакета drc не работает внутри функции - PullRequest
0 голосов
/ 01 мая 2018

Я хотел использовать функцию mselec из пакета drc для выбора наилучшей модели набора данных "доза-ответ". Однако mselect не работает, если вы используете его внутри функции.

Работает следующий код:

library(drc)
ryegrass.m1 <- drm(rootl~conc, data = ryegrass, fct = LL.4())

mselect(ryegrass.m1,list(LL.5(), LN.4(), W1.4(), W2.4()))

Но не этот:

best.fit=function(data){  
model1=drm(rootl~conc, data=data, fct=LL.4())
M1=drc::mselect(model1, list(LL.5(), LN.4(), W1.4(), W2.4()))
return(M1)
}

best.fit(ryegrass)

Я думаю, что проблема связана со средами в R, но я не знаю, как это исправить. Кто-нибудь может мне помочь, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Кажется, что функция update в mselect не имеет доступа к исходному кадру данных при запуске изнутри функции. Моим решением было добавить аргумент data в строку 34.

[1]     my_mselect <- function(...
...
[33]    tempObj <- try(update(object, fct = fctList[[i]],
[34]                          data = object$origData),    # <--- line added here
[35]                          silent = TRUE)

Я также заметил, что ссылка на переменные модели также не работает, если вместо их исходных имен используются их относительные позиции, например, при использовании drm(data[, 1] ~ data[, 2], fct = LL.4()). Чтобы избежать этого, вы можете использовать временный фрейм данных в своей функции, установить имена переменных по своему усмотрению и использовать эти имена в вызове drm.

best.fit <- function(data){
  tmp_data <- data
  names(tmp_data) <- c("Var1", "Var2")
  model1 <- drm(Var1 ~ Var2, data = tmp_data, fct = LL.4())
  M1 <- my_mselect(model1, list(LL.5(), LN.4(), W1.4(), W2.4()))
  return(M1)
}
0 голосов
/ 02 мая 2018

Мне удается решить проблему следующим образом:

best.fit=function(data){
  mf <- match.call(expand.dots = FALSE)
  m <- match(c("data"), names(mf), 0L)
  data.name=as.character(mf[m])

  model1=eval(parse(text=paste0('drm(rootl~conc, data=',data.name, ',fct=LL.4())')))
  M1=drc::mselect(model1, list(LL.5(), LN.4(), W1.4(), W2.4()))
  return(M1)
}

best.fit(ryegrass)

Должны быть лучшие способы сделать это, но, по крайней мере, сейчас это работает для меня.

...