Memprediksi logit yang dipesan di R

12

Saya mencoba melakukan regresi logit yang dipesan. Saya menjalankan model seperti itu (hanya model kecil yang bodoh memperkirakan jumlah perusahaan di pasar dari ukuran pendapatan dan populasi). Pertanyaan saya adalah tentang prediksi.

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

Ketika saya menjalankan prediksi (yang saya coba gunakan untuk mendapatkan prediksi y), hasilnya adalah 0, 3, atau 27, yang sama sekali tidak mencerminkan apa yang seharusnya menjadi prediksi berdasarkan prediksi manual saya dari koefisien estimasi dan penyadapan. Adakah yang tahu bagaimana mendapatkan prediksi "akurat" untuk model logit yang saya pesan?

EDIT

Untuk memperjelas kekhawatiran saya, data respons saya memiliki pengamatan di semua tingkatan

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

di mana sebagai variabel prediksi saya tampaknya berkumpul

> head(table(pr_out))
pr_out
0     1   2   3   4   5 
117   0   0 114   0   0 
prototoast
sumber
2
Ini agak kabur. Bagaimana nilai yang dikembalikan oleh predictfungsi berbeda dari yang Anda hasilkan secara manual? Bagaimana struktur variabel dependen Anda? Berikan contoh yang dapat direproduksi.
Sven Hohenstein
1
Saya pikir Anda ingin melihat ini- stats.stackexchange.com/questions/18119/…
Blain Waan
2
Saya tidak cukup mengikuti situasi Anda. Anda mengatakan bahwa Anda menggunakan model regresi ordinal, tetapi Anda juga mengatakan, sejauh yang saya mengerti, bahwa variabel respons Anda adalah jumlah perusahaan di pasar. Itu adalah hitungan , itu adalah ordinal, tetapi OLR bukan cara yang tepat untuk memodelkan itu; Anda ingin menggunakan beberapa varian dari regresi Poisson.
gung - Reinstate Monica
2
@ung Ya, saya mengerti poin tentang hitungan vs ordinal. Saat ini, saya mencoba untuk mereplikasi ide - ide makalah.repec.org/a/ucp/jpolec/v99y1991i5p977-1009.html dan mereka menggunakan regresi ordinal. Saya juga memperkirakan model hitungan, tetapi itu tidak membantu saya dengan tugas khusus ini. Juga, tidak, bukan karena saya hanya ingin R melakukan ini, saya mencoba memahami di mana perilaku menyimpang dari harapan saya (karena saya menduga kesalahan ada di pihak saya, bukan R).
prototoast
1
Apakah Anda memverifikasi polr()terhadap fungsi lain? Anda bisa mencoba lrm()dari paket rms: lrmFit <- lrm(y ~ pop0 + inc0); predict(lrmFit, type="fitted.ind"). Pilihan lain adalah vglm()dari paket VGAM: vglmFit <- vglm(y ~ pop0 + inc0, family=propodds); predict(vglmFit, type="response"). Keduanya mengembalikan matriks probabilitas kategori yang diprediksi. Lihat jawaban saya untuk mendapatkan kategori yang diprediksi dari sana.
caracal

Jawaban:

23

polr()MASSY1,,g,,kX1,,Xj,,Xppolr()

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

Untuk kemungkinan pilihan yang diterapkan dalam fungsi lain, lihat jawaban ini . Fungsi logistik adalah kebalikan dari fungsi logit, sehingga probabilitas yang diprediksi adalahp^(Yg)

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

Probabilitas kategori yang diprediksi adalah . Berikut adalah contoh yang dapat direproduksi dalam R dengan dua prediktor . Untuk variabel ordinal , saya memotong variabel kontinu yang disimulasikan menjadi 4 kategori.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

Sekarang pas menggunakan model odds proporsional menggunakan polr()dan dapatkan matriks probabilitas kategori yang diprediksi menggunakan 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

Untuk memverifikasi hasil ini secara manual, kita perlu mengekstraksi estimasi parameter, dari ini menghitung log yang diprediksi, dari log ini menghitung probabilitas yang diprediksi , dan kemudian mengikat probabilitas kategori yang diprediksi ke matriks .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)

Bandingkan dengan hasil dari polr().

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

Untuk kategori yang diprediksi, predict(polr(), type="class")pilih saja - untuk setiap pengamatan - kategori dengan probabilitas tertinggi.

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

Bandingkan dengan hasil dari polr().

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

> all.equal(factor(categHat), facHat, check.attributes=FALSE)  # manual verification
[1] TRUE
caracal
sumber