Логістична регресія в R (коефіцієнт коефіцієнта)


40

Я намагаюся провести логістичний регресійний аналіз R. Я відвідував курси з цього матеріалу за допомогою STATA. Мені дуже важко копіювати функціональні можливості в R. Чи дозріла вона в цій області? Здається, що документації чи керівництва мало. Вигляд коефіцієнта шансів, схоже, вимагає встановлення epicalcта / або epitoolsта / або інших, жоден з яких я не можу приступити до роботи, застарілий або не вистачає документації. Я раніше glmробив логістичну регресію. Будь-які пропозиції будуть вітатися.

Я краще ставлю це справжнім питанням. Як запустити логістичну регресію та створити коефіцієнт коефіцієнта R?

Ось що я зробив для однозначного аналізу:

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

А для багатоваріантних:

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

Я подивився на x, y, summary(x)і summary(y).

Чи x$coefficientsмає якусь цінність?

Відповіді:


36

якщо ви хочете інтерпретувати оцінені ефекти як відносні коефіцієнти шансів, просто зробіть exp(coef(x))(дає вам , мультиплікативна зміна коефіцієнта шансів для якщо коефіцієнт, пов'язаний з збільшується на 1). Для інтервалів вірогідності профілю для цієї кількості ви можете зробити y = 1 βeβy=1β

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

EDIT: @caracal було швидше ...


1
+1 для пропозиції @ fabian. Поступається спосіб зробити це , що , як правило , дає аналогічні інтервали, щоб обчислити інтервал на шкалі логіт , а потім перетворити в масштаб шансів: 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]) ). Є також метод дельти: ats.ucla.edu/stat/r/faq/deltamethod.htm
заблоковано

42

Ви маєте рацію, що вихід R зазвичай містить лише важливу інформацію, і більше потрібно розраховувати окремо.

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()дає оцінені параметри регресії . Простіше інтерпретувати хоча (крім перехоплення). e x p ( b j )bjexp(bj)

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

Щоб отримати коефіцієнт шансів, нам потрібна таблиця класифікації оригінального дихотомічного DV та прогнозована класифікація відповідно до деякого порогу ймовірності, який потрібно вибрати в першу чергу. Ви також можете побачити функцію ClassLog()в пакеті QuantPsyc(як chl, згаданий у відповідному запитанні ).

# 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

Для коефіцієнта шансів ви можете використовувати пакет vcdабо зробити розрахунок вручну.

> 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
Спасибі - мені потрібно уважно переглянути вашу відповідь. У STATA можна просто запустити logitта logisticлегко отримати коефіцієнти шансів та довірчі інтервали. Я трохи засмучений, що це здається настільки складним і нестандартним R. Чи можу я просто використати exp(cbind(coef(x), confint(x)))відповідь фабіян нижче, щоб отримати OD та CI? Мені не ясно, що дає ваша відповідь?
SabreWolfy

3
@SabreWolfy Я не був впевнений, на що АБО ти маєш на увазі: спочатку я думав, що ти маєш на увазі АБО із таблиці класифікації, яка порівнює фактичне членство в категорії з передбачуваним членством ( cTabчастина моєї відповіді). Але тепер я бачу, що ви, мабуть, маєте на увазі лише : як пояснили фабіани, дорівнює коефіцієнту, на який змінюються прогнозовані шанси, коли збільшується на 1 одиницю. Це відношення шансів "після 1-одиничного збільшення" до "до 1-одиничного збільшення". Так що так, ви можете просто використовувати відповіді фабіян. e x p ( b j ) X jexp(bj)exp(bj)Xj
каракал

4
насправді @SabreWolfy Мені шкода, що люди можуть натиснути одну кнопку в stata / sas / spss тощо та отримати коефіцієнти шансів (вставити статистику відповідних, тип III SS, що завгодно вам тут подобається), не маючи поняття, що це означає / як його обчислити / чи має значення в конкретній ситуації / і (можливо, що важливіше), не маючи робочих знань самої мови.
rawr

23

У UCLA STATs сторінка має хорошу прохідне виконання логістичної регресії в R. Вона включає в себе розділ коротко про розрахунок відносини шансів.


2
На жаль, це посилання є мертвим
Dan Chaltiel

6
На щастя, Інтернет не (завжди) забуває: web.archive.org/web/20110319043907/http://www.ats.ucla.edu/stat/…
snoram

5

Пакет epiDisplay робить це дуже легко.

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

Чи є спосіб об'єднати логістичний дисплей з латексної оболонкою , як outregабо xtable?
Шановний Misnomer
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.