案例:
我正在尝试估算从55个原点地区(mig
)到54个目的地区(IDo
)的迁移重力模型(IDd
)。两个重要的预测因子是每个起点和目的地区之间的距离(dist
)以及任何始发地 - 目的地对的邻接度(contig
)的指示变量。迁移结果变量衡量在各区之间迁移的人数(从零到几万)。下面是一个近似于我的数据情况的测试数据集。在实际数据中,迁移结果变量略微不那么理想地是泊松分布(min=0, max=9450, mean=85, median=10
)。
library(lme4)
#*** Generate test data set
set.seed=777
td=data.frame(IDo=rep(1:55,each=55),IDd=rep(1:55,times=55),dist=runif(3025,0.186,12.7),contig=rbinom(3025,1,p=0.08), stringsAsFactors=F)
td=td[td$IDo!=td$IDd,] # remove cases for which origin and destination are the same
td=rbind(td,td) # dublicate data for two years
td$year=rep(c(1,0),each=2970) # generate year dummy variable
td$mig=rpois(5940, lambda = 1)*1000 # generate migrant count variable
# Cross-classified random effects Poisson models
m1=formula(mig~dist+contig+year+(1|IDo)+(1|IDd))
fm0=glmer(m1,data=td,family="poisson",control=glmerControl(optimizer="bobyqa"), nAGQ=0) # Adaptive Gauss-Hermite Quadrature
fm1=glmer(m1,data=td,family="poisson",control=glmerControl(optimizer="bobyqa"), nAGQ=1) # Laplace Approximation
# Regular Poisson models
m2=formula(mig~dist+contig+year+factor(IDo)+factor(IDd))
fm2=glm(m2,data=td,family="poisson")
问题:
我使用lme4
运行交叉分类的多级泊松模型。使用默认的nAGQ = 1设置(fm1
)时,我总是收到以下警告消息,而在实际数据情况下,模型无法收敛(In checkConv(attr(opt, "derivs"), opt$par, control$checkConv Model failed to converge with max|grad| = 0.00248588 (tol = 0.001, component 1)
)。
Warning message:
In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, :
Model is nearly unidentifiable: very large eigenvalue
- Rescale variables?
但是,设置nAGQ = 0(fm0
)或将其作为常规固定效果模型(fm2
)运行时,不会出现此问题。
有没有人建议如何避免这个警告信息背后的问题(并导致实际数据中的收敛问题)?预测变量的规模都相当小,所以无需重新调整这些变量。我可以将结果变量重新缩放为具有较小的值(td$mig=round(td$mig/1000,0)
),但这会改变分布,不应按照this post中的说明进行。
答案 0 :(得分:1)
我真的认为这是误报;将计数数据计算得如此之大是不寻常的......您是否尝试过使用不同的优化器(参见?lme4::convergence
)? (我刚用control=glmerControl(optim="nloptwrap")
尝试了你的例子,得到了几乎相同的结果。)
我有点担心你的分配假设。我知道这只是一个可重复的例子,但是绘制泊松样本并将其乘以1000确实不给出泊松分布值......这里是一个模拟第90个分布的小后验预测模拟拟合模型下响应的分位数 - 方式与观察值不同...
ss <- simulate(fm1,1000,seed=101)
qq <- sapply(ss,quantile,0.9)
hist(qq,breaks=50,col="gray")
summary(qq)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1106 1153 1167 1168 1182 1255
quantile(td$mig,0.9) ## 2000