Hồi quy logistic trong R (Tỷ lệ lẻ)


40

Tôi đang cố gắng thực hiện một phân tích hồi quy logistic trong R. Tôi đã tham dự các khóa học bao gồm tài liệu này bằng STATA. Tôi thấy rất khó để nhân rộng chức năng trong R. Là nó trưởng thành trong lĩnh vực này? Dường như có ít tài liệu hoặc hướng dẫn có sẵn. Sản xuất đầu ra tỷ lệ cược dường như yêu cầu cài đặt epicalcvà / hoặc epitools/ hoặc những người khác, không ai trong số đó tôi có thể làm việc, đã lỗi thời hoặc thiếu tài liệu. Tôi đã từng glmthực hiện hồi quy logistic. Bất kỳ đề nghị sẽ được hoan nghênh.

Tôi nên làm điều này thành một câu hỏi thực sự. Làm cách nào để chạy hồi quy logistic và tạo ra tỷ lệ cược trong R?

Đây là những gì tôi đã làm cho một phân tích đơn biến:

x = glm(Outcome ~ Age, family=binomial(link="logit"))

Và cho đa biến:

y = glm(Outcome ~ Age + B + C, family=binomial(link="logit"))

Tôi đã sau đó nhìn x, y, summary(x)summary(y).

x$coefficientsgiá trị nào không?

Câu trả lời:


36

nếu bạn muốn diễn giải các hiệu ứng ước tính là tỷ lệ chênh lệch tương đối, chỉ cần làm exp(coef(x))(cung cấp cho bạn , thay đổi nhân trong tỷ lệ chênh lệch cho nếu hiệp phương sai liên quan đến tăng thêm 1). Đối với khoảng thời gian khả năng hồ sơ cho số lượng này, bạn có thể làm y = 1 βeβy=1β

require(MASS)
exp(cbind(coef(x), confint(x)))  

EDIT: @caracal đã nhanh hơn ...


1
+1 cho đề xuất của @ fabian. Một cách kém hơn để làm điều này thường mang lại các khoảng tương tự là tính khoảng thời gian trên thang đo logit và sau đó chuyển đổi sang thang tỷ lệ cược : cbind( exp(coef(x)), exp(summary(x)$coefficients[,1] - 1.96*summary(x)$coefficients[,2]), exp(summary(x)$coefficients[,1] + 1.96*summary(x)$coefficients[,2]) ). Ngoài ra còn có phương thức delta: ats.ucla.edu/stat/r/faq/deltamethod.htmlm
khóa

42

Bạn đúng rằng đầu ra của R thường chỉ chứa thông tin cần thiết và cần phải tính toán thêm.

N  <- 100               # generate some data
X1 <- rnorm(N, 175, 7)
X2 <- rnorm(N,  30, 8)
X3 <- abs(rnorm(N, 60, 30))
Y  <- 0.5*X1 - 0.3*X2 - 0.4*X3 + 10 + rnorm(N, 0, 12)

# dichotomize Y and do logistic regression
Yfac   <- cut(Y, breaks=c(-Inf, median(Y), Inf), labels=c("lo", "hi"))
glmFit <- glm(Yfac ~ X1 + X2 + X3, family=binomial(link="logit"))

coefficients()bjexp(bj)

> exp(coefficients(glmFit))
 (Intercept)           X1           X2           X3 
5.811655e-06 1.098665e+00 9.511785e-01 9.528930e-01

Để có được tỷ lệ cược, chúng ta cần có bảng phân loại chéo của DV nhị phân ban đầu và phân loại dự đoán theo một số ngưỡng xác suất cần được chọn trước tiên. Bạn cũng có thể thấy chức năng ClassLog()trong gói QuantPsyc(như chl được đề cập trong một câu hỏi liên quan ).

# predicted probabilities or: predict(glmFit, type="response")
> Yhat    <- fitted(glmFit)
> thresh  <- 0.5  # threshold for dichotomizing according to predicted probability
> YhatFac <- cut(Yhat, breaks=c(-Inf, thresh, Inf), labels=c("lo", "hi"))
> cTab    <- table(Yfac, YhatFac)    # contingency table
> addmargins(cTab)                   # marginal sums
     YhatFac
Yfac   lo  hi Sum
  lo   41   9  50
  hi   14  36  50
  Sum  55  45 100

> sum(diag(cTab)) / sum(cTab)        # percentage correct for training data
[1] 0.77

Đối với tỷ lệ cược, bạn có thể sử dụng gói vcdhoặc thực hiện tính toán thủ công.

> library(vcd)                       # for oddsratio()
> (OR <- oddsratio(cTab, log=FALSE)) # odds ratio
[1] 11.71429

> (cTab[1, 1] / cTab[1, 2]) / (cTab[2, 1] / cTab[2, 2])
[1] 11.71429

> summary(glmFit)  # test for regression parameters ...

# test for the full model against the 0-model
> glm0 <- glm(Yfac ~ 1, family=binomial(link="logit"))
> anova(glm0, glmFit, test="Chisq")
Analysis of Deviance Table
Model 1: Yfac ~ 1
Model 2: Yfac ~ X1 + X2 + X3
  Resid. Df Resid. Dev Df Deviance P(>|Chi|)    
1        99     138.63                          
2        96     110.58  3   28.045 3.554e-06 ***

2
Cảm ơn - Tôi sẽ cần xem qua câu trả lời của bạn một cách cẩn thận. Trong STATA một chỉ có thể chạy logitlogisticvà nhận odds ratios và khoảng tin cậy một cách dễ dàng. Tôi hơi thất vọng vì điều này dường như quá phức tạp và không chuẩn trong R. Tôi chỉ có thể sử dụng exp(cbind(coef(x), confint(x)))từ câu trả lời của người fabian dưới đây để lấy OD ​​và CI? Tôi không rõ câu trả lời của bạn là gì?
SabreWolfy

3
cTabexp(bj)exp(bj)Xj

4
thực sự @SabreWolfy Tôi thấy bực bội khi mọi người có thể nhấp vào một nút duy nhất trong stata / sas / spss, v.v. làm thế nào để tính toán nó / liệu nó có ý nghĩa trong một tình huống cụ thể / và (có lẽ quan trọng hơn) mà không có kiến ​​thức làm việc về ngôn ngữ.
rawr


5

Gói epiDisplay thực hiện điều này rất dễ dàng.

library(epiDisplay)
data(Wells, package="carData")
glm1 <- glm(switch~arsenic+distance+education+association, 
            family=binomial, data=Wells)
logistic.display(glm1)
Logistic regression predicting switch : yes vs no 

                       crude OR(95%CI)         adj. OR(95%CI)         P(Wald's test) P(LR-test)
arsenic (cont. var.)   1.461 (1.355,1.576)     1.595 (1.47,1.731)     < 0.001        < 0.001   

distance (cont. var.)  0.9938 (0.9919,0.9957)  0.9911 (0.989,0.9931)  < 0.001        < 0.001   

education (cont. var.) 1.04 (1.021,1.059)      1.043 (1.024,1.063)    < 0.001        < 0.001   

association: yes vs no 0.863 (0.746,0.999)     0.883 (0.759,1.027)    0.1063         0.1064    

Log-likelihood = -1953.91299
No. of observations = 3020
AIC value = 3917.82598

Có cách nào để kết hợp hiển thị logistic với trình bao bọc latex outreghay xtablekhông?
Misnomer có uy tín
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.