Bagaimana cara melakukan uji F untuk membandingkan model linier bersarang dengan Python?

Saya ingin membandingkan dua model linier bersarang, sebut saja m01, dan m02 dengan m01 adalah model tereduksi dan m02 adalah model lengkap. Saya ingin melakukan uji F sederhana untuk melihat apakah model lengkap menambahkan utilitas yang signifikan dibandingkan model yang dikurangi.

Ini sangat sederhana di R. Misalnya:

mtcars <- read.csv("https://raw.githubusercontent.com/focods/WonderfulML/master/data/mtcars.csv")
m01 <- lm(mpg ~ am + wt, mtcars)
m02 <- lm(mpg ~ am + am:wt, mtcars)
anova(m01, m02)

Memberi saya output berikut:

masukkan deskripsi gambar di sini

Hal ini menunjukkan bahwa menambahkan istilah interaksi am: wt akan meningkatkan model secara signifikan. Apakah ada cara untuk melakukan hal serupa dengan ini di Python/sklearn/statsmodels?

Sunting: Saya melihat pertanyaan ini sebelum memposting yang ini dan tidak tahu kesamaannya. Pertanyaan lainnya adalah melakukan uji F pada dua vektor. Pertanyaan ini tentang membandingkan 2 model linier bersarang.

Saya pikir inilah yang saya butuhkan:

http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.f_regression.html#sklearn.feature_selection.f_regression

tetapi saya tidak yakin apa sebenarnya yang harus dilakukan untuk meneruskan fungsi ini. Jika ada yang bisa memberikan atau menunjukkan sebuah contoh, itu akan sangat membantu.


person Michael Szczepaniak    schedule 21.07.2017    source sumber
comment
Anda dapat mencoba sklearn.model_selection scikit-learn.org/stable/ modul/ dari sklearn.feature_selection impor f_regression   -  person Mr_U4913    schedule 21.07.2017
comment
tanda duplikatnya salah. Seperti disebutkan dalam editan, ini adalah dua uji-f yang berbeda.   -  person Josef    schedule 21.07.2017
comment
untuk jawabannya, lihat statsmodels anova_lm statsmodels.org/dev/anova.html untuk membandingkan model bersarang, hasil OLS juga memiliki tiga metode bandingkan_xxx_test untuk pengujian langsung model bersarang yang dibatasi terhadap model yang tidak dibatasi. statsmodels.org/dev/generated/   -  person Josef    schedule 21.07.2017
comment
@ pengguna333700 Terima kasih. Hanya perlu mengenal gaya sintaks rumus ini. Terlihat mirip dengan apa yang digunakan R di permukaan.   -  person Michael Szczepaniak    schedule 21.07.2017
comment
@Mr_U4913 Terima kasih. Saya melihat tautan itu dan belum mengesampingkannya, tetapi saya hanya ingin membandingkan kumpulan 2 model bersarang sekaligus seperti yang saya tunjukkan dalam contoh saya. model_selection melakukan lebih dari yang saya butuhkan.   -  person Michael Szczepaniak    schedule 21.07.2017
comment
f_regression adalah fungsi yang Anda inginkan   -  person Mr_U4913    schedule 21.07.2017


Jawaban (2)


Mengadaptasi jawaban Jeremy dengan cara berikut memungkinkan saya mendapatkan hasil yang sama dengan yang saya peroleh di R:

import pandas as pd
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm

cars_df = pd.read_csv("https://raw.githubusercontent.com/focods/WonderfulML/master/data/mtcars.csv")
m01 = ols('mpg ~ am + wt', data=cars_df).fit()
m02 = ols('mpg ~ am + wt + am:wt', data=cars_df).fit()
anovaResults = anova_lm(m01, m02)
print(anovaResults)

Ini memberi saya hasil berikut di notebook jupyter saya:

masukkan deskripsi gambar di sini

Saya juga mendapatkan kesalahan yang agak samar ini:

masukkan deskripsi gambar di sini

Adakah yang tahu apa yang menyebabkan kesalahan ini?

person Michael Szczepaniak    schedule 21.11.2017
comment
Ini akan lebih baik sebagai pertanyaan baru. jawaban singkat: Anda dapat mengabaikan peringatan itu. Nilai F adalah dan seharusnya nan, tetapi baru-baru ini numpy dan scipy mulai mengeluarkan peringatan untuk nan di distribusi. - person Josef; 21.11.2017

Saya menemukan ini buku bermanfaat ("Pengantar statistik dengan python" / Thomas Haslwanter)

Berikut adalah contoh kode yang relevan:

import pandas as pd
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm

df = pd.DataFrame(data, columns=['value', 'treatment'])
model = ols('value ~ C(treatment)', data=df).fit()
anovaResults = anova_lm(model)
print(anovaResults)

Lihat link buku di atas untuk hasil cetaknya.

Catatan: anova_lm terkadang digunakan dengan parameter 'typ ', cobalah nilai-nilai yang berbeda untuk melihat mana yang cocok untuk Anda.

person Jeremy    schedule 17.11.2017
comment
+1 untuk referensi. Ini adalah jenis ANOVA yang berbeda, namun saya dapat membuat sedikit penyesuaian pada contoh ini untuk mendapatkan hasil yang sama. - person Michael Szczepaniak; 21.11.2017