2017-07-21 4 views
0

Je veux comparer deux modèles linéaires imbriqués, appelons-les m01, et m02 où m01 est le modèle réduit et m02 est le modèle complet. Je veux faire un simple test F pour voir si le modèle complet ajoute une utilité significative sur le modèle réduit.Comment effectuer un test F pour comparer des modèles linéaires imbriqués en Python?

Ceci est très simple dans R. Par exemple:

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) 

me donne la sortie suivante:

enter image description here

Ce qui me dit que l'ajout du h: poids terme d'interaction significative améliore le modèle. Est-il possible de faire quelque chose de similaire dans Python/sklearn/statsmodels?

Modifier: J'ai regardé this question avant de poster celui-ci et ne peux pas comprendre comment ils sont identiques. L'autre question est de faire un test F sur deux vecteurs. Cette question concerne la comparaison de 2 modèles linéaires imbriqués.

Je pense que ce que je dois:

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

mais ne suis pas sûr exactement de passer cette fonction. Si quelqu'un pouvait fournir ou donner un exemple, cela serait extrêmement utile.

+1

Vous pouvez sklearn.model_selection http://scikit-learn.org/stable/modules/classes.html#module-sklearn.model_selection de f_regression import sklearn.feature_selection –

+1

la marque en double est incorrect. Comme mentionné dans le montage, ce sont deux tests f différents. – user333700

+1

pour la réponse, voir statsmodels anova_lm http://www.statsmodels.org/dev/anova.html pour comparer les modèles imbriqués, les résultats OLS ont également trois méthodes compare_xxx_test pour le test direct d'un imbriqué restreint par rapport au modèle non restreint. http://www.statsmodels.org/dev/generated/statsmodels.regression.linear_model.OLSResults.html – user333700

Répondre

0

Adaptation de la réponse de Jeremy de la façon suivante m'a permis d'obtenir le même résultat que j'ai obtenu dans 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) 

Cela m'a donné les résultats suivants dans mon carnet de jupyter:

enter image description here

J'ai également eu ces erreurs plutôt cryptiques:

enter image description here

Quelqu'un at-il une idée de ce qui génère ces erreurs?

+1

Cela serait mieux comme une nouvelle question. réponse brève: vous pouvez ignorer ces avertissements. La valeur F est et est censée être nan, mais récemment, numpy et scipy ont commencé à émettre des avertissements pour les nans dans les distributions. – user333700

1

J'ai trouvé ce book utile ("Une introduction aux statistiques avec python"/Thomas Haslwanter)

Voici l'exemple de code correspondant:

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) 

Regardez le lien du livre ci-dessus pour le résultat d'impression .

Note: anova_lm parfois utilisé avec le paramètre 'typ', essayez ses différentes valeurs possibles pour voir ce qui vous convient.

+0

+1 pour la référence. C'était un type différent d'ANOVA, mais j'ai été capable de faire de petits ajustements à cet exemple pour obtenir les mêmes résultats. –