如何在 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.=
,我们可以使用coefficients
和zetas
的组合来提供它,从而为我们提供与已经正确存在的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 模型的截距上测试线性假设?的主要内容,如果未能解决你的问题,请参考以下文章
我们如何计算 statsmodels OLS 中的截距和斜率?