順序ロジスティック回帰モデルについて / 順序選択モデル

 順序ジスティック回帰モデル(ordinal logistic regression model)は、出力が1,2,3・・・という3種類以上の離散変数かつ数字の大小関係に意味のある統計モデルであるロジスティック回帰モデルの発展系だ。潜在変数Y*が複数ある閾値を超えるか否かで、目的変数が決定される。なお、潜在変数モデルの定数項は0である。

$$目的変数Y=\begin{cases} 1 (Y^*≦閾値1) \\ 2 (閾値1<Y^*≦閾値2) \\ 3 (閾値2<Y^*≦閾値3) \\ 4  (閾値3<Y^*) \end{cases}$$

$$潜在変数 Y^*=\beta_1 X_1 +\cdots +\beta_k X_k +U$$

$$U|X_1,X_2 \cdots X_k が標準ロジスティック分布※に従う$$

$$※ 累積分布関数=\frac{e^x}{1+e^x} E(X)=0、Var(X)=\frac{\pi^2}{3}$$

 

 順序ロジスティック回帰モデルが母集団で成立しているとき、どんな潜在変数と目的変数が出力されるのかをシミュレーションしてみた。次のモデルの場合、図1が潜在変数で、図2が実際に観測される標本である。

$$潜在変数モデル Y^*=0.2 X +u$$

$$閾値=-3、-1、2$$

図1:順序ロジスティック回帰モデルの潜在変数と閾値
出典:しまうま総研(2023)が作成
補足:Rコードは追記に載せた。

図2:順序ロジスティック回帰モデルにしたがう標本の例
出典:しまうま総研(2023)が作成
補足:Rコードは追記に載せた。

 

 満足度について分析するときは順序ロジスティック分析を使ってみたい。満足度アンケートの選択肢が4つのとき、「4」は「1」より大きいことを意味しているけれども、「1」の4倍の満足度ではない。この満足度に、序数的な意味はあるが、基数的な意味はない。そんなときは順序ロジスティック回帰分析だ。

 

【追記】

 Rで順序ロジスティック回帰分析をしてみよう。「MASS」というパッケージのpolr関数で実行できる。

#サンプルを生成
sample_size <- 500
x1 <- rnorm(n=sample_size, mean =-0.5, sd=10)
x2 <- rnorm(n=sample_size, mean =0, sd=5)
u <- rlogis(sample_size)
yy <- 0.1 + 0.2*x1 + 0.1*x2+ u
y <- ifelse(yy>=2,4,
            ifelse(yy>=-1,3,
                   ifelse(yy>=-3,2,1)))
data1 <- data.frame(x1,x2,y,yy)
 
#順序ロジスティック回帰の実行
library(MASS) #パッケージの呼び出し
polr(as.factor(y) ~ 1 + x1 + x2, data=data0,  method = c("logistic")) #順序ロジスティック回帰(係数、閾値だけ)
 
reg <- polr(as.factor(y) ~1 + x1 + x2, data=data0,  method = c("logistic")) #名付け
summary(reg) #サマリー

 Rでの描画は次のコードで行いました。

library(ggplot2)
#サンプルを生成
sample_size <- 500
x <- rnorm(n=sample_size, mean =-0.5, sd=10)
u <- rlogis(sample_size)
yy <- 0.2*x+ u
y <- ifelse(yy>=2,4,
            ifelse(yy>=-1,3,
                   ifelse(yy>=-3,2,1)))
data0 <- data.frame(x,y,yy)

#図2
ggplot(data0,aes(x =x, y=yy))+
  geom_point()+
  geom_hline(yintercept = 2) +
  geom_hline(yintercept = -1) +
  geom_hline(yintercept = -3) +
  scale_x_continuous(limits = c(-30, 30))+
  scale_y_continuous(limits = c(-7, 7))

#図3
ggplot(data0,aes(x =x, y=y))+
  geom_point()+
  scale_x_continuous(limits = c(-30, 30))+
  scale_y_continuous(limits = c(0, 5))