使用障碍控制来传递参数

时间:2015-08-17 06:09:08

标签: r

任何人都可以帮助解决以下问题。我使用pscl包来适应下面的模型。我正在模拟捕获数据(大约17,000个入口点),因此很多零点

fit.hurdle.bin = hurdle(Catch ~ Beach + Region + Year+ 
                      Decade + Month + Season + Whale+ Sex + Size+ meantemp + 
                      meanviz + offset(log(Length.nets..km.)), 
                      dist="poisson",zero.dist="binomial",link="logit",trace=T)

模型输出告诉我:

  

警告讯息:   在sqrt(diag(对象$ vcov))中:生成NaN(对年份)

然后我使用“L-BFGS-B”的障碍控制来设置一些参数控制来解决这个问题,但是收到警告信息:

L-BFGS-B needs finite values of 'fn'
In addition: Warning message:
In optim(fn = countDist, gr = countGrad, par = c(start$count, if (dist ==  :
  method L-BFGS-B uses 'factr' (and 'pgtol') instead of 'reltol' and 'abstol'

如何为障碍控制编写脚本,然后将障碍控制集成到障碍中以解决这些问题?

1 个答案:

答案 0 :(得分:1)

首先,关于NaN $vcov中的初始警告。我希望这可能是由于某些回归量(如@agstudy所示)或非识别系数的缩放不良。

  • 后一种情况可能是由某些因子级别仅与零相关联(或仅与非零相关)引起的 - 导致二进制障碍或截断计数部分中的响应变量缺乏变化模特。

  • 如果某些回归量很大(数千或数百万)并且其他回归量很小,可能导致收敛问题和/或协方差矩阵的近似奇点,则缩放可能成为一个问题。在所有回归量上使用scale()是一个不错的选择。然而,通常足以将(或乘以)一些适当的常数(例如1000左右)分开(或乘以)。

从您的描述中很难说究竟发生了什么,但我猜想有些地方缺乏识别。

无论如何,我认为改变优化方法不太可能改善这种情况。但是关于问题的hurdle.control()部分:函数hurdle.control() 总是强制reltol成为控制列表的一部分,默认情况下值小于{ {1}}的默认值。但是,由于optim()不使用此功能,因此会发出警告。但它不会影响计算。使用method = "L-BFGS-B"的标准示例:

pscl

这会生成两条警告消息(模型的每个部分都有一条)。如果手动删除library("pscl") data("bioChemists", package = "pscl") m1 <- hurdle(art ~ ., data = bioChemists, method = "L-BFGS-B") ## Warning messages: ## 1: In optim(fn = countDist, gr = countGrad, par = c(start$count, if (dist == : ## method L-BFGS-B uses 'factr' (and 'pgtol') instead of 'reltol' and 'abstol' ## 2: In optim(fn = zeroDist, gr = zeroGrad, par = c(start$zero, if (zero.dist == : ## method L-BFGS-B uses 'factr' (and 'pgtol') instead of 'reltol' and 'abstol' 规范,警告将消失:

reltol

但结果却完全相同:

ctrl <- hurdle.control(method = "L-BFGS-B")
ctrl$reltol <- NULL
m2 <- hurdle(art ~ ., data = bioChemists, control = ctrl)