Прогнозування впорядкованого logit в R


12

Я намагаюся зробити впорядковану регресію logit. Я керую такою моделлю (просто маленька тупа модель, яка оцінює кількість фірм на ринку з мірою доходу та населення). Моє запитання щодо прогнозів.

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

Коли я запускаю передбачення (який я намагаюся використовувати для отримання прогнозованого y), результати виходять або 0, 3, або 27, що жодним чином не відображає те, що повинно бути прогнозом на основі моїх ручних прогнозів від коефіцієнта оцінки та перехоплення. Хтось знає, як отримати "точні" прогнози для моєї замовленої моделі logit?

EDIT

Щоб уточнити свою стурбованість, мої відповіді мають відповіді на всіх рівнях

>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функцією, відрізняються від тих, які ви створили вручну? Яка структура вашої залежної змінної? Наведіть приклад, який можна відтворити
Свен Хогенштайн

1
Я думаю, ви хотіли б побачити це
Blain Waan

2
Я не дуже стежу за вашою ситуацією. Ви говорите, що використовуєте порядкову регресійну модель, але ви також говорите, як я найкраще розумію, що ваша змінна відповідь - кількість фірм на ринку. Це підрахунок , це порядковий, але OLR - це не правильний спосіб моделювання цього; ви хочете використовувати якийсь варіант регресії Пуассона.
gung - Відновіть Моніку

2
@gung Так, я розумію пункт про підрахунок проти порядкових. На даний момент я намагаюся тиражувати паперові ідеї.repec.org/a/ucp/jpolec/v99y1991i5p977-1009.html, і вони використовують порядкову регресію. Я також оцінив кількість моделей, але це не допомагає мені в цьому. Крім того, ні, це не те, що я просто хочу, щоб R це робив, я намагаюся зрозуміти, де поведінка відхиляється від моїх очікувань (тому що я підозрюю, що помилка з мого боку, а не R).
прототоаст

1
Ви перевіряли polr()інші функції? Ви можете спробувати lrm()з пакету rms: lrmFit <- 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 1 , , X j , , X 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)

Передбачувані ймовірності категорії становлять . Ось відтворений приклад в R з двома предикторами . Для порядкової змінної я вирізав модельовану суцільну змінну на 4 категорії.Х1,Х2YP^(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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.