Dự đoán logit theo thứ tự trong R


12

Tôi đang cố gắng thực hiện một hồi quy logit theo lệnh. Tôi đang chạy mô hình như vậy (chỉ là một mô hình nhỏ bé ngu ngốc ước tính số lượng doanh nghiệp trong một thị trường từ các biện pháp thu nhập và dân số). Câu hỏi của tôi là về dự đoán.

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

Khi tôi chạy dự đoán (mà tôi đang cố sử dụng để có được dự đoán y), các kết quả đầu ra là 0, 3 hoặc 27, điều này không phản ánh dự đoán nào có thể là dự đoán dựa trên dự đoán thủ công của tôi từ hệ số ước tính và đánh chặn. Có ai biết làm thế nào để có được dự đoán "chính xác" cho mô hình logit được đặt hàng của tôi không?

BIÊN TẬP

Để làm rõ mối quan tâm của tôi, dữ liệu phản hồi của tôi có các quan sát trên tất cả các cấp

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

nơi mà biến dự đoán của tôi dường như đang chụm lại

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

2
Điều này khá mơ hồ. Làm thế nào để các giá trị được trả về bởi predicthàm khác với các giá trị bạn đã tạo thủ công? Cấu trúc của biến phụ thuộc của bạn là gì? Vui lòng cung cấp một ví dụ tái sản xuất.
Sven Hohenstein

1
Tôi nghĩ rằng bạn sẽ muốn xem điều này- stats.stackexchange.com/questions/18119/iêu
Blain Waan

2
Tôi không theo dõi hoàn cảnh của bạn. Bạn nói rằng bạn đang sử dụng mô hình hồi quy thứ tự, nhưng bạn cũng nói, theo tôi hiểu rõ nhất, biến phản ứng của bạn là số lượng công ty trong một thị trường. Đó là một tính toán , nó là thứ tự, nhưng OLR không phải là cách phù hợp để mô hình hóa điều đó; bạn muốn sử dụng một số biến thể của hồi quy Poisson.
gung - Phục hồi Monica

2
@gung Vâng, tôi hiểu quan điểm về đếm so với thứ tự. Hiện tại, tôi đang cố gắng sao chép các ý tưởng trên giấy.repec.org/a/ucp/jpolec/v99y1991i5p977-1009.html và họ sử dụng hồi quy thứ tự. Tôi cũng đã ước tính các mô hình đếm, nhưng điều đó không giúp tôi với nhiệm vụ cụ thể này. Ngoài ra, không, không phải tôi chỉ muốn R làm điều này, tôi đang cố gắng hiểu hành vi đang đi lệch khỏi mong đợi của tôi (vì tôi nghi ngờ lỗi thuộc về mình chứ không phải R).
prototoast

1
Bạn đã xác minh polr()chống lại các chức năng khác? Bạn có thể thử lrm()từ gói rms: lrmFit <- lrm(y ~ pop0 + inc0); predict(lrmFit, type="fitted.ind"). Một tùy chọn khác là vglm()từ gói VGAM: vglmFit <- vglm(y ~ pop0 + inc0, family=propodds); predict(vglmFit, type="response"). Cả hai trả về ma trận xác suất danh mục dự đoán. Xem câu trả lời của tôi để có được các loại dự đoán từ đó.
caracal

Câu trả lời:


23

polr()MASSY1,,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)

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

Bây giờ phù hợp với mô hình tỷ lệ cược sử dụng polr()và lấy ma trận xác suất danh mục dự đoán bằng cách sử dụng 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)

So sánh với kết quả từ polr().

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

Đối với các danh mục dự đoán, predict(polr(), type="class")chỉ cần chọn - cho mỗi quan sát - danh mục có xác suất cao nhất.

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

So sánh với kết quả từ polr().

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

> all.equal(factor(categHat), facHat, check.attributes=FALSE)  # manual verification
[1] TRUE
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.