我想使用drc包中的mselec函数来选择剂量反应数据集的最佳模型。但是,如果在函数内部使用mselect,则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中的环境有关,但我不知道如何修复它。有人可以帮我吗?
答案 0 :(得分:0)
我设法像这样解决问题:
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)
应该有更好的方法来做到这一点,但至少它现在适用于我。
答案 1 :(得分:0)
从函数内部运行时,update
中的mselect
函数似乎无法访问原始数据帧。我的解决方案是在第34行添加一个data
参数。
[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)
}