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함수가 반환 한 값은 수동으로 생성 한 값과 어떻게 다릅니 까? 종속 변수의 구조는 무엇입니까? 재현 가능한 예를 제공하십시오.
스벤 호헨 슈타인


2
나는 당신의 상황을 잘 따르지 않습니다. 당신은 순서 회귀 모델을 사용하고 있다고 말하지만, 가장 잘 이해하는 것처럼 귀하의 응답 변수는 시장의 회사 수라고 말합니다. 그것은 카운트 이고, 서수이지만, OLR은 그것을 모델링하는 올바른 방법이 아닙니다. 포아송 회귀의 일부 변형을 사용하려고합니다.
복원

2
@ gung 네, 카운트 대 서수에 대한 요점을 이해합니다. 현재 나는 paper ideas.repec.org/a/ucp/jpolec/v99y1991i5p977-1009.html 을 복제하려고 하며 그들은 서수 회귀를 사용합니다. 또한 카운트 모델을 추정했지만이 특정 작업에 도움이되지 않습니다. 또한, 아니오, R이 이것을하기를 원하지는 않습니다. 동작이 내 기대에서 벗어난 곳을 이해하려고합니다 (오류가 R이 아닌 내 부분에 있다고 생각하기 때문에).
prototoast

1
polr()다른 기능에 대해 확인 했습니까 ? 당신은 시도 할 수 lrm()패키지 rms: lrmFit <- lrm(y ~ pop0 + inc0); predict(lrmFit, type="fitted.ind"). 또 다른 옵션은 vglm()package VGAM: vglmFit <- vglm(y ~ pop0 + inc0, family=propodds); predict(vglmFit, type="response")입니다. 둘 다 예측 된 범주 확률의 행렬을 반환합니다. 거기에서 예측 된 카테고리를 얻으려면 내 대답 을 참조하십시오 .
caracal

답변:


23

polr()MASS와이1,,,,케이엑스1,,엑스제이,,엑스polr()

로짓((와이))=ln(와이)(와이>)=β0(β1엑스1++β엑스)

^(와이)

^(와이)=이자형β^0(β^1엑스1++β^엑스)1+이자형β^0(β^1엑스1++β^엑스)

^(와이=)=^(와이)^(와이1)엑스1,엑스2와이

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

^(와이)

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.