Rでの順序付きロジットの予測


12

順序付きロジット回帰を実行しようとしています。私はそのようにモデルを実行しています(収入と人口の測定から市場の企業数を推定するばかげた小さなモデル)。私の質問は予測についてです。

nfirm.opr<-polr(y~pop0+inc0, Hess = TRUE)
pr_out<-predict(nfirm.opr)

予測を実行すると(予測されたyを取得するために使用しています)、出力は0、3、または27のいずれかであり、これは係数からの手動予測に基づく予測であると思われるものを反映するものではありません推定と傍受。注文したロジットモデルの「正確な」予測を取得する方法を知っている人はいますか?

編集

私の懸念を明確にするために、私の応答データにはすべてのレベルにわたる観察があります

>head(table(y))
y
0  1  2  3  4  5 
29 21 19 27 15 16 

私の予測変数が集まっているように見えるところ

> head(table(pr_out))
pr_out
0     1   2   3   4   5 
117   0   0 114   0   0 

2
これはかなりあいまいです。predict関数によって返される値は、手動で生成した値とどのように異なりますか?従属変数の構造は何ですか?再現可能な例を提供してください。
Sven Hohenstein

1
私はあなたがthis-見たいと思いstats.stackexchange.com/questions/18119/...
ブレインワーン

2
私はあなたの状況をよく理解していません。あなたは順序回帰モデルを使用していると言いますが、私が理解しているように、あなたの応答変数は市場の企業数であるとも言います。これはカウントですが、序数ですが、OLRはそれをモデル化する正しい方法ではありません。ポアソン回帰の変種を使用したい。
gung-モニカの復活

2
@gungはい、私はカウント対序数のポイントを理解しています。現在、私はペーパーideas.repec.org/a/ucp/jpolec/v99y1991i5p977-1009.htmlを複製しようとしていますが、それらは序数回帰を使用しています。カウントモデルも推定しましたが、この特定のタスクには役立ちません。また、いいえ、私はRにこれを実行させたいだけではなく、動作が私の期待から逸脱している場所を理解しようとしています(エラーがRではなく私の側にあると思われるため)。
プロトトースト

1
polr()他の機能と照合しましたか?あなたはlrm()パッケージから試すことができますrmslrmFit <- lrm(y ~ pop0 + inc0); predict(lrmFit, type="fitted.ind")。別のオプションはvglm()パッケージからVGAMです:vglmFit <- vglm(y ~ pop0 + inc0, family=propodds); predict(vglmFit, type="response")。どちらも予測されたカテゴリ確率の行列を返します。そこから予測カテゴリを取得するには、私の答えを参照しください。
カラカル

回答:


23

polr()パッケージからの使用から得られた予測を手動で検証するには、順序付きカテゴリおよび予測子MASSを持つカテゴリ依存変数がある状況を想定します。。比例オッズモデルを想定1 g k X 1X jX pY1,,g,,kX1,,Xj,,Xppolr()

logit(p(Yg))=lnp(Yg)p(Y>g)=β0g(β1X1++βpXp)

他の関数に実装されている可能な選択肢については、この回答を参照してください。ロジスティック関数はロジット関数の逆なので、予測確率はp^(Yg)

p^(Yg)=eβ^0g(β^1X1++β^pXp)1+eβ^0g(β^1X1++β^pXp)

予測されるカテゴリ確率は、です。これは、2つの予測子したRでの再現可能な例です。順序変数の場合、シミュレートされた連続変数を4つのカテゴリーに切り分けました。P^(Y=g)=P^(Yg)P^(Yg1)X1,X2Y

set.seed(1.234)
N     <- 100                                    # number of observations
X1    <- rnorm(N, 5, 7)                         # predictor 1
X2    <- rnorm(N, 0, 8)                         # predictor 2
Ycont <- 0.5*X1 - 0.3*X2 + 10 + rnorm(N, 0, 6)  # continuous dependent variable
Yord  <- cut(Ycont, breaks=quantile(Ycont), include.lowest=TRUE,
             labels=c("--", "-", "+", "++"), ordered=TRUE)    # ordered factor

を使用して比例オッズモデルを近似し、を使用polr()して予測されたカテゴリ確率の行列を取得しpredict(polr(), type="probs")ます。

> library(MASS)                              # for polr()
> polrFit <- polr(Yord ~ X1 + X2)            # ordinal regression fit
> Phat    <- predict(polrFit, type="probs")  # predicted category probabilities
> head(Phat, n=3)
         --         -         +        ++
1 0.2088456 0.3134391 0.2976183 0.1800969
2 0.1967331 0.3068310 0.3050066 0.1914293
3 0.1938263 0.3051134 0.3067515 0.1943088

これらの結果を手動で検証するには、パラメーター推定値を抽出し、これらから予測ロジットを計算し、これらのロジットから予測確率計算してから、予測カテゴリー確率を行列にバインドする必要があります。p^(Yg)

ce <- polrFit$coefficients         # coefficients b1, b2
ic <- polrFit$zeta                 # intercepts b0.1, b0.2, b0.3
logit1 <- ic[1] - (ce[1]*X1 + ce[2]*X2)
logit2 <- ic[2] - (ce[1]*X1 + ce[2]*X2)
logit3 <- ic[3] - (ce[1]*X1 + ce[2]*X2)
pLeq1  <- 1 / (1 + exp(-logit1))   # p(Y <= 1)
pLeq2  <- 1 / (1 + exp(-logit2))   # p(Y <= 2)
pLeq3  <- 1 / (1 + exp(-logit3))   # p(Y <= 3)
pMat   <- cbind(p1=pLeq1, p2=pLeq2-pLeq1, p3=pLeq3-pLeq2, p4=1-pLeq3)  # matrix p(Y = g)

の結果と比較してくださいpolr()

> all.equal(pMat, Phat, check.attributes=FALSE)
[1] TRUE

予測されたカテゴリについてはpredict(polr(), type="class")、各観測について、最も確率が高いカテゴリを選択するだけです。

> categHat <- levels(Yord)[max.col(Phat)]   # category with highest probability
> head(categHat)
[1] "-"  "-"  "+"  "++" "+"  "--"

の結果と比較してくださいpolr()

> facHat <- predict(polrFit, type="class")  # predicted categories
> head(facHat)
[1] -  -  +  ++ +  --
Levels: -- - + ++

> all.equal(factor(categHat), facHat, check.attributes=FALSE)  # manual verification
[1] TRUE
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.