Сумма квадратов определяется как сумма квадратов невязок
И для получения выборочной дисперсии мы берем вышеуказанное и делим на n-1 , Ниже мы также называем это среднеквадратичной ошибкой.
Таким образом, мы используем вышеупомянутое, чтобы вычислить общую сумму квадратов, используя большое среднее значение как ybar, и это может быть разделено на объясненную сумму квадратов (ESS ) и остаточная сумма квадратов (RSS)
ESS также входит в группу SS (следовательно, пояснено), а разница между группами - RSS. Поэтому мы можем использовать что-то похожее на те функции, которые у вас есть:
def avg(group): #Average List
return float(sum(group))/len(group)
def sum_of_squares(group):
mean = avg(group)
return sum([(i-mean)**2 for i in group])
flat_list = [y for x in allgroups for y in x]
TSS = sum_of_squares(flat_list)
RSS = sum([sum_of_squares(i) for i in allgroups])
ESS = TSS - RSS
Средняя сумма квадратов - это сумма квадратов, деленная на степень свободы, которая равна n-1:
MS_explained = ESS/(len(allgroups)-1)
MS_residuals = RSS/(len(flat_list)-len(allgroups))
[MS_explained,MS_residuals]
[45.0, 1.0]
Я полагаю, что требуемая дисперсия внутри группы - MS_explained, а промежуточная - MS_residuals
Мы также можем проверить это с помощью statsmodel:
import statsmodels.api as sm
from statsmodels.formula.api import ols
import numpy as np
data = pd.DataFrame({'group':np.repeat(np.arange(4),3),'value':flat_list})
moore_lm = ols('value ~ C(group)',data=data).fit()
sm.stats.anova_lm(moore_lm, typ=1)
df sum_sq mean_sq F PR(>F)
C(group) 3.0 135.0 45.0 45.0 0.000024
Residual 8.0 8.0 1.0 NaN NaN