ฉันจะทำ F-test เพื่อเปรียบเทียบโมเดลเชิงเส้นแบบซ้อนใน Python ได้อย่างไร

ฉันต้องการเปรียบเทียบโมเดลเชิงเส้นสองแบบที่ซ้อนกัน เรียกว่า m01 และ m02 โดยที่ m01 เป็นโมเดลรีดิวซ์ และ m02 เป็นโมเดลเต็ม ฉันต้องการทำการทดสอบ F แบบง่ายๆ เพื่อดูว่ารุ่นเต็มเพิ่มประโยชน์ใช้สอยที่สำคัญมากกว่ารุ่นที่ลดลงหรือไม่

นี่เป็นเรื่องง่ายมากใน R ตัวอย่างเช่น:

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)

ให้ผลลัพธ์ต่อไปนี้แก่ฉัน:

ป้อนคำอธิบายรูปภาพที่นี่

ซึ่งบอกฉันว่าการเพิ่มคำโต้ตอบ am: wt ช่วยปรับปรุงโมเดลได้อย่างมาก มีวิธีทำสิ่งที่คล้ายกันใน Python/sklearn/statsmodels หรือไม่

แก้ไข: ฉันดูที่ คำถามนี้ ก่อนที่จะโพสต์คำถามนี้ และไม่สามารถเข้าใจได้ว่าเหมือนกันอย่างไร คำถามอีกข้อคือทำการทดสอบ F กับเวกเตอร์สองตัว คำถามนี้เกี่ยวกับการเปรียบเทียบโมเดลเชิงเส้นที่ซ้อนกัน 2 ตัว

ฉันคิดว่านี่คือสิ่งที่ฉันต้องการ:

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

แต่ไม่แน่ใจว่าจะผ่านฟังก์ชันนี้ไปอย่างไร หากใครสามารถยกตัวอย่างหรือยกตัวอย่างได้จะเป็นประโยชน์อย่างยิ่ง


person Michael Szczepaniak    schedule 21.07.2017    source แหล่งที่มา
comment
คุณสามารถลองใช้ sklearn.model_selection scikit-learn.org/stable/ modules/ จาก sklearn.feature_selection นำเข้า f_regression   -  person Mr_U4913    schedule 21.07.2017
comment
เครื่องหมายซ้ำไม่ถูกต้อง ตามที่กล่าวไว้ในการแก้ไข นี่คือการทดสอบ f สองแบบที่แตกต่างกัน   -  person Josef    schedule 21.07.2017
comment
สำหรับคำตอบ โปรดดู statsmodels anova_lm statsmodels.org/dev/anova.html เพื่อเปรียบเทียบ โมเดลที่ซ้อนกัน ผลลัพธ์ OLS ยังมีวิธี comparison_xxx_test สามวิธีสำหรับการทดสอบโดยตรงของการจำกัดแบบซ้อนกับโมเดลที่ไม่จำกัด statsmodels.org/dev/generated/   -  person Josef    schedule 21.07.2017
comment
@ user333700 ขอบคุณ เพียงแค่ต้องทำความคุ้นเคยกับรูปแบบไวยากรณ์ของสูตรนี้ ดูคล้ายกับที่ R ใช้บนพื้นผิว   -  person Michael Szczepaniak    schedule 21.07.2017
comment
@Mr_U4913 ขอบคุณครับ ฉันดูลิงก์นั้นแล้วและยังไม่ได้ตัดออก แต่ฉันแค่ต้องการเปรียบเทียบชุดของแบบจำลองที่ซ้อนกัน 2 ชุดในแต่ละครั้งเหมือนที่ฉันแสดงในตัวอย่างของฉัน model_selection กำลังทำมากกว่าที่ฉันต้องการ   -  person Michael Szczepaniak    schedule 21.07.2017
comment
f_regression เป็นฟังก์ชันที่คุณต้องการ   -  person Mr_U4913    schedule 21.07.2017


คำตอบ (2)


การปรับคำตอบของ Jeremy ในลักษณะต่อไปนี้ทำให้ฉันได้ผลลัพธ์แบบเดียวกับที่ฉันได้รับใน 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)

สิ่งนี้ให้ผลลัพธ์ต่อไปนี้แก่ฉันในสมุดบันทึก jupyter ของฉัน:

ป้อนคำอธิบายรูปภาพที่นี่

ฉันยังพบข้อผิดพลาดที่ค่อนข้างเป็นความลับเหล่านี้ด้วย:

ป้อนคำอธิบายรูปภาพที่นี่

ใครมีเบาะแสว่าอะไรทำให้เกิดข้อผิดพลาดเหล่านี้

person Michael Szczepaniak    schedule 21.11.2017
comment
นี่จะดีกว่าเป็นคำถามใหม่ คำตอบสั้นๆ: คุณสามารถเพิกเฉยต่อคำเตือนเหล่านั้นได้ ค่า F คือและควรจะเป็น nan แต่เมื่อเร็วๆ นี้ numpy และ scipy ได้เริ่มออกคำเตือนสำหรับ nan ในการแจกแจง - person Josef; 21.11.2017

ฉันพบหนังสือมีประโยชน์ ("An Introduction to Statistics with Python" / Thomas Haslwanter)

นี่คือตัวอย่างโค้ดที่เกี่ยวข้อง:

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)

ดูลิงก์หนังสือด้านบนเพื่อดูผลการพิมพ์

หมายเหตุ: anova_lm บางครั้งใช้กับพารามิเตอร์ 'typ ' ให้ลองใช้ค่าที่เป็นไปได้ที่แตกต่างกันเพื่อดูว่าค่าใดที่เหมาะกับคุณ

person Jeremy    schedule 17.11.2017
comment
+1 สำหรับการอ้างอิง นี่เป็น ANOVA ประเภทอื่น แต่ฉันสามารถปรับเปลี่ยนตัวอย่างนี้เล็กน้อยเพื่อให้ได้ผลลัพธ์ที่เหมือนกัน - person Michael Szczepaniak; 21.11.2017