Як обчислити стандартні похибки коефіцієнтів логістичної регресії


18

Я використовую науку Python для навчання та перевірки логістичної регресії.

scikit-learn повертає коефіцієнти регресії незалежних змінних, але це не забезпечує стандартних помилок коефіцієнтів. Мені потрібні ці стандартні помилки для обчислення статистики Wald для кожного коефіцієнта і, в свою чергу, порівняння цих коефіцієнтів один з одним.

Я знайшов один опис, як обчислити стандартні помилки для коефіцієнтів логістичної регресії ( тут ), але це дещо важко дотримуватися.

Якщо вам трапляється знати просте, коротке пояснення того, як обчислити ці стандартні помилки та / або можете надати мені одну, я дуже вдячний! Я не маю на увазі конкретний код (хоча не соромтеся розміщувати будь-який код, який може бути корисним), а скоріше алгоритмічне пояснення кроків.


1
Ви запитуєте код Python для отримання стандартних помилок або для того, як обчислюються SE (математично / алгоритмічно), щоб ви могли це зробити самостійно? Якщо перший, цей Q може бути поза темою для резюме (див. Наш довідковий центр ), але може бути тематичним на темі переповнення стека . Якщо останнє, це буде тематично тут (але ви не можете отримати жодних пропозицій щодо коду). Будь ласка, відредагуйте свій Q, щоб уточнити це. Якщо він є колишнім, ми можемо перенести його на SO для вас ( будь ласка, не перекладайте повідомлення на пошту ).
gung - Відновіть Моніку

1
Дякую, Гунг. Я цілеспрямовано розмістив тут, тому що очікую останнього, але редагую, щоб уточнити. Я згадав, що працюю в Python з scikit-learn на випадок, якщо хтось, хто використовує це програмне забезпечення, може дати мені конкретні поради.
Gyan Veda

Привіт @GyanVeda, я зіткнувся з тією ж проблемою зараз, яке ваше остаточне рішення, будь ласка?
zyxue

Відповіді:


12

Чи надає програмне забезпечення матриця коваріації параметрів (або дисперсії-коваріації)? Якщо так, стандартними помилками є квадратний корінь діагоналі цієї матриці. Напевно, ви хочете проконсультуватися з підручником (або google для конспектів лекцій університету) щодо того, як отримати матрицю для лінійних та узагальнених лінійних моделей.Vβ


1
Я не зміг знайти нічого в Інтернеті для узагальненого випадку лінійної моделі (можливо, я не знаю правильних пошукових термінів?). Допомога?
Кевін Х. Лін

3
Ось один, який я знайшов після кількох хвилин гуглінгу. Моя порада спочатку зрозуміти, як розраховується дисперсія параметрів у базовій лінійній моделі. Як тільки ви це отримаєте, розширення на GLM простіше. Все одно, знати, як його обчислити і знати, як отримати його в програмному пакеті - це не одне і те ж. www.sagepub.com/upm-data/21121_Chapter_15.pdf
generic_user

18

Стандартні похибки коефіцієнтів моделі - це квадратні корені діагональних записів матриці коваріації. Розглянемо наступне:

  • Дизайн-матриця:

X = [1x1,1x1,p1x2,1x2,p1xn,1xn,p]xi,jji

(ПРИМІТКА. Це передбачає модель з перехопленням.)

  • V = [π^1(1π^1)000π^2(1π^2)000π^n(1π^n)]π^ii

Коваріаційну матрицю можна записати так:

(XTVX)1

Це може бути реалізовано за допомогою наступного коду:

import numpy as np
from sklearn import linear_model

# Initiate logistic regression object
logit = linear_model.LogisticRegression()

# Fit model. Let X_train = matrix of predictors, y_train = matrix of variable.
# NOTE: Do not include a column for the intercept when fitting the model.
resLogit = logit.fit(X_train, y_train)

# Calculate matrix of predicted class probabilities.
# Check resLogit.classes_ to make sure that sklearn ordered your classes as expected
predProbs = resLogit.predict_proba(X_train)

# Design matrix -- add column of 1's at the beginning of your X_train matrix
X_design = np.hstack([np.ones((X_train.shape[0], 1)), X_train])

# Initiate matrix of 0's, fill diagonal with each predicted observation's variance
V = np.diagflat(np.product(predProbs, axis=1))

# Covariance matrix
# Note that the @-operater does matrix multiplication in Python 3.5+, so if you're running
# Python 3.5+, you can replace the covLogit-line below with the more readable:
# covLogit = np.linalg.inv(X_design.T @ V @ X_design)
covLogit = np.linalg.inv(np.dot(np.dot(X_design.T, V), X_design))
print("Covariance matrix: ", covLogit)

# Standard errors
print("Standard errors: ", np.sqrt(np.diag(covLogit)))

# Wald statistic (coefficient / s.e.) ^ 2
logitParams = np.insert(resLogit.coef_, 0, resLogit.intercept_)
print("Wald statistics: ", (logitParams / np.sqrt(np.diag(covLogit))) ** 2)

Все, що говорити, statsmodelsймовірно, буде кращим пакетом, який потрібно використовувати, якщо ви хочете отримати доступ до ЛОТИ «позабіржової» діагностики.


2
Щоб уникнути проблем із пам'яттю та врахувати регістр єдиної матриці, ви можете оновити свій код наступним чином -V = np.product(predProbs, axis=1); covLogit = np.linalg.pinv(np.dot(X_design.T * V), X_design)
стійкий

6

Якщо вам цікаво робити висновки, то, ймовірно, вам захочеться переглянути статистичні моделі . Доступні стандартні помилки та загальні статистичні тести. Ось приклад логістичної регресії .


Дякую за рекомендацію! Я перегляну статистичні моделі. Шкода, що scikit-learn не дає такого виду.
Gyan Veda

1
Так. Зазвичай це не мета металевих навчальних скриньок для створення інструментів для тестів гіпотез (часто). Якщо ви зіткнулися з обмеженнями розміру даних, які не працюють добре в статистичних моделях, але працюють в scikit-learn, мені буде цікаво дізнатися про них на github.
jseabold

@jseabold Однак, якщо ви хочете отримати якесь спеціальне поняття важливості функції в логістичній регресії, ви не можете просто зчитувати розміри ефектів (коефіцієнти), не замислюючись про їх стандартні помилки. Тож навіть якщо ви не робите тесту на частоту, і ви просто хочете визначити розміри ефекту та надійність, відсутність дисперсійного виходу є складним.
ely
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.