如何在 polr 有序 logit 模型的截距上测试线性假设?

Posted

技术标签:

【中文标题】如何在 polr 有序 logit 模型的截距上测试线性假设?【英文标题】:How to test linearHypothesis on intercepts of polr ordered logit model? 【发布时间】:2020-10-11 10:46:34 【问题描述】:

我想测试有序 logit 模型中截距的显着差异。

library(MASS)

house.plr <- polr(Sat ~ Infl + Type + Cont, weights = Freq, data = housing)
summary(house.plr)$coefficients
#           Value Std. Error   t value
# Infl -0.3907221 0.05856668 -6.671406
# Type  0.5654170 0.04921585 11.488515
# Cont  0.0998870 0.09008336  1.108829
# 1|2  -0.6937440 0.20773639 -3.339540
# 2|3   0.7906212 0.20701136  3.819216
# 3|4   2.0574730 0.21396779  9.615807

系数的假设检验工作正常(相关方法为car:::linearHypothesis.polr)。

library(car)
linearHypothesis(house.plr, hypothesis.matrix="Infl + Type + Cont")$`Pr(>Chisq)`[2]
# [1] 0.01679297

但是,测试 intercepts 不起作用,即使这些截距包含在 vcov 中。

signif(vcov(house.plr), 3)
#           Infl      Type      Cont     1|2     2|3     3|4
# Infl  0.003430 -0.000269  0.000320 0.00666 0.00623 0.00595
# Type -0.000269  0.002420 -0.000442 0.00365 0.00410 0.00464
# Cont  0.000320 -0.000442  0.008120 0.01240 0.01250 0.01260
# 1|2   0.006660  0.003650  0.012400 0.04320 0.04130 0.04140
# 2|3   0.006230  0.004100  0.012500 0.04130 0.04290 0.04270
# 3|4   0.005950  0.004640  0.012600 0.04140 0.04270 0.04580

尝试失败:

linearHypothesis(house.plr, "(1|2 - 2|3) + (2|3 - 3|4) = 0")
linearHypothesis(house.plr, "1|2")

或者,由于文档建议添加vcov

默认方法适用于任何模型对象 系数向量可以通过 coef 和 vcov 的系数-协方差矩阵(否则参数 vcov. 必须明确设置)。

linearHypothesis(house.plr, "1|2", vcov.=vcov(house.plr))

全部屈服:

Error in constants(lhs, cnames_symb) : 
  The hypothesis "1|2" is not well formed: contains bad coefficient/variable names.
In addition: Warning message:
In constants(lhs, cnames_symb) : NAs introduced by coercion

我注意到系数和截距存储在不同的对象中,但这对我也没有多大帮助。

house.plr$coefficients
#       Infl       Type       Cont 
# -0.3907221  0.5654170  0.0998870 

house.plr$zeta
#        1|2        2|3        3|4 
# -0.6937440  0.7906212  2.0574730 

我如何正确定义 hypothesis.matrix= 中的 car::linearHypothesis 来测试拦截?

或者,是否有人已经从头开始这样做了?

预期结果是(来自 Stata):

 ( 1)  [cut1]_cons - 2*[cut2]_cons + [cut3]_cons = 0

           chi2(  1) =    6.53
         Prob > chi2 =    0.0106

数据:

data(housing, package="MASS")
housing$Sat <- as.factor(1:4)
housing[2:5] <- lapply(housing[2:5], as.integer)

【问题讨论】:

【参考方案1】:

我们可以使用car::linearHypothesis.default"polr" 对象的截距进行假设检验。该方法有一个参数coef.=,我们可以使用coefficientszetas 的组合来提供它,从而为我们提供与已经正确存在的vcov 的对应关系。 hypothesis.matrix= 我们定义为一个矩阵。

coef.ext <- with(house.plr, c(coefficients, zeta))

M <- matrix(c(0, 0, 0, 1, -2, 1), nrow=1, 
            dimnames=list('1|2 - 2*(2|3) + 3|4 = 0', names(coef.ext)))

car::linearHypothesis.default(house.plr, hypothesis.matrix=M, coef.=coef.ext)
# Re-fitting to get Hessian
# 
# Linear hypothesis test
# 
# Hypothesis:
# 1|2 - 2 2|3  + 3|4 = 0
# 
# Model 1: restricted model
# Model 2: Sat ~ Infl + Type + Cont
# 
#   Res.Df Df  Chisq Pr(>Chisq)  
# 1   1676                       
# 2   1675  1 6.5269    0.01063 *
# ---
# Signif. codes:  
# 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

【讨论】:

以上是关于如何在 polr 有序 logit 模型的截距上测试线性假设?的主要内容,如果未能解决你的问题,请参考以下文章

如何获得 PLS 回归的截距(sklearn)

我们如何计算 statsmodels OLS 中的截距和斜率?

计量经济学中的截距项属于变量吗?如果说是三变量模型,那k应该取多

线性回归中的截距

如何在 R 中拟合分段回归,并限制第一次拟合通过截距..?

r 用户R从PLINK分析单个SNP。使用有序logit模型分析SNP,SNP作为结果(通常它是完成的