ANOVA en python utilisant pandas dataframe avec statsmodels ou scipy?
je veux utiliser la base de données Pandas pour décomposer la variance en une variable.
par exemple, si j'ai une colonne appelée "degrés", et que j'ai ceci indexé pour diverses dates, villes, et nuit vs. jour, je veux savoir quelle fraction de la variation de cette série vient de la variation transversale ville, combien vient de la variation de série temporelle, et combien vient de nuit vs. jour.
Dans Stata je voudrais utiliser Fixe effets et regardez le r^2. J'espère que ma question a du sens.
fondamentalement, ce que je veux faire, est de trouver la ventilation ANOVA de "degrés" par trois autres colonnes.
1 réponses
j'ai mis en place une comparaison directe pour les tester, constaté que leurs hypothèses peuvent légèrement différer , obtenu un indice d'un statisticien, et voici un exemple D'ANOVA sur une base de données pandas correspondant aux résultats de R:
import pandas as pd
import statsmodels.api as sm
from statsmodels.formula.api import ols
# R code on R sample dataset
#> anova(with(ChickWeight, lm(weight ~ Time + Diet)))
#Analysis of Variance Table
#
#Response: weight
# Df Sum Sq Mean Sq F value Pr(>F)
#Time 1 2042344 2042344 1576.460 < 2.2e-16 ***
#Diet 3 129876 43292 33.417 < 2.2e-16 ***
#Residuals 573 742336 1296
#write.csv(file='ChickWeight.csv', x=ChickWeight, row.names=F)
cw = pd.read_csv('ChickWeight.csv')
cw_lm=ols('weight ~ Time + C(Diet)', data=cw).fit() #Specify C for Categorical
print(sm.stats.anova_lm(cw_lm, typ=2))
# sum_sq df F PR(>F)
#C(Diet) 129876.056995 3 33.416570 6.473189e-20
#Time 2016357.148493 1 1556.400956 1.803038e-165
#Residual 742336.119560 573 NaN NaN