Подтвердить что ты не робот

ANOVA в python с использованием pandas dataframe с statsmodels или scipy?

Я хочу использовать dataframe Pandas для разбивки дисперсии на одну переменную.

Например, если у меня есть столбец под названием "Degrees", и я проиндексирован для разных дат, городов и ночей по сравнению с днем, я хочу узнать, какая доля вариаций в этой серии происходит от креста -раздельная вариация города, сколько исходит из вариации временных рядов, и сколько исходит от ночи против дня.

В Stata я использовал Исправленные эффекты и посмотрел на R ^ 2. Надеюсь, мой вопрос имеет смысл.

В основном, что я хочу сделать, это найти ANOVA-разбивку "градусов" на три других столбца.

4b9b3361

Ответ 1

Я установил прямое сравнение, чтобы проверить их, обнаружил, что их предположения могут немного отличаться, получили подсказку от статистиков, а здесь является примером ANOVA для pandas данных, сопоставляющих результаты 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