การทำนาย logit สั่งใน R


12

ฉันพยายามทำการถดถอย logit สั่ง ฉันกำลังใช้รูปแบบเช่นนั้น (เพียงแบบจำลองโง่ ๆ ประมาณจำนวน บริษัท ในตลาดจากรายรับและมาตรการประชากร) คำถามของฉันเกี่ยวกับการทำนาย

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

เมื่อฉันใช้ทำนาย (ซึ่งฉันพยายามใช้เพื่อให้ได้ค่า y ที่คาดการณ์) ผลลัพธ์จะเป็น 0, 3, หรือ 27 ซึ่งไม่มีทางที่จะสะท้อนให้เห็นถึงสิ่งที่ควรจะเป็นคำทำนายจากค่าสัมประสิทธิ์ของฉันเองจากค่าสัมประสิทธิ์ ประมาณการและดัก ไม่มีใครรู้ว่าจะได้รับการทำนาย "ถูกต้อง" สำหรับรุ่น logit ของฉันได้อย่างไร

แก้ไข

เพื่อชี้แจงข้อกังวลของฉันข้อมูลการตอบสนองของฉันมีการสังเกตในทุกระดับ

>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ฟังก์ชันแตกต่างจากค่าที่คุณสร้างขึ้นเองอย่างไร โครงสร้างของตัวแปรตามของคุณคืออะไร? โปรดให้ตัวอย่างที่ทำซ้ำได้
Sven Hohenstein

1
ฉันคิดว่าคุณต้องการเห็นสิ่งนี้
Blain Waan

2
ฉันไม่ได้ติดตามสถานการณ์ของคุณ คุณบอกว่าคุณกำลังใช้แบบจำลองการถดถอยอันดับ แต่คุณบอกว่าอย่างดีที่สุดที่ฉันเข้าใจว่าตัวแปรตอบสนองของคุณคือจำนวน บริษัท ในตลาด นั่นคือการนับมันเป็นลำดับ แต่ OLR ไม่ใช่วิธีที่ถูกต้องในการสร้างแบบจำลองนั้น คุณต้องการใช้ตัวแปรของปัวซองถดถอย
gung - Reinstate Monica

2
@ gung ใช่ฉันเข้าใจจุดเกี่ยวกับการนับ vs ลำดับ ในขณะนี้ฉันกำลังพยายามทำซ้ำกระดาษ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()จากแพคเกจ:VGAM vglmFit <- vglm(y ~ pop0 + inc0, family=propodds); predict(vglmFit, type="response")ทั้งสองคืนเมทริกซ์ของความน่าจะเป็นหมวดหมู่ที่คาดการณ์ไว้ ดูคำตอบของฉันเพื่อรับหมวดหมู่ที่คาดคะเนได้จากที่นั่น
caracal

คำตอบ:


23

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

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

p^(Yg)

พี^(Yก.)=อีβ^0ก.-(β^1X1++β^พีXพี)1+อีβ^0ก.-(β^1X1++β^พีXพี)

P^(Y=ก.)=P^(Yก.)-P^(Yก.-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

พี^(Yก.)

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.