什么是定序回归
定序回归的因变量是定序变量,数据类型是顺序数据。比如不满意,一般,满意;不合格,合格,优秀等。
模型构建
假设因变量是评分,先由单变量回归说起,则普通的线性回归模型为:
s
c
o
r
e
=
β
0
+
β
1
×
x
1
+
ϵ
\mathrm{score}=\beta_0+\beta_1\times x_1+\epsilon
score=β0+β1×x1+ϵ
若上式中score不是连续变量,而是分类变量(例如取值为1,2,3,4)。这样等式两边的数据类型不统一,直接进行回归是没有意义的。我们考虑引入连续变量Z, 先让Z进行普通线性回归。
Z
=
β
0
+
β
1
×
x
1
+
ϵ
.
Z=\beta_0+\beta_1\times x_1+\epsilon.
Z=β0+β1×x1+ϵ.
并定义Z和score之间存在下面的关系:
s
c
o
r
e
=
{
1
,
if
Z
≤
c
1
;
2
,
if
c
1
<
Z
≤
c
2
;
3
,
if
c
2
<
Z
≤
c
3
;
4
,
if
c
3
<
Z
.
\mathrm{score}=\begin{cases} 1, \quad \text{if} \quad Z\leq c_1;\\ 2, \quad \text{if} \quad c_1<Z\leq c_2;\\ 3, \quad \text{if} \quad c_2< Z\leq c_3;\\ 4, \quad \text{if} \quad c_3< Z.\\ \end{cases}
score=⎩
⎨
⎧1,ifZ≤c1;2,ifc1<Z≤c2;3,ifc2<Z≤c3;4,ifc3<Z.
进一步可得:
当
1
≤
k
<
4
1\leq k<4
1≤k<4时,
Pr
(
s
c
o
r
e
≤
k
)
=
Pr
(
Z
≤
c
k
)
=
Pr
(
β
0
+
β
1
×
x
1
+
ϵ
≤
c
k
)
=
F
ϵ
(
α
k
−
β
1
×
x
1
)
;
\begin{aligned} \Pr(\mathrm{score}\leq k)&=\Pr(Z\leq c_k)\\ &=\Pr(\beta_0+\beta_1\times x_1+\epsilon\leq c_k)\\ &=F_\epsilon(\alpha_k-\beta_1\times x_1); \end{aligned}
Pr(score≤k)=Pr(Z≤ck)=Pr(β0+β1×x1+ϵ≤ck)=Fϵ(αk−β1×x1);
当
k
=
4
k=4
k=4时,
Pr
(
s
c
o
r
e
=
4
)
=
1
−
Pr
(
s
c
o
r
e
≤
3
)
,
\Pr(\mathrm{score}=4)=1-\Pr(\mathrm{score}\leq 3),
Pr(score=4)=1−Pr(score≤3),
其中,
α
k
=
c
k
−
β
0
\alpha_k=c_k-\beta_0
αk=ck−β0,
F
ϵ
(
⋅
)
F_\epsilon(\cdot)
Fϵ(⋅)表示
ϵ
\epsilon
ϵ的分布函数。
通过不同连接函数对 F ϵ ( ⋅ ) F_\epsilon(\cdot) Fϵ(⋅)进行建模可以得到不同形式的回归模型。
若用正态分布的分布函数
Φ
(
⋅
)
\Phi(\cdot)
Φ(⋅)表示
F
ϵ
(
⋅
)
F_\epsilon(\cdot)
Fϵ(⋅), 可得到定序回归的Probit模型:
Pr
(
s
c
o
r
e
≤
k
)
=
Φ
(
α
k
−
β
1
×
x
1
)
.
\Pr(\mathrm{score}\leq k)=\Phi(\alpha_k-\beta_1\times x_1).
Pr(score≤k)=Φ(αk−β1×x1).
进一步,有
Φ
−
1
{
Pr
(
s
c
o
r
e
≤
k
)
}
=
α
k
−
β
1
×
x
1
.
\Phi^{-1}\{\Pr(\mathrm{score}\leq k)\}=\alpha_k-\beta_1\times x_1.
Φ−1{Pr(score≤k)}=αk−β1×x1.
上式左边可以通过计算得到,右边即为线性表达式。需要注意的是,与OLS相比,截距项
α
k
\alpha_k
αk是有k个。
若用Logist连接函数来表示表示
F
ϵ
(
⋅
)
F_\epsilon(\cdot)
Fϵ(⋅), 可得到定序回归的Logist模型:
Pr
(
s
c
o
r
e
≤
k
)
=
exp
(
α
k
−
β
1
×
x
1
)
1
+
exp
(
α
k
−
β
1
×
x
1
)
.
\Pr(\mathrm{score}\leq k)=\frac{\exp(\alpha_k-\beta_1\times x_1)}{1+\exp(\alpha_k-\beta_1\times x_1)}.
Pr(score≤k)=1+exp(αk−β1×x1)exp(αk−β1×x1).
进一步,有
l
o
g
i
t
{
Pr
(
s
c
o
r
e
≤
k
)
}
=
log
(
Pr
(
s
c
o
r
e
≤
k
)
1
−
Pr
(
s
c
o
r
e
≤
k
)
)
=
α
k
−
β
1
×
x
1
.
\mathrm{logit}\{\Pr(\mathrm{score}\leq k)\}=\log\left(\frac{\Pr(\mathrm{score}\leq k)}{1-\Pr(\mathrm{score}\leq k)}\right)=\alpha_k-\beta_1\times x_1.
logit{Pr(score≤k)}=log(1−Pr(score≤k)Pr(score≤k))=αk−β1×x1.
随后可以利用极大似然估计,得到参数
α
^
1
,
α
^
2
,
.
.
.
,
α
^
4
,
β
^
1
\hat{\alpha}_1,\hat{\alpha}_2,...,\hat{\alpha}_4,\hat{\beta}_1
α^1,α^2,...,α^4,β^1.
α
^
1
,
α
^
2
,
.
.
.
,
α
^
4
,
β
^
1
=
arg max
α
1
,
.
.
,
α
4
,
β
1
∏
i
=
1
n
p
(
x
i
;
α
1
,
.
.
,
α
4
,
β
1
)
,
\hat{\alpha}_1,\hat{\alpha}_2,...,\hat{\alpha}_4,\hat{\beta}_1=\argmax_{\alpha_1,..,\alpha_4,\beta_1}\prod_{i=1}^n p(x_i;\alpha_1,..,\alpha_4,\beta_1),
α^1,α^2,...,α^4,β^1=α1,..,α4,β1argmaxi=1∏np(xi;α1,..,α4,β1),
其中
p
(
x
i
;
α
1
,
.
.
,
α
4
,
β
1
)
=
{
F
ϵ
(
α
1
−
β
1
×
x
1
)
,
if
s
c
o
r
e
i
=
1
;
F
ϵ
(
α
k
−
β
1
×
x
1
)
−
F
ϵ
(
α
k
−
1
−
β
1
×
x
1
)
,
if
s
c
o
r
e
i
=
k
,
1
<
k
<
4
;
1
−
F
ϵ
(
α
3
−
β
1
×
x
1
)
,
if
s
c
o
r
e
i
=
4.
p(x_i;\alpha_1,..,\alpha_4,\beta_1)=\begin{cases} F_\epsilon(\alpha_1-\beta_1\times x_1),\quad \text{if}\quad \mathrm{score}_i=1;\\ F_\epsilon(\alpha_k-\beta_1\times x_1)-F_\epsilon(\alpha_{k-1}-\beta_1\times x_1),\quad \text{if}\quad \mathrm{score}_i=k, 1<k<4;\\ 1-F_\epsilon(\alpha_3-\beta_1\times x_1),\quad \text{if}\quad \mathrm{score}_i=4. \end{cases}
p(xi;α1,..,α4,β1)=⎩
⎨
⎧Fϵ(α1−β1×x1),ifscorei=1;Fϵ(αk−β1×x1)−Fϵ(αk−1−β1×x1),ifscorei=k,1<k<4;1−Fϵ(α3−β1×x1),ifscorei=4.
R语言实现
library(MASS)
set.seed(1535)
df=data.frame(
score=factor(sample(x=c(1,2,3),size=100,replace = TRUE,prob = c(0.3,0.3,0.4))),
x1=rnorm(n=100,mean=0.1,sd=1),
x2=rnorm(n=100,mean=-0.1,sd=1.5)
)
head(df)
# score x1 x2
# 1 3 -0.8999129 0.7749112
# 2 2 0.9048189 2.1696023
# 3 3 1.2148977 -1.7717242
# 4 1 -0.6594323 -0.8592811
# 5 3 -0.9922733 1.3890127
# 6 1 -1.1719010 -0.7299038
model=polr(score~.,data=df,Hess = TRUE,method = c('logistic'))
summary(model)
#
#
# Call:
# polr(formula = score ~ ., data = df, Hess = TRUE, method = c("logistic"))
#
# Coefficients:
# Value Std. Error t value
# x1 0.2323 0.1999 1.1621
# x2 -0.0738 0.1310 -0.5633
#
# Intercepts:
# Value Std. Error t value
# 1|2 -1.0663 0.2398 -4.4465
# 2|3 0.4586 0.2174 2.1094
#
# Residual Deviance: 214.361
# AIC: 222.361
Python语言实现
python的mord模块中的LogisticIT()
和LogisticAT()
可以实现相同的效果。
https://pythonhosted.org/mord/