R'deki sıralı logit'i tahmin etme


12

Düzenli bir logit regresyonu yapmaya çalışıyorum. Modeli böyle çalıştırıyorum (sadece piyasadaki firma sayısını gelir ve nüfus ölçütlerinden tahmin eden aptal küçük bir model). Benim sorum tahminlerle ilgili.

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

Tahmin çalıştırdığımda (tahmin edilen y'yi almak için kullanmaya çalışıyorum), çıktılar 0, 3 veya 27'dir, bu da hiçbir şekilde katsayıdan manuel tahminlerime dayanan tahminin ne olması gerektiğini yansıtmaz tahminler ve kesişmeler. Herkes benim sipariş logit modeli için "doğru" tahminleri almak biliyor mu?

DÜZENLE

Endişemi açıklığa kavuşturmak için, yanıt verilerimin tüm düzeylerde gözlemleri var

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

tahmin değişkenim bir araya geldiğinde

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

2
Bu oldukça belirsiz. predictİşlev tarafından döndürülen değerlerin , el ile oluşturduğunuz değerlerden farkı nedir? Bağımlı değişkeninizin yapısı nedir? Lütfen tekrarlanabilir bir örnek verin.
Sven Hohenstein

1
Sanırım bunu görmek istersiniz
Blain Waan

2
Durumunu tam olarak takip etmiyorum. Bir ordinal regresyon modeli kullandığınızı söylüyorsunuz, fakat aynı zamanda en iyi anladığım kadarıyla, tepki değişkeninizin bir piyasadaki firma sayısı olduğunu da söylüyorsunuz. Bu bir sayı , sıralı ama OLR bunu modellemenin doğru yolu değil; Poisson regresyonunun bazı varyantlarını kullanmak istiyorsunuz.
gung - Monica'yı eski durumuna döndürün

2
@gung Evet, count ile ordinal arasındaki konuyu anlıyorum. Şu anda, kağıt fikirleri çoğaltmaya çalışıyorum. Repec.org/a/ucp/jpolec/v99y1991i5p977-1009.html ve sıralı bir regresyon kullanıyorlar. Sayım modellerini de tahmin ettim, ama bu bana bu özel görevde yardımcı olmuyor. Ayrıca, hayır, sadece R'nin bunu yapmasını istemiyorum, davranışın beklentilerimden nereye saptığını anlamaya çalışıyorum (çünkü hatanın R değil benim tarafımda olduğundan şüpheleniyorum).
prototoast

1
polr()Diğer işlevlere karşı doğrulama yaptınız mı ? Sen deneyebilirsiniz lrm()paketinden rms: lrmFit <- lrm(y ~ pop0 + inc0); predict(lrmFit, type="fitted.ind"). Diğer bir seçenek ise vglm()paketinden VGAM: vglmFit <- vglm(y ~ pop0 + inc0, family=propodds); predict(vglmFit, type="response"). Her ikisi de tahmini kategori olasılık matrisini döndürür. Tahmin edilen kategorileri oradan almak için cevabımı görün .
caracal

Yanıtlar:


23

polr()Paketten kullanımdan türetilen tahminleri manuel olarak doğrulamak için MASS, kategorik bağımlı değişken ile sıralı kategoriler ve öngörücüler . orantılı oran modelini varsayar1 , , g , , k X 1 , , X j , , X pY1,,g,,kX1,,Xj,,Xppolr()

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

Diğer işlevlerde uygulanan olası seçenekler için bu cevaba bakın . Lojistik fonksiyon, logit-fonksiyonunun tersi olan tahmini olasılıkları bu nedenle olanp^(Yg)

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

Tahmin edilen kategori olasılıkları . Burada R'de iki öngörü olan tekrarlanabilir bir örnek . Sıralı bir değişkeni için, simüle edilmiş sürekli bir değişkeni 4 kategoriye ayırdım.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

Şimdi orantılı oranlar modelini kullanın polr()ve kullanarak tahmini kategori olasılık matrisini alın 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

Bu sonuçları manuel olarak doğrulamak için, parametre tahminlerini, tahmin edilen günlükleri hesaplamaktan, bu günlüklerden tahmin edilen olasılıkları hesaplamak ve daha sonra tahmin edilen kategori olasılıklarını bir matrise bağlamak gerekir .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)

Sonucuyla karşılaştırın polr().

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

Tahmin edilen kategoriler için, predict(polr(), type="class")sadece - her bir gözlem için - en yüksek olasılıklı kategoriyi seçer.

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

Sonuçtan karşılaştırın polr().

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

> all.equal(factor(categHat), facHat, check.attributes=FALSE)  # manual verification
[1] TRUE
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.