polr()
パッケージからの使用から得られた予測を手動で検証するには、順序付きカテゴリおよび予測子MASS
を持つカテゴリ依存変数がある状況を想定します。。比例オッズモデルを想定1 、… 、g 、… 、k X 1、… 、X j、… 、X pY1,…,g,…,kX1,…,Xj,…,Xppolr()
logit(p(Y⩽g))=lnp(Y⩽g)p(Y>g)=β0g−(β1X1+⋯+βpXp)
他の関数に実装されている可能な選択肢については、この回答を参照してください。ロジスティック関数はロジット関数の逆なので、予測確率はp^(Y⩽g)
p^(Y⩽g)=eβ^0g−(β^1X1+⋯+β^pXp)1+eβ^0g−(β^1X1+⋯+β^pXp)
予測されるカテゴリ確率は、です。これは、2つの予測子したRでの再現可能な例です。順序変数の場合、シミュレートされた連続変数を4つのカテゴリーに切り分けました。P^(Y=g)=P^(Y≤g)−P^(Y≤g−1)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^(Y⩽g)
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
predict
関数によって返される値は、手動で生成した値とどのように異なりますか?従属変数の構造は何ですか?再現可能な例を提供してください。