在crmPack中定义单参数幂模型调用update函数报错求助
修复"no slot of name 'call'"错误的解决方案
这个错误出现的根源是crmPack的Model基类要求所有模型对象必须包含call槽,用来记录创建模型时的调用上下文,而你自定义的OneParExp类在构造时没有初始化这个槽,导致update函数无法找到它。
下面是具体的修复步骤和修改后的代码:
1. 核心修复点:添加call槽初始化
在OneParExp构造函数中,调用.OneParExp创建对象时,需要加入call = match.call()参数——match.call()会自动捕获当前函数的调用语句,正好填充Model类要求的call槽。
2. 修改后的完整可运行代码
# package and options library(crmPack) options <- McmcOptions(burnin = 1000, step = 2, samples = 5000) set.seed(1) # extra functions to define the power model .OneParExp <- setClass(Class = "OneParExp", contains = "Model", representation(skeletonFun = "function", skeletonProbs = "numeric", lambda = "numeric")) OneParExp <- function(skeletonProbs, doseGrid, lambda) { skeletonFun <- approxfun(x = doseGrid, y = skeletonProbs, rule = 2) invSkeletonFun <- approxfun(x = skeletonProbs, y = doseGrid, rule = 1) .OneParExp( call = match.call(), # 新增:初始化call槽,满足Model基类要求 skeletonFun = skeletonFun, skeletonProbs = skeletonProbs, lambda = lambda, datamodel = function(){ for (i in 1:nObs) { y[i] ~ dbern(p[i]) p[i] <- skeletonProbs[xLevel[i]]^theta }}, datanames = c("nObs", "y", "xLevel"), prob = function(dose, theta){ skeletonFun(dose)^theta }, dose = function(prob, theta){ invSkeletonFun(prob^(1 / theta)) }, priormodel = function(){ theta ~ dexp(lambda) }, modelspecs = function(){ list(skeletonProbs = skeletonProbs, lambda = lambda) }, init = function(){ list(theta = 1) }, sample = "theta") } # tox data and model fitting data <- Data(x = c(1.2,1.2,1.8,2.4,3), y = c(0, 0, 0, 1, 1), cohort = c(1, 1, 2, 3, 4), doseGrid = seq(1.2, 3, 0.6), ID = 1:5, placebo = FALSE) (skeletonProbs <- round(data@doseGrid / max(data@doseGrid) / 4, 2)) newModel <- OneParExp(skeletonProbs = skeletonProbs, doseGrid = data@doseGrid, lambda = 1) newDLTmodel <- update(object=newModel, data=data)
3. 修复效果验证
运行修改后的代码,update函数会正常执行,不再抛出"no slot of name 'call'"的错误。这是因为我们手动为模型对象补充了call槽,满足了Model基类的结构要求,update函数可以正确识别并处理这个自定义模型对象。
内容的提问来源于stack exchange,提问作者user1431694
相关产品推荐
相关产品推荐

