сумма квадратов внутри и между группами ANOVA python - PullRequest
1 голос
/ 21 марта 2020

У меня есть некоторые данные, которые выглядят так:

allgroups = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]

Я хочу вычислить сумму квадрата между и внутри группы, но я не знаю, как это сделать. Я уже рассчитал среднее, дисперсию и среднее значение. Из того, что я знаю

sswithin = sum((variance-1)*size of each list)
ssbetween = sum(((mean-grandmean)**2)*size of each list)

Вот мой код:

def avg(allgroups): #Average List
    return [float(sum(i))/len(i) for i in allgroups]
def variance(allgroups): #Variance List
    return [sum((x - sum(group) / len(group)) ** 2 for x in group) / (len(group) - 1) for group in allgroups]
def calcavg(allgroups): #Grand Average
    return float(sum(avg(allgroups)) / len(avg(allgroups)))
def size(allgroups): #Size of the sameples in list
    return [len(group) for group in allgroups]
TheAvg=avg(allgroups)
    print(TheAvg)
    Variance=variance(allgroups)
    print(Variance)
    calcAvg=calcavg(allgroups)
    print(calcAvg)
    sizeSample=size(allgroups)
    print(sizeSample)

Буду благодарен за любую помощь. P / S: я не могу использовать любую библиотеку для этой проблемы, такую ​​как numpy или statisti c.

1 Ответ

2 голосов
/ 22 марта 2020

Сумма квадратов определяется как сумма квадратов невязок

enter image description here

И для получения выборочной дисперсии мы берем вышеуказанное и делим на n-1 , Ниже мы также называем это среднеквадратичной ошибкой.

Таким образом, мы используем вышеупомянутое, чтобы вычислить общую сумму квадратов, используя большое среднее значение как ybar, и это может быть разделено на объясненную сумму квадратов (ESS ) и остаточная сумма квадратов (RSS)

enter image description here

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...