&引用;“未找到对象”;内部功能:nlmer版本

&引用;“未找到对象”;内部功能:nlmer版本,r,function,lme4,R,Function,Lme4,在过去的几个小时里,我在这里发现了几个关于R脚本的问题,该脚本在函数外部工作正常,但一旦代码被重构为包含函数,就会为参数返回“object not found”错误。不幸的是,这些错误的解决方案似乎是高度包和上下文特定的,因此我不得不将自己的、nlmer特定的问题投入到这场争论中 总之:我想多次运行nlmer模型,但每次都有一个稍微不同的模型规范。我已经确保模型在任何函数之外都能按照指定的方式工作。我编写了一个函数,它接受data.table和公式(以字符串形式)并运行模型,但它返回一个错误,即

在过去的几个小时里,我在这里发现了几个关于R脚本的问题,该脚本在函数外部工作正常,但一旦代码被重构为包含函数,就会为参数返回“object not found”错误。不幸的是,这些错误的解决方案似乎是高度包和上下文特定的,因此我不得不将自己的、nlmer特定的问题投入到这场争论中

总之:我想多次运行nlmer模型,但每次都有一个稍微不同的模型规范。我已经确保模型在任何函数之外都能按照指定的方式工作。我编写了一个函数,它接受data.table和公式(以字符串形式)并运行模型,但它返回一个错误,即我的模型公式“未找到”,即使“model_formula”变量肯定位于函数的命名空间中

例如:

# set up toy dataset
data <- data.table(patient_id=c(rep("pat_1", 10), rep("pat_2", 10), rep("pat_3", 10)),
                   agesero=c(rep(25,10), rep(19, 10), rep(34, 10)))
data$row <- as.numeric(rownames(data))
data[, variable:= ifelse(row%%10==0, "observed_survival", "vl")]
data[, M_visit_time:= ifelse(variable=="vl", row/6 + 0.25, 0)] 
data[, value:= ifelse(variable=="vl", 3 + exp(-4*M_visit_time), row/10 + 2)]
data[, M_agesero:= ifelse(variable=="vl", agesero, 0)]
data[, D_intercept:= ifelse(variable=="observed_survival", 1, 0)]
data[, D_agesero:= ifelse(variable=="observed_survival", agesero, 0)]
data[, row:=NULL]

example_formula <- "value~ModelGradient(time=M_visit_time,b0,b2,b3)~M_agesero + D_intercept + D_agesero + (b0|patient_id)"

#this works, outside of a function:
Model<- ~b0+b2*exp(-b3*time)
ModelGradient<-deriv(Model,namevec=c("b0","b2","b3"),
               function.arg=c("time","b0","b2","b3"))

out<-nlmer(as.formula(example_formula), data=data,
           start = c(b0=3,b2=1,b3=4),
           control=nlmerControl(optimizer="bobyqa", optCtrl=list(maxfun=200000)))

#but when I write a function:
run_nonlin<- function(model_formula, data){
            Model<- ~b0+b2*exp(-b3*time)
            ModelGradient<-deriv(Model,namevec=c("b0","b2","b3"),
                           function.arg=c("time","b0","b2","b3"))

          print(paste("hello I am the model formula and I exist in this namespace! I am:",
         model_formula))
         out<-nlmer(as.formula(model_formula), data=data,
                 start = c(b0=3,b2=1,b3=4),
                 control=nlmerControl(optimizer="bobyqa",
                  optCtrl=list(maxfun=200000)))
           return(out)
}

#and call:
function_output <- run_nonlin(model_formula=example_formula, data=data)

# I get the error: 
# Error in as.formula(model_formula) : object 'model_formula' not found
#设置玩具数据集

data似乎
nlmer
有一种奇怪的方法来解析传递给函数的公式。显然,您无法传递全局环境中未定义的变量。这似乎是因为
nlformula
在未赋值符号上调用
as.formula
,该符号作为公式传递。这意味着词法作用域用于解析符号,因此它将在
stats
命名空间中搜索
model\u公式
,然后搜索全局环境,而不是在函数定义的范围内

一种解决方法是计算该参数,然后通过
do.call()
传递该值

run_nonlin<- function(model_formula, data){
    Model<- ~b0+b2*exp(-b3*time)
    ModelGradient<-deriv(Model,namevec=c("b0","b2","b3"),
                       function.arg=c("time","b0","b2","b3"))

    out <- do.call('nlmer', list(as.formula(model_formula), 
        data=quote(data),
        start = c(b0=3,b2=1,b3=4),
        control=nlmerControl(optimizer="bobyqa",
        optCtrl=list(maxfun=200000))))

    return(out)
}

run_\n当然,很抱歉疏忽了。我在脚本底部添加了错误文本。它是:“as.formula(model_-formula)中的错误:未找到对象‘model_-formula’”问题是as.formula默认在全局环境中工作,而ModelGradient等不存在。您需要使用
和设置环境。这很棘手,明白吗-