Cara menghitung kesalahan standar dari koefisien regresi logistik

18

Saya menggunakan scikit-belajar Python untuk melatih dan menguji regresi logistik.

scikit-belajar mengembalikan koefisien regresi dari variabel independen, tetapi itu tidak memberikan kesalahan standar koefisien. Saya membutuhkan kesalahan standar ini untuk menghitung statistik Wald untuk setiap koefisien dan, pada gilirannya, membandingkan koefisien ini satu sama lain.

Saya telah menemukan satu deskripsi tentang bagaimana menghitung kesalahan standar untuk koefisien regresi logistik (di sini ), tetapi agak sulit untuk diikuti.

Jika Anda mengetahui penjelasan sederhana dan sederhana tentang cara menghitung kesalahan standar ini dan / atau dapat memberikan saya satu, saya akan sangat menghargainya! Maksud saya bukan kode spesifik (meskipun jangan ragu untuk memposting kode apa pun yang mungkin membantu), tetapi lebih merupakan penjelasan algoritmik dari langkah-langkah yang terlibat.

Gyan Veda
sumber
1
Apakah Anda meminta kode Python untuk mendapatkan kesalahan standar, atau untuk bagaimana SE dikomputasi (secara matematis / algoritmik) sehingga Anda bisa melakukannya sendiri? Jika yang pertama, Q ini akan di luar topik untuk CV (lihat pusat bantuan kami ), tetapi mungkin on-topic di Stack Overflow . Jika yang terakhir, itu akan menjadi topik di sini (tetapi Anda mungkin tidak mendapatkan saran kode). Harap edit Q Anda untuk memperjelas ini. Jika ini adalah yang pertama, kami dapat memigrasikannya ke SO untuk Anda ( tolong jangan posting-silang ).
gung - Reinstate Monica
1
Terima kasih, Gung. Saya sengaja memposting di sini karena saya mengharapkan yang terakhir, tetapi saya akan mengedit untuk menjelaskan. Saya sebutkan saya sedang bekerja di Python dengan scikit-belajar jika seseorang yang menggunakan perangkat lunak ini dapat memberi saya tips khusus untuk itu.
Gyan Veda
Hai @ GyanVeda, saya menghadapi masalah yang sama sekarang, apa solusi terakhir Anda?
zyxue

Jawaban:

12

Vβ

generic_user
sumber
1
Saya belum dapat menemukan apa pun secara online untuk case model linier umum (mungkin saya tidak tahu istilah pencarian yang tepat?). Tolong?
Kevin H. Lin
3
Ini adalah salah satu yang saya temukan setelah googling beberapa menit. Saran saya adalah pertama-tama memahami bagaimana varians parameter dihitung dalam model linier dasar. Setelah Anda mendapatkannya, ekstensi ke GLM lebih mudah. Semua sama, mengetahui cara menghitungnya dan mengetahui cara mendapatkannya dalam paket perangkat lunak bukanlah hal yang sama. www.sagepub.com/upm-data/21121_Chapter_15.pdf
generic_user
18

Kesalahan standar dari koefisien model adalah akar kuadrat dari entri diagonal dari matriks kovarians. Pertimbangkan yang berikut ini:

  • Matriks desain:

X = [1x1,1...x1,hal1x2,1...x2,hal1xn,1...xn,hal]xsaya,jjsaya

(CATATAN: Ini mengasumsikan model dengan intersep.)

  • V = [π^1(1-π^1)0...00π^2(1-π^2)...000...π^n(1-π^n)]π^sayasaya

Matriks kovarians dapat ditulis sebagai:

(XTVX)-1

Ini dapat diimplementasikan dengan kode berikut:

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)

Semua yang dikatakan, statsmodelsmungkin akan menjadi paket yang lebih baik untuk digunakan jika Anda ingin akses ke BANYAK diagnostik "out-the-box".

j_sack
sumber
2
Untuk menghindari masalah memori dan memperhitungkan kasus matriks tunggal, Anda dapat memperbarui kode Anda sebagai berikut -V = np.product(predProbs, axis=1); covLogit = np.linalg.pinv(np.dot(X_design.T * V), X_design)
steadyfish
6

Jika Anda tertarik untuk melakukan inferensi, maka Anda mungkin ingin melihat statsmodels . Kesalahan standar dan tes statistik umum tersedia. Berikut ini adalah contoh regresi logistik .

jseabold
sumber
Terima kasih untuk rekomendasinya! Saya akan melihat statsmodels. Sayang sekali scikit-learn tidak memberikan hasil seperti ini.
Gyan Veda
1
Ya. Biasanya bukan tujuan dari kotak alat tipe pembelajaran mesin untuk menyediakan alat untuk uji hipotesis (sering). Jika Anda mengalami kendala ukuran data yang tidak bekerja dengan baik di statsmodels tetapi bekerja di scikit-belajar, saya akan tertarik untuk mendengar tentang mereka di github.
jseabold
@ jseabold Namun, jika Anda ingin mendapatkan gagasan khusus tentang pentingnya fitur dalam regresi logistik, Anda tidak bisa hanya membacakan ukuran efek (koefisien) tanpa memikirkan kesalahan standarnya. Jadi, bahkan jika Anda tidak melakukan tes yang sering, dan Anda hanya ingin beberapa indikasi ukuran efek dan kekokohan, kurangnya sklearn output varians menantang.
ely