任何人都可以帮助解决以下问题。我使用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'
如何为障碍控制编写脚本,然后将障碍控制集成到障碍中以解决这些问题?
答案 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)