2015-02-27 17 views
5

Utilizzando un piccolo set di dati di esempio R e l'esempio ANOVA da statsmodels, i gradi di libertà per una delle variabili sono riportati in modo diverso, & anche i risultati dei valori F sono leggermente diversi. Forse hanno approcci predefiniti leggermente diversi? Posso impostare statsmodels per utilizzare i valori predefiniti di R?Perché R e statsmodels danno risultati ANOVA leggermente diversi?

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 + Diet', data=cw).fit() 

print(sm.stats.anova_lm(cw_lm, typ=2)) 
#     sum_sq df   F   PR(>F) 
#Time  2024187.608511 1 1523.368567 9.008821e-164 
#Diet  108176.538530 1 81.411791 2.730843e-18 
#Residual 764035.638024 575   NaN   NaN 

testa e coda dei set di dati sono gli stessi *, anche significare, min, max, mediano di peso e del tempo.

+0

Quali versioni di statsmodels e panda sono stati utilizzati per questo esempio? Ricevo un errore dalla funzione anova_lm con pandas 0.18.0, statsmodels 0.6.1 –

+0

Ho appena controllato il mio attuale sistema; pandas 0.17.1, statsmodels 0.6.1, ha dovuto reinstallare Patsy ma poi andava bene. – cphlewis

+0

Grazie per il controllo. Mi sono reso conto che stavo incontrando [questo problema] (https://github.com/statsmodels/statsmodels/issues/2171) perché la mia matrice di progettazione aveva valori mancanti. –

risposta

9

Sembra che "Dieta" abbia un solo grado di libertà nel richiamo dei codici di stile, il che significa che è stato probabilmente trattato come una variabile continua mentre in R ha 3 gradi di libertà quindi probabilmente era un fattore/variabile casuale discreta.

Per rendere OLS() il trattamento di "dieta", come una variabile casuale categorica, utilizzare

cw_lm=ols('weight ~ C(Diet) + Time', data=cw).fit() 
Problemi correlati