这是一个很难回答的问题,但让我们试一试.
有一份文件草案描述了glmer
(Bates等人的未出版续集)的实施情况.JSS论文可以通过vignette("lmer", package = "lme4")
in this directory(PDF here)获得,但是--尽管它作为背景读物很有用--它并没有与代码建立直接的联系.
double glmResp::updateWts() {
d_sqrtrwt = (d_weights.array() / variance()).sqrt();
d_sqrtXwt = muEta() * d_sqrtrwt.array();
return updateWrss();
}
即,d_sqrtrtwt
是[在线性预测器或链接标尺上]工作权重的平方根(老实说,我不确定r
意味着什么);d_sqrtXwt
是那些转换回响应/数据标尺的权重(通过乘以dmu/deta
,反向链接函数的导数).
从here开始,sqrtWrkWt
与在updateWts
中计算的d_sqrtXwt
值相同.
我们可以看到weights(., type = "working")
返回object@pp$Xwts^2
,我们甚至可以看到
可通过pp$xwts获得的工作重量应为
相当于:object@resp$weights*(object@resp$muEta()^2)/object@resp$variance()
然而,test/glmm Weights.R中的单元测试表明,这种等价性是近似的.这可能很好,但是,如果差异是由于引用类字段没有以最优方式更新的一般问题的另一个实例,那么这可能会导致真正的问题.例如,请参阅:https://github.com/lme4/lme4/issues/166
我们看到wrkResp
被定义为(d_eta - d_offset).array() + wrkResids();
,here被定义为wrkResids()
是(d_y - d_mu).array() / muEta();
希望你能拿到你需要的所有东西,without用这种方式戳你的内脏……例如,weights(., "working")
应该给你权重;family(.)$mu.eta
应该给你反链接函数的导数;residuals(., "working")
应该给你工作残差.
从上面列出的代码中可以看出,您的"ps"不起作用的原因是,@resp
插槽does not include the offset的$eta
组件……另一个原因是,最好尽可能使用访问器方法,而不是到处钻研……