R 三明治&x2B;mlogit:`ef/X中的错误:使用`vcovHC()`计算稳健/聚集标准错误时的不一致数组`

R 三明治&x2B;mlogit:`ef/X中的错误:使用`vcovHC()`计算稳健/聚集标准错误时的不一致数组`,r,stata,multinomial,standard-error,mlogit,R,Stata,Multinomial,Standard Error,Mlogit,在使用mlogit()拟合离散选择问题中的多项式Logit(MNL)后,我试图计算稳健/集群标准错误。不幸的是,我怀疑我在使用它时遇到了问题,因为我使用的是long格式的数据(在我的情况下这是必须的),并且在sandwich::vcovHC(,“HC0”)之后得到了ef/X:non-conformable array中的错误 数据 为便于说明,请仔细考虑以下数据。它表示从3个备选方案(altern)中选择的5个个体(id\u ind)的数据。五个人中的每一个都选择了三次;因此,我们有15种选择

在使用
mlogit()
拟合离散选择问题中的多项式Logit(MNL)后,我试图计算稳健/集群标准错误。不幸的是,我怀疑我在使用它时遇到了问题,因为我使用的是
long
格式的数据(在我的情况下这是必须的),并且在
sandwich::vcovHC(,“HC0”)
之后得到了ef/X:non-conformable array中的错误


数据 为便于说明,请仔细考虑以下数据。它表示从3个备选方案(
altern
)中选择的5个个体(
id\u ind
)的数据。五个人中的每一个都选择了三次;因此,我们有15种选择情况(
id\u choice
)。每个备选方案由两个通用属性(
x1
x2
)表示,选择在
y
中注册(如果选择
1
,否则为
0

正如我们所看到的,
sandwich::vcovHC
产生了一个错误,它表示
ef/X
是不一致的。其中
X聚集标准错误
这里,假设每个人回答3个问题,那么个人之间很可能存在某种程度的相关性;因此,在这种情况下,应首选群集校正。下面我计算了本例中的集群校正,并展示了与
clogit,cluster()
的Stata输出的等价性

问题是: 我想在
sandwich
生态系统中容纳我的计算,这意味着不是手动计算矩阵,而是实际使用
sandwich
函数。是否有可能使其与本文所述的长格式模型一起工作?例如,直接提供
面包
对象来执行计算?提前谢谢


PS:我注意到了这一点,但我无法为
mlogit
找到像
meat
这样的东西,但无论如何,我可能在这里遗漏了一些东西…

为什么vcovHC不适用于mlogit HC协方差估计器的类别仅适用于具有单一线性预测器的模型,其中得分函数(也称为估计函数)是所谓的“工作残差”和回归矩阵的乘积。Zeileis(2006)的论文(见方程式7)对此进行了详细解释,在文件包中提供了
vignette(“三明治OOP”,package=“sandwich”)
?vcovHC
也指出了这一点,但没有很好地解释。目前,我已在文档中对此进行了改进:

函数meatHC是估计HC三明治估计器的肉的真正工作马-默认的vcovHC方法是一个调用三明治和面包的包装器。有关更多实施细节,请参见Zeileis(2006)。下面和Zeileis(2004)中描述了线性回归模型的理论背景。其他类型的模型采用类似公式,前提是它们依赖于单个线性预测值,且估计函数可表示为“工作残差”和回归向量的乘积(Zeileis 2006,方程7)

这意味着
vcovHC()
不适用于多项式logit模型,因为它们通常对单独的响应类别使用单独的线性预测。同样,不支持两部分或跨栏模型等

基本“稳健”三明治协方差 通常,为了计算基本的艾克-休伯-怀特三明治协方差矩阵估值器,最好的策略是使用
sandwich()
函数,而不是
vcovHC()
函数。前者适用于具有
estfun()
bread()
方法的任何模型

对于线性模型,
sandwich(…,adjust=FALSE)
(默认)和
sandwich(…,adjust=TRUE)
分别对应于HC0和HC1。在具有
n
观测值和
k
回归系数的模型中,前者标准化为
1/n
,后者标准化为
1/(n-k)

然而,在logit模型中,Stata除以
1/(n-1)
,请参见: . 就我所知,没有明确的理论理由专门使用一种或另一种调整。在中等规模的样本中,这没有任何区别

备注:
1/(n-1)
的调整不能作为选项直接在
sandwich()
中使用。然而,巧合的是,它是
vcovCL()
中的默认值,没有指定
集群
变量(即,将每个观察值视为一个单独的集群)。因此,如果你想得到与Stata完全相同的结果,这是一个方便的“技巧”

聚集协方差 这可以通过
vcovCL(…,cluster=…)
按“通常”计算。对于<代码> MLogIT 模型,您只需考虑<代码>群集变量只需要提供一次(而不是以长格式堆叠几次)。

复制Stata结果 使用您帖子中的数据和模型:

vcovCL(mo)
##            x1         x2
## x1 0.23050261 0.09840356
## x2 0.09840356 0.12765662
vcovCL(mo, cluster = df$id_choice[1:15])
##           x1        x2
## x1 0.1766707 0.1007703
## x2 0.1007703 0.1180004

我觉得奇怪,它不起作用,因为调用
sandwich(mo)
似乎起作用。根据
三明治
的示例判断,这应该等于
vcovHC(mo,type=“HC”)
,这不起作用。我觉得奇怪的是,它会受到你的数据(长格式)的影响,因为它使用分数贡献和渐近方差协方差矩阵来计算它们(你自己做的)。mlogit对象是否可能不返回分数,而只返回分数的列和,从而导致维度错误?您好@edsandorf,谢谢您的评论。我检查了分数函数,这些函数具有正确的维度
15x2
。然而,我认为造成问题的原因是
library(mlogit)
library(sandwich)
mo <-  mlogit(formula = y ~ x1 + x2|0 , 
              method ="nr",  
              data =  df,
              idx  =  c("id_choice", "altern"))

sandwich::vcovHC(mo, "HC0")
#Error in ef/X : non-conformable arrays
psi<- estfun(mo)
k <- NCOL(psi)
n <- NROW(psi)
rval <-  (n/(n-1))* crossprod(as.matrix(psi))
vcov(mo) %*% rval %*% vcov(mo)

#            x1         x2
# x1 0.23050261 0.09840356
# x2 0.09840356 0.12765662
qui clogit y x1 x2 ,group(id_choice) r
mat li e(V)
symmetric e(V)[2,2]
            y:         y:
            x1         x2
y:x1  .23050262
y:x2  .09840356  .12765662
id_ind_collapsed <- df$id_ind[!duplicated(mo$model$idx$id_choice,)]
psi_2 <- rowsum(psi, group = id_ind_collapsed )

k_cluster <- NCOL(psi_2)
n_cluster <- NROW(psi_2)
rval_cluster <-  (n_cluster/(n_cluster-1))* crossprod(as.matrix(psi_2))
vcov(mo) %*% rval_cluster %*% vcov(mo)

#           x1        x2
# x1 0.1766707 0.1007703
# x2 0.1007703 0.1180004
qui clogit y x1 x2 ,group(id_choice) cluster(id_ind)
symmetric e(V)[2,2]
            y:         y:
            x1         x2
y:x1  .17667075
y:x2   .1007703  .11800038
vcovCL(mo)
##            x1         x2
## x1 0.23050261 0.09840356
## x2 0.09840356 0.12765662
vcovCL(mo, cluster = df$id_choice[1:15])
##           x1        x2
## x1 0.1766707 0.1007703
## x2 0.1007703 0.1180004