Вызовите аргумент функции, хранящийся в списке - PullRequest
0 голосов
/ 17 февраля 2020

Мне нужно протестировать набор условий аргумента, чтобы найти лучшую модель (используя пакет drc). То есть я хотел бы сохранить аргументы функции в списке и затем вызвать их в функцию drm(). В пакете drc есть функция (mselect()) для этого, но известно, что он не работает по неизвестным причинам (https://www.reddit.com/r/Rlanguage/comments/a1bu44/any_idea_what_im_doing_wrong_with_the_mselect/).


Пример данных

library(drc) # This also loads in the S.alba data
data(S.alba)

head(S.alba)
  Dose  Herbicide DryMatter
1    0 Glyphosate       4.7
2    0 Glyphosate       4.6
3    0 Glyphosate       4.1
4    0 Glyphosate       4.4
5    0 Glyphosate       3.2
6    0 Glyphosate       3.0

Неудачная попытка

# List of function arguments to be assessed e.g. drm(...fct = W1.4(fixed = c(NA, 0.1, NA, NA)
model_list <- list(curve = c(W1.4(fixed = c(NA, 0.1, NA, NA)),
                             LL.4(fixed = c(NA, 0.1, NA, NA))))

# Failed function, attempting to return a list of results
model_select <- function(data, mlist){
    model =  data %>%
        drm(DryMatter ~ Dose, Herbicide, data = . , fct = mlist)
    metric = AIC(model)
    return(metric)
}
model_select(data = S.alba, mlist = model_list)

Ошибка в drm (DryMatter ~ Dose, Herbicide, data = ., fct = mlist): Первая запись в списке, чтобы 'fct' НЕ являлась функцией

Полуработающая попытка

model_select_2 <- function(data){
    model =  data %>%
        drm(DryMatter ~ Dose, Herbicide, data = . , fct = W1.4(fixed = c(NA, 0.1, NA, NA)))
    metric = AIC(model)
    return(metric)
}
model_select_2(data = S.alba)

model_select_2(data = S.alba)
[1] 106.9226

желаемый выход

model_select(data = S.alba, mlist = model_list)
[1] W1.4-106.9226
[2] LL.4-99.54702

1 Ответ

1 голос
/ 17 февраля 2020

Часть проблемы в том, как вы создаете model_list. Вы хотите объединить эти значения с list() вместо c(). Последний пытался объединить их в один и тот же объект.

Следующее, что вы можете сделать, это sapply по списку кривых, чтобы получить результат для каждого входа. Рабочий пример будет

model_list <- list(curve = list(W1.4(fixed = c(NA, 0.1, NA, NA)),
                             LL.4(fixed = c(NA, 0.1, NA, NA))))
model_select <- function(data, mlist){
   sapply(mlist$curve, function(curve){
      model <- drm(DryMatter ~ Dose, Herbicide, data = data , fct = curve)
      metric = AIC(model)
   })
}
model_select(data = S.alba, mlist = model_list)
# [1] 106.92259  99.54702
...